@elnora-ai/cli 2.4.0 → 2.5.1

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 (3) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +382 -204
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -49,7 +49,7 @@ elnora setup
49
49
 
50
50
  This auto-detects which tools you have installed and configures them:
51
51
 
52
- - **Claude Code** — registers the `elnora-plugins` marketplace and enables 9 skills (`elnora-tasks`, `elnora-projects`, `elnora-files`, etc.) so you can use natural language.
52
+ - **Claude Code** — registers the `elnora-plugins` marketplace and enables 10 skills (`elnora-tasks`, `elnora-projects`, `elnora-files`, etc.) so you can use natural language.
53
53
  - **Cursor / VS Code / Codex** — writes an MCP server config pointing at `https://mcp.elnora.ai/mcp` with your API key.
54
54
 
55
55
  Target a specific tool: `elnora setup claude` · `elnora setup cursor` · `elnora setup vscode` · `elnora setup codex`.
package/dist/cli.js CHANGED
@@ -30,7 +30,7 @@ var VERSION, PRODUCTION_BASE_URL, BASE_URL, AI_SERVER_URL, PRODUCTION_MCP_URL, M
30
30
  var init_config = __esm({
31
31
  "src/lib/config.ts"() {
32
32
  "use strict";
33
- VERSION = true ? "2.4.0" : process.env.npm_package_version ?? "0.0.0-dev";
33
+ VERSION = true ? "2.5.1" : process.env.npm_package_version ?? "0.0.0-dev";
34
34
  PRODUCTION_BASE_URL = "https://platform.elnora.ai/api/v1";
35
35
  BASE_URL = process.env.ELNORA_API_URL ?? PRODUCTION_BASE_URL;
36
36
  AI_SERVER_URL = process.env.ELNORA_AI_SERVER_URL ?? "https://platform.elnora.ai/ai-server";
@@ -51,6 +51,9 @@ var init_config = __esm({
51
51
  tasks: "/tasks",
52
52
  task: "/tasks/{id}",
53
53
  task_messages: "/tasks/{id}/messages",
54
+ task_unarchive: "/tasks/{id}/unarchive",
55
+ task_attachments: "/tasks/{id}/attachments",
56
+ task_attachment_content: "/tasks/{id}/attachments/{aid}/content",
54
57
  // Files
55
58
  files: "/files",
56
59
  file: "/files/{id}",
@@ -74,7 +77,9 @@ var init_config = __esm({
74
77
  // Folders (closure-table Knowledge Base — the `folder`/`folder_move` paths are shared with the
75
78
  // legacy controller; the KB read/mutation verbs are distinguished by HTTP method at the call site)
76
79
  folder: "/folders/{id}",
80
+ folder_create: "/folders",
77
81
  folder_move: "/folders/{id}/move",
82
+ folder_archive: "/folders/{id}/archive",
78
83
  folders_files: "/folders/files",
79
84
  folder_roots: "/folders/roots",
80
85
  folder_children: "/folders/{id}/children",
@@ -95,6 +100,7 @@ var init_config = __esm({
95
100
  organizations_all: "/organizations/all",
96
101
  org_files: "/organizations/{orgId}/files",
97
102
  org_member_directory: "/organizations/{orgId}/members/directory",
103
+ org_kb_autotidy: "/organizations/{orgId}/kb-autotidy",
98
104
  // Organization invitations
99
105
  org_invitations: "/organizations/{orgId}/invitations",
100
106
  org_invitation: "/organizations/{orgId}/invitations/{invId}",
@@ -106,6 +112,10 @@ var init_config = __esm({
106
112
  library_files: "/organizations/{orgId}/library/files",
107
113
  library_folders: "/organizations/{orgId}/library/folders",
108
114
  library_folder: "/organizations/{orgId}/library/folders/{id}",
115
+ // Knowledge Base review queue
116
+ kb_review_items: "/kb-review-items",
117
+ kb_review_approve: "/kb-review-items/{id}/approve",
118
+ kb_review_reject: "/kb-review-items/{id}/reject",
109
119
  // Search
110
120
  search_tasks: "/search/tasks",
111
121
  search_files: "/search/files",
@@ -1829,6 +1839,7 @@ var EXPECTED_SKILLS = [
1829
1839
  "elnora-orgs",
1830
1840
  "elnora-platform",
1831
1841
  "elnora-projects",
1842
+ "elnora-review",
1832
1843
  "elnora-search",
1833
1844
  "elnora-tasks"
1834
1845
  ];
@@ -4296,22 +4307,23 @@ var foldersChildren = {
4296
4307
  // src/commands/folders/create.ts
4297
4308
  import { z as z51 } from "zod";
4298
4309
  var inputSchema49 = z51.object({
4299
- projectId: z51.string().uuid().describe("Project ID"),
4300
4310
  name: z51.string().min(1).describe("Folder name"),
4301
- parentId: z51.string().uuid().optional().describe("Parent folder ID")
4311
+ parentId: z51.string().uuid().optional().describe("Parent folder ID (for nesting)"),
4312
+ project: z51.string().uuid().optional().describe("Legacy: create a project-scoped folder in this project instead of a Knowledge Base folder")
4302
4313
  });
4303
4314
  var foldersCreate = {
4304
4315
  name: "folders.create",
4305
4316
  group: "folders",
4306
- description: "Create a new folder in a project",
4317
+ description: "Create a Knowledge Base folder (or a legacy project folder when project is set)",
4307
4318
  inputSchema: inputSchema49,
4308
4319
  outputSchema: z51.any(),
4309
4320
  async execute(input, ctx) {
4310
4321
  const body = { name: input.name };
4311
- if (input.parentId) body.parentId = input.parentId;
4312
- return ctx.client.post("project_folders", body, {
4313
- pathParams: { id: input.projectId }
4314
- });
4322
+ if (input.parentId) body.parentFolderId = input.parentId;
4323
+ if (input.project) {
4324
+ return ctx.client.post("project_folders", body, { pathParams: { id: input.project } });
4325
+ }
4326
+ return ctx.client.post("folder_create", body);
4315
4327
  },
4316
4328
  formatOutput(output, format) {
4317
4329
  if (format === "compact") return output.id ?? JSON.stringify(output);
@@ -4322,20 +4334,24 @@ var foldersCreate = {
4322
4334
  // src/commands/folders/delete.ts
4323
4335
  import { z as z52 } from "zod";
4324
4336
  var inputSchema50 = z52.object({
4325
- folderId: z52.string().uuid().describe("Folder ID to delete")
4337
+ folderId: z52.string().uuid().describe("Folder ID to delete"),
4338
+ legacy: z52.boolean().default(false).describe("Hard-delete a legacy project folder instead of archiving a Knowledge Base folder")
4326
4339
  });
4327
4340
  var foldersDelete = {
4328
4341
  name: "folders.delete",
4329
4342
  group: "folders",
4330
- description: "Delete a folder",
4343
+ description: "Delete a folder (Knowledge Base folders are archived)",
4331
4344
  inputSchema: inputSchema50,
4332
4345
  outputSchema: z52.any(),
4333
4346
  annotations: { destructiveHint: true },
4334
4347
  async execute(input, ctx) {
4335
- await ctx.client.del("folder", {
4336
- pathParams: { id: input.folderId }
4337
- });
4338
- return { deleted: true, folderId: input.folderId };
4348
+ const opts = { pathParams: { id: input.folderId } };
4349
+ if (input.legacy) {
4350
+ await ctx.client.del("folder", opts);
4351
+ return { deleted: true, folderId: input.folderId };
4352
+ }
4353
+ await ctx.client.post("folder_archive", {}, opts);
4354
+ return { archived: true, folderId: input.folderId };
4339
4355
  },
4340
4356
  formatOutput(output, format) {
4341
4357
  if (format === "compact") return output.folderId;
@@ -4420,7 +4436,8 @@ import { z as z56 } from "zod";
4420
4436
  var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4421
4437
  var inputSchema54 = z56.object({
4422
4438
  folderId: z56.string().uuid().describe("Folder ID to move"),
4423
- parentId: z56.string().min(1).describe("Target parent folder ID, or 'root' to move to project root")
4439
+ parentId: z56.string().min(1).describe("Target parent folder ID, or 'root' to move to the top level"),
4440
+ legacy: z56.boolean().default(false).describe("Move a legacy project folder instead of a Knowledge Base folder")
4424
4441
  });
4425
4442
  var foldersMove = {
4426
4443
  name: "folders.move",
@@ -4429,24 +4446,21 @@ var foldersMove = {
4429
4446
  inputSchema: inputSchema54,
4430
4447
  outputSchema: z56.any(),
4431
4448
  async execute(input, ctx) {
4432
- let parentValue;
4433
- if (input.parentId === "root") {
4434
- parentValue = null;
4435
- } else if (UUID_RE.test(input.parentId)) {
4436
- parentValue = input.parentId;
4437
- } else {
4449
+ const isRoot = input.parentId === "root";
4450
+ if (!isRoot && !UUID_RE.test(input.parentId)) {
4438
4451
  throw new ValidationError(
4439
4452
  "parent must be a valid UUID or 'root'.",
4440
4453
  "Provide a folder UUID or the literal string 'root'."
4441
4454
  );
4442
4455
  }
4443
- return ctx.client.put(
4444
- "folder_move",
4445
- { parentId: parentValue },
4446
- {
4447
- pathParams: { id: input.folderId }
4448
- }
4449
- );
4456
+ const opts = { pathParams: { id: input.folderId } };
4457
+ if (input.legacy) {
4458
+ return ctx.client.put("folder_move", { newParentFolderId: isRoot ? null : input.parentId }, opts);
4459
+ }
4460
+ if (isRoot) {
4461
+ return ctx.client.patch("folder", { moveToRoot: true }, opts);
4462
+ }
4463
+ return ctx.client.patch("folder_move", { parentFolderId: input.parentId }, opts);
4450
4464
  },
4451
4465
  formatOutput(output, format) {
4452
4466
  if (format === "compact") return output.id ?? JSON.stringify(output);
@@ -4458,7 +4472,8 @@ var foldersMove = {
4458
4472
  import { z as z57 } from "zod";
4459
4473
  var inputSchema55 = z57.object({
4460
4474
  folderId: z57.string().uuid().describe("Folder ID"),
4461
- name: z57.string().min(1).describe("New folder name")
4475
+ name: z57.string().min(1).describe("New folder name"),
4476
+ legacy: z57.boolean().default(false).describe("Rename a legacy project folder instead of a Knowledge Base folder")
4462
4477
  });
4463
4478
  var foldersRename = {
4464
4479
  name: "folders.rename",
@@ -4468,13 +4483,9 @@ var foldersRename = {
4468
4483
  outputSchema: z57.any(),
4469
4484
  annotations: { idempotentHint: true },
4470
4485
  async execute(input, ctx) {
4471
- return ctx.client.put(
4472
- "folder",
4473
- { name: input.name },
4474
- {
4475
- pathParams: { id: input.folderId }
4476
- }
4477
- );
4486
+ const body = { name: input.name };
4487
+ const opts = { pathParams: { id: input.folderId } };
4488
+ return input.legacy ? ctx.client.put("folder", body, opts) : ctx.client.patch("folder", body, opts);
4478
4489
  },
4479
4490
  formatOutput(output, format) {
4480
4491
  if (format === "compact") return output.id ?? JSON.stringify(output);
@@ -5153,17 +5164,39 @@ var orgsResendInvite = {
5153
5164
  }
5154
5165
  };
5155
5166
 
5156
- // src/commands/orgs/set-default.ts
5167
+ // src/commands/orgs/set-autotidy.ts
5157
5168
  import { z as z84 } from "zod";
5158
5169
  var inputSchema81 = z84.object({
5159
- orgId: z84.string().uuid().describe("Organization ID to set as default")
5170
+ orgId: z84.string().uuid().describe("Organization ID"),
5171
+ enabled: z84.boolean().default(false).describe("Enable Knowledge Base auto-tidy (omit to disable)")
5172
+ });
5173
+ var orgsSetAutotidy = {
5174
+ name: "orgs.setAutotidy",
5175
+ group: "orgs",
5176
+ description: "Enable or disable Knowledge Base auto-tidy for an organization",
5177
+ inputSchema: inputSchema81,
5178
+ outputSchema: z84.any(),
5179
+ annotations: { idempotentHint: true },
5180
+ async execute(input, ctx) {
5181
+ return ctx.client.patch("org_kb_autotidy", { enabled: input.enabled }, { pathParams: { orgId: input.orgId } });
5182
+ },
5183
+ formatOutput(output, format) {
5184
+ if (format === "compact") return JSON.stringify(output);
5185
+ return JSON.stringify(output, null, 2);
5186
+ }
5187
+ };
5188
+
5189
+ // src/commands/orgs/set-default.ts
5190
+ import { z as z85 } from "zod";
5191
+ var inputSchema82 = z85.object({
5192
+ orgId: z85.string().uuid().describe("Organization ID to set as default")
5160
5193
  });
5161
5194
  var orgsSetDefault = {
5162
5195
  name: "orgs.setDefault",
5163
5196
  group: "orgs",
5164
5197
  description: "Set an organization as the default",
5165
- inputSchema: inputSchema81,
5166
- outputSchema: z84.any(),
5198
+ inputSchema: inputSchema82,
5199
+ outputSchema: z85.any(),
5167
5200
  annotations: { idempotentHint: true },
5168
5201
  async execute(input, ctx) {
5169
5202
  return ctx.client.put("organization_set_default", void 0, {
@@ -5177,17 +5210,17 @@ var orgsSetDefault = {
5177
5210
  };
5178
5211
 
5179
5212
  // src/commands/orgs/set-stripe.ts
5180
- import { z as z85 } from "zod";
5181
- var inputSchema82 = z85.object({
5182
- orgId: z85.string().uuid().describe("Organization ID"),
5183
- stripeCustomerId: z85.string().min(1).describe("Stripe customer ID (e.g. cus_xxx)")
5213
+ import { z as z86 } from "zod";
5214
+ var inputSchema83 = z86.object({
5215
+ orgId: z86.string().uuid().describe("Organization ID"),
5216
+ stripeCustomerId: z86.string().min(1).describe("Stripe customer ID (e.g. cus_xxx)")
5184
5217
  });
5185
5218
  var orgsSetStripe = {
5186
5219
  name: "orgs.setStripe",
5187
5220
  group: "orgs",
5188
5221
  description: "Set the Stripe customer ID for an organization",
5189
- inputSchema: inputSchema82,
5190
- outputSchema: z85.any(),
5222
+ inputSchema: inputSchema83,
5223
+ outputSchema: z86.any(),
5191
5224
  annotations: { idempotentHint: true },
5192
5225
  async execute(input, ctx) {
5193
5226
  return ctx.client.put(
@@ -5204,18 +5237,18 @@ var orgsSetStripe = {
5204
5237
 
5205
5238
  // src/commands/orgs/update.ts
5206
5239
  init_errors();
5207
- import { z as z86 } from "zod";
5208
- var inputSchema83 = z86.object({
5209
- orgId: z86.string().uuid().describe("Organization ID"),
5210
- name: z86.string().min(1).optional().describe("New organization name"),
5211
- description: z86.string().optional().describe("New organization description")
5240
+ import { z as z87 } from "zod";
5241
+ var inputSchema84 = z87.object({
5242
+ orgId: z87.string().uuid().describe("Organization ID"),
5243
+ name: z87.string().min(1).optional().describe("New organization name"),
5244
+ description: z87.string().optional().describe("New organization description")
5212
5245
  });
5213
5246
  var orgsUpdate = {
5214
5247
  name: "orgs.update",
5215
5248
  group: "orgs",
5216
5249
  description: "Update an existing organization",
5217
- inputSchema: inputSchema83,
5218
- outputSchema: z86.any(),
5250
+ inputSchema: inputSchema84,
5251
+ outputSchema: z87.any(),
5219
5252
  annotations: { idempotentHint: true },
5220
5253
  async execute(input, ctx) {
5221
5254
  const { orgId, ...fields } = input;
@@ -5236,18 +5269,18 @@ var orgsUpdate = {
5236
5269
  };
5237
5270
 
5238
5271
  // src/commands/orgs/update-role.ts
5239
- import { z as z87 } from "zod";
5240
- var inputSchema84 = z87.object({
5241
- orgId: z87.string().uuid().describe("Organization ID"),
5242
- membershipId: z87.string().uuid().describe("Membership ID of the member"),
5243
- role: z87.string().min(1).describe("New role to assign")
5272
+ import { z as z88 } from "zod";
5273
+ var inputSchema85 = z88.object({
5274
+ orgId: z88.string().uuid().describe("Organization ID"),
5275
+ membershipId: z88.string().uuid().describe("Membership ID of the member"),
5276
+ role: z88.string().min(1).describe("New role to assign")
5244
5277
  });
5245
5278
  var orgsUpdateRole = {
5246
5279
  name: "orgs.updateRole",
5247
5280
  group: "orgs",
5248
5281
  description: "Update an organization member's role",
5249
- inputSchema: inputSchema84,
5250
- outputSchema: z87.any(),
5282
+ inputSchema: inputSchema85,
5283
+ outputSchema: z88.any(),
5251
5284
  annotations: { idempotentHint: true },
5252
5285
  async execute(input, ctx) {
5253
5286
  return ctx.client.put(
@@ -5284,23 +5317,24 @@ function registerOrgCommands() {
5284
5317
  orgsAcceptInvite,
5285
5318
  orgsFiles,
5286
5319
  orgsListAll,
5287
- orgsDirectory
5320
+ orgsDirectory,
5321
+ orgsSetAutotidy
5288
5322
  ];
5289
5323
  }
5290
5324
 
5291
5325
  // src/commands/projects/add-member.ts
5292
- import { z as z88 } from "zod";
5293
- var inputSchema85 = z88.object({
5294
- projectId: z88.string().uuid().describe("Project ID"),
5295
- userId: z88.string().uuid().describe("User ID to add"),
5296
- role: z88.string().default("Member").describe("Role to assign (default: Member)")
5326
+ import { z as z89 } from "zod";
5327
+ var inputSchema86 = z89.object({
5328
+ projectId: z89.string().uuid().describe("Project ID"),
5329
+ userId: z89.string().uuid().describe("User ID to add"),
5330
+ role: z89.string().default("Member").describe("Role to assign (default: Member)")
5297
5331
  });
5298
5332
  var projectsAddMember = {
5299
5333
  name: "projects.addMember",
5300
5334
  group: "projects",
5301
5335
  description: "Add a member to a project",
5302
- inputSchema: inputSchema85,
5303
- outputSchema: z88.any(),
5336
+ inputSchema: inputSchema86,
5337
+ outputSchema: z89.any(),
5304
5338
  async execute(input, ctx) {
5305
5339
  return ctx.client.post(
5306
5340
  "project_members",
@@ -5315,16 +5349,16 @@ var projectsAddMember = {
5315
5349
  };
5316
5350
 
5317
5351
  // src/commands/projects/archive.ts
5318
- import { z as z89 } from "zod";
5319
- var inputSchema86 = z89.object({
5320
- projectId: z89.string().uuid().describe("Project ID to archive")
5352
+ import { z as z90 } from "zod";
5353
+ var inputSchema87 = z90.object({
5354
+ projectId: z90.string().uuid().describe("Project ID to archive")
5321
5355
  });
5322
5356
  var projectsArchive = {
5323
5357
  name: "projects.archive",
5324
5358
  group: "projects",
5325
5359
  description: "Archive (delete) a project",
5326
- inputSchema: inputSchema86,
5327
- outputSchema: z89.any(),
5360
+ inputSchema: inputSchema87,
5361
+ outputSchema: z90.any(),
5328
5362
  annotations: { destructiveHint: true },
5329
5363
  async execute(input, ctx) {
5330
5364
  await ctx.client.del("project", {
@@ -5339,18 +5373,18 @@ var projectsArchive = {
5339
5373
  };
5340
5374
 
5341
5375
  // src/commands/projects/create.ts
5342
- import { z as z90 } from "zod";
5343
- var inputSchema87 = z90.object({
5344
- name: z90.string().min(1).describe("Project name"),
5345
- description: z90.string().optional().describe("Project description"),
5346
- icon: z90.string().optional().describe("Project icon")
5376
+ import { z as z91 } from "zod";
5377
+ var inputSchema88 = z91.object({
5378
+ name: z91.string().min(1).describe("Project name"),
5379
+ description: z91.string().optional().describe("Project description"),
5380
+ icon: z91.string().optional().describe("Project icon")
5347
5381
  });
5348
5382
  var projectsCreate = {
5349
5383
  name: "projects.create",
5350
5384
  group: "projects",
5351
5385
  description: "Create a new project",
5352
- inputSchema: inputSchema87,
5353
- outputSchema: z90.any(),
5386
+ inputSchema: inputSchema88,
5387
+ outputSchema: z91.any(),
5354
5388
  async execute(input, ctx) {
5355
5389
  return ctx.client.post("projects", input);
5356
5390
  },
@@ -5361,16 +5395,16 @@ var projectsCreate = {
5361
5395
  };
5362
5396
 
5363
5397
  // src/commands/projects/get.ts
5364
- import { z as z91 } from "zod";
5365
- var inputSchema88 = z91.object({
5366
- projectId: z91.string().uuid().describe("Project ID")
5398
+ import { z as z92 } from "zod";
5399
+ var inputSchema89 = z92.object({
5400
+ projectId: z92.string().uuid().describe("Project ID")
5367
5401
  });
5368
5402
  var projectsGet = {
5369
5403
  name: "projects.get",
5370
5404
  group: "projects",
5371
5405
  description: "Get details of a specific project",
5372
- inputSchema: inputSchema88,
5373
- outputSchema: z91.any(),
5406
+ inputSchema: inputSchema89,
5407
+ outputSchema: z92.any(),
5374
5408
  annotations: { readOnlyHint: true },
5375
5409
  async execute(input, ctx) {
5376
5410
  return ctx.client.get("project", {
@@ -5384,16 +5418,16 @@ var projectsGet = {
5384
5418
  };
5385
5419
 
5386
5420
  // src/commands/projects/leave.ts
5387
- import { z as z92 } from "zod";
5388
- var inputSchema89 = z92.object({
5389
- projectId: z92.string().uuid().describe("Project ID to leave")
5421
+ import { z as z93 } from "zod";
5422
+ var inputSchema90 = z93.object({
5423
+ projectId: z93.string().uuid().describe("Project ID to leave")
5390
5424
  });
5391
5425
  var projectsLeave = {
5392
5426
  name: "projects.leave",
5393
5427
  group: "projects",
5394
5428
  description: "Leave a project",
5395
- inputSchema: inputSchema89,
5396
- outputSchema: z92.any(),
5429
+ inputSchema: inputSchema90,
5430
+ outputSchema: z93.any(),
5397
5431
  annotations: { destructiveHint: true },
5398
5432
  async execute(input, ctx) {
5399
5433
  return ctx.client.post("project_leave", void 0, {
@@ -5407,16 +5441,16 @@ var projectsLeave = {
5407
5441
  };
5408
5442
 
5409
5443
  // src/commands/projects/list.ts
5410
- import { z as z93 } from "zod";
5411
- var inputSchema90 = z93.object({
5444
+ import { z as z94 } from "zod";
5445
+ var inputSchema91 = z94.object({
5412
5446
  ...paginationInput
5413
5447
  });
5414
5448
  var projectsList = {
5415
5449
  name: "projects.list",
5416
5450
  group: "projects",
5417
5451
  description: "List all projects accessible to the current user",
5418
- inputSchema: inputSchema90,
5419
- outputSchema: z93.any(),
5452
+ inputSchema: inputSchema91,
5453
+ outputSchema: z94.any(),
5420
5454
  annotations: { readOnlyHint: true },
5421
5455
  async execute(input, ctx) {
5422
5456
  return ctx.client.get("projects", {
@@ -5430,16 +5464,16 @@ var projectsList = {
5430
5464
  };
5431
5465
 
5432
5466
  // src/commands/projects/members.ts
5433
- import { z as z94 } from "zod";
5434
- var inputSchema91 = z94.object({
5435
- projectId: z94.string().uuid().describe("Project ID")
5467
+ import { z as z95 } from "zod";
5468
+ var inputSchema92 = z95.object({
5469
+ projectId: z95.string().uuid().describe("Project ID")
5436
5470
  });
5437
5471
  var projectsMembers = {
5438
5472
  name: "projects.members",
5439
5473
  group: "projects",
5440
5474
  description: "List members of a project",
5441
- inputSchema: inputSchema91,
5442
- outputSchema: z94.any(),
5475
+ inputSchema: inputSchema92,
5476
+ outputSchema: z95.any(),
5443
5477
  annotations: { readOnlyHint: true },
5444
5478
  async execute(input, ctx) {
5445
5479
  return ctx.client.get("project_members", {
@@ -5453,17 +5487,17 @@ var projectsMembers = {
5453
5487
  };
5454
5488
 
5455
5489
  // src/commands/projects/remove-member.ts
5456
- import { z as z95 } from "zod";
5457
- var inputSchema92 = z95.object({
5458
- projectId: z95.string().uuid().describe("Project ID"),
5459
- userId: z95.string().uuid().describe("User ID to remove")
5490
+ import { z as z96 } from "zod";
5491
+ var inputSchema93 = z96.object({
5492
+ projectId: z96.string().uuid().describe("Project ID"),
5493
+ userId: z96.string().uuid().describe("User ID to remove")
5460
5494
  });
5461
5495
  var projectsRemoveMember = {
5462
5496
  name: "projects.removeMember",
5463
5497
  group: "projects",
5464
5498
  description: "Remove a member from a project",
5465
- inputSchema: inputSchema92,
5466
- outputSchema: z95.any(),
5499
+ inputSchema: inputSchema93,
5500
+ outputSchema: z96.any(),
5467
5501
  annotations: { destructiveHint: true },
5468
5502
  async execute(input, ctx) {
5469
5503
  await ctx.client.del("project_member", {
@@ -5479,19 +5513,19 @@ var projectsRemoveMember = {
5479
5513
 
5480
5514
  // src/commands/projects/update.ts
5481
5515
  init_errors();
5482
- import { z as z96 } from "zod";
5483
- var inputSchema93 = z96.object({
5484
- projectId: z96.string().uuid().describe("Project ID"),
5485
- name: z96.string().min(1).optional().describe("New project name"),
5486
- description: z96.string().optional().describe("New project description"),
5487
- icon: z96.string().optional().describe("New project icon")
5516
+ import { z as z97 } from "zod";
5517
+ var inputSchema94 = z97.object({
5518
+ projectId: z97.string().uuid().describe("Project ID"),
5519
+ name: z97.string().min(1).optional().describe("New project name"),
5520
+ description: z97.string().optional().describe("New project description"),
5521
+ icon: z97.string().optional().describe("New project icon")
5488
5522
  });
5489
5523
  var projectsUpdate = {
5490
5524
  name: "projects.update",
5491
5525
  group: "projects",
5492
5526
  description: "Update an existing project",
5493
- inputSchema: inputSchema93,
5494
- outputSchema: z96.any(),
5527
+ inputSchema: inputSchema94,
5528
+ outputSchema: z97.any(),
5495
5529
  annotations: { idempotentHint: true },
5496
5530
  async execute(input, ctx) {
5497
5531
  const { projectId, ...fields } = input;
@@ -5512,18 +5546,18 @@ var projectsUpdate = {
5512
5546
  };
5513
5547
 
5514
5548
  // src/commands/projects/update-role.ts
5515
- import { z as z97 } from "zod";
5516
- var inputSchema94 = z97.object({
5517
- projectId: z97.string().uuid().describe("Project ID"),
5518
- userId: z97.string().uuid().describe("User ID of the member"),
5519
- role: z97.string().min(1).describe("New role to assign")
5549
+ import { z as z98 } from "zod";
5550
+ var inputSchema95 = z98.object({
5551
+ projectId: z98.string().uuid().describe("Project ID"),
5552
+ userId: z98.string().uuid().describe("User ID of the member"),
5553
+ role: z98.string().min(1).describe("New role to assign")
5520
5554
  });
5521
5555
  var projectsUpdateRole = {
5522
5556
  name: "projects.updateRole",
5523
5557
  group: "projects",
5524
5558
  description: "Update a project member's role",
5525
- inputSchema: inputSchema94,
5526
- outputSchema: z97.any(),
5559
+ inputSchema: inputSchema95,
5560
+ outputSchema: z98.any(),
5527
5561
  annotations: { idempotentHint: true },
5528
5562
  async execute(input, ctx) {
5529
5563
  return ctx.client.put(
@@ -5555,19 +5589,19 @@ function registerProjectCommands() {
5555
5589
  }
5556
5590
 
5557
5591
  // src/commands/protocols/generate.ts
5558
- import { z as z98 } from "zod";
5559
- var inputSchema95 = z98.object({
5560
- description: z98.string().min(10).max(5e3).describe("Protocol description"),
5561
- title: z98.string().max(200).optional().describe("Task title (defaults to first 100 chars of description)"),
5562
- project: z98.string().uuid().optional().describe("Project UUID to associate with")
5592
+ import { z as z99 } from "zod";
5593
+ var inputSchema96 = z99.object({
5594
+ description: z99.string().min(10).max(5e3).describe("Protocol description"),
5595
+ title: z99.string().max(200).optional().describe("Task title (defaults to first 100 chars of description)"),
5596
+ project: z99.string().uuid().optional().describe("Project UUID to associate with")
5563
5597
  });
5564
5598
  var protocolsGenerate = {
5565
5599
  name: "protocols.generate",
5566
5600
  group: "protocols",
5567
5601
  description: "Generate a bioprotocol \u2014 creates a task and sends the description in one call. Returns the task and the queued user message, NOT the AI response; the agent processes asynchronously. To get the generated protocol, poll elnora_tasks_messages with the returned task id every 5-10s until the last message has role 'assistant' with metadata.status 'completed'. Timeout after 5 min.",
5568
5602
  stdinField: "description",
5569
- inputSchema: inputSchema95,
5570
- outputSchema: z98.any(),
5603
+ inputSchema: inputSchema96,
5604
+ outputSchema: z99.any(),
5571
5605
  annotations: { mcpScopes: ["tasks:write", "messages:write"] },
5572
5606
  async execute(input, ctx) {
5573
5607
  const body = { title: input.title || input.description.slice(0, 100) };
@@ -5600,10 +5634,77 @@ function registerProtocolCommands() {
5600
5634
  return [protocolsGenerate];
5601
5635
  }
5602
5636
 
5637
+ // src/commands/review/approve.ts
5638
+ import { z as z100 } from "zod";
5639
+ var inputSchema97 = z100.object({
5640
+ itemId: z100.string().uuid().describe("Review item ID")
5641
+ });
5642
+ var reviewApprove = {
5643
+ name: "review.approve",
5644
+ group: "review",
5645
+ description: "Approve a Knowledge Base review item, applying its proposed change",
5646
+ inputSchema: inputSchema97,
5647
+ outputSchema: z100.any(),
5648
+ async execute(input, ctx) {
5649
+ return ctx.client.post("kb_review_approve", {}, { pathParams: { id: input.itemId } });
5650
+ },
5651
+ formatOutput(output, format) {
5652
+ if (format === "compact") return output.id ?? JSON.stringify(output);
5653
+ return JSON.stringify(output, null, 2);
5654
+ }
5655
+ };
5656
+
5657
+ // src/commands/review/list.ts
5658
+ import { z as z101 } from "zod";
5659
+ var inputSchema98 = z101.object({
5660
+ status: z101.enum(["pending", "applied", "rejected", "all"]).default("pending").describe("Filter by review status ('all' lists every state)")
5661
+ });
5662
+ var reviewList = {
5663
+ name: "review.list",
5664
+ group: "review",
5665
+ description: "List the Knowledge Base review queue (auto-tidy proposals awaiting approval)",
5666
+ inputSchema: inputSchema98,
5667
+ outputSchema: z101.any(),
5668
+ annotations: { readOnlyHint: true },
5669
+ async execute(input, ctx) {
5670
+ const status = input.status === "all" ? "" : input.status;
5671
+ return ctx.client.get("kb_review_items", { queryParams: { status } });
5672
+ },
5673
+ formatOutput(output, format) {
5674
+ if (format === "compact") return output.id ?? JSON.stringify(output);
5675
+ return JSON.stringify(output, null, 2);
5676
+ }
5677
+ };
5678
+
5679
+ // src/commands/review/reject.ts
5680
+ import { z as z102 } from "zod";
5681
+ var inputSchema99 = z102.object({
5682
+ itemId: z102.string().uuid().describe("Review item ID")
5683
+ });
5684
+ var reviewReject = {
5685
+ name: "review.reject",
5686
+ group: "review",
5687
+ description: "Reject a Knowledge Base review item without applying its change",
5688
+ inputSchema: inputSchema99,
5689
+ outputSchema: z102.any(),
5690
+ async execute(input, ctx) {
5691
+ return ctx.client.post("kb_review_reject", {}, { pathParams: { id: input.itemId } });
5692
+ },
5693
+ formatOutput(output, format) {
5694
+ if (format === "compact") return output.id ?? JSON.stringify(output);
5695
+ return JSON.stringify(output, null, 2);
5696
+ }
5697
+ };
5698
+
5699
+ // src/commands/review/index.ts
5700
+ function registerReviewCommands() {
5701
+ return [reviewList, reviewApprove, reviewReject];
5702
+ }
5703
+
5603
5704
  // src/commands/search/all.ts
5604
- import { z as z99 } from "zod";
5605
- var inputSchema96 = z99.object({
5606
- query: z99.string().min(1).describe("Search query"),
5705
+ import { z as z103 } from "zod";
5706
+ var inputSchema100 = z103.object({
5707
+ query: z103.string().min(1).describe("Search query"),
5607
5708
  ...paginationInput
5608
5709
  });
5609
5710
  var searchAll = {
@@ -5611,8 +5712,8 @@ var searchAll = {
5611
5712
  group: "search",
5612
5713
  description: "Search across all entities",
5613
5714
  stdinField: "query",
5614
- inputSchema: inputSchema96,
5615
- outputSchema: z99.any(),
5715
+ inputSchema: inputSchema100,
5716
+ outputSchema: z103.any(),
5616
5717
  annotations: { readOnlyHint: true },
5617
5718
  async execute(input, ctx) {
5618
5719
  return ctx.client.get("search_all", {
@@ -5626,10 +5727,10 @@ var searchAll = {
5626
5727
  };
5627
5728
 
5628
5729
  // src/commands/search/file-content.ts
5629
- import { z as z100 } from "zod";
5630
- var inputSchema97 = z100.object({
5631
- query: z100.string().min(1).describe("Search query"),
5632
- projectId: z100.string().uuid().optional().describe("Filter by project ID"),
5730
+ import { z as z104 } from "zod";
5731
+ var inputSchema101 = z104.object({
5732
+ query: z104.string().min(1).describe("Search query"),
5733
+ projectId: z104.string().uuid().optional().describe("Filter by project ID"),
5633
5734
  ...paginationInput
5634
5735
  });
5635
5736
  var searchFileContent = {
@@ -5637,8 +5738,8 @@ var searchFileContent = {
5637
5738
  group: "search",
5638
5739
  description: "Search within file contents",
5639
5740
  stdinField: "query",
5640
- inputSchema: inputSchema97,
5641
- outputSchema: z100.any(),
5741
+ inputSchema: inputSchema101,
5742
+ outputSchema: z104.any(),
5642
5743
  annotations: { readOnlyHint: true },
5643
5744
  async execute(input, ctx) {
5644
5745
  const queryParams = {
@@ -5656,9 +5757,9 @@ var searchFileContent = {
5656
5757
  };
5657
5758
 
5658
5759
  // src/commands/search/files.ts
5659
- import { z as z101 } from "zod";
5660
- var inputSchema98 = z101.object({
5661
- query: z101.string().min(1).describe("Search query"),
5760
+ import { z as z105 } from "zod";
5761
+ var inputSchema102 = z105.object({
5762
+ query: z105.string().min(1).describe("Search query"),
5662
5763
  ...paginationInput
5663
5764
  });
5664
5765
  var searchFiles = {
@@ -5666,8 +5767,8 @@ var searchFiles = {
5666
5767
  group: "search",
5667
5768
  description: "Search files by query",
5668
5769
  stdinField: "query",
5669
- inputSchema: inputSchema98,
5670
- outputSchema: z101.any(),
5770
+ inputSchema: inputSchema102,
5771
+ outputSchema: z105.any(),
5671
5772
  annotations: { readOnlyHint: true },
5672
5773
  async execute(input, ctx) {
5673
5774
  return ctx.client.get("search_files", {
@@ -5681,9 +5782,9 @@ var searchFiles = {
5681
5782
  };
5682
5783
 
5683
5784
  // src/commands/search/tasks.ts
5684
- import { z as z102 } from "zod";
5685
- var inputSchema99 = z102.object({
5686
- query: z102.string().min(1).describe("Search query"),
5785
+ import { z as z106 } from "zod";
5786
+ var inputSchema103 = z106.object({
5787
+ query: z106.string().min(1).describe("Search query"),
5687
5788
  ...paginationInput
5688
5789
  });
5689
5790
  var searchTasks = {
@@ -5691,8 +5792,8 @@ var searchTasks = {
5691
5792
  group: "search",
5692
5793
  description: "Search tasks by query",
5693
5794
  stdinField: "query",
5694
- inputSchema: inputSchema99,
5695
- outputSchema: z102.any(),
5795
+ inputSchema: inputSchema103,
5796
+ outputSchema: z106.any(),
5696
5797
  annotations: { readOnlyHint: true },
5697
5798
  async execute(input, ctx) {
5698
5799
  return ctx.client.get("search_tasks", {
@@ -5711,16 +5812,16 @@ function registerSearchCommands() {
5711
5812
  }
5712
5813
 
5713
5814
  // src/commands/tasks/archive.ts
5714
- import { z as z103 } from "zod";
5715
- var inputSchema100 = z103.object({
5716
- taskId: z103.string().uuid().describe("Task ID to archive")
5815
+ import { z as z107 } from "zod";
5816
+ var inputSchema104 = z107.object({
5817
+ taskId: z107.string().uuid().describe("Task ID to archive")
5717
5818
  });
5718
5819
  var tasksArchive = {
5719
5820
  name: "tasks.archive",
5720
5821
  group: "tasks",
5721
5822
  description: "Archive (delete) a task",
5722
- inputSchema: inputSchema100,
5723
- outputSchema: z103.any(),
5823
+ inputSchema: inputSchema104,
5824
+ outputSchema: z107.any(),
5724
5825
  annotations: { destructiveHint: true },
5725
5826
  async execute(input, ctx) {
5726
5827
  await ctx.client.del("task", {
@@ -5734,8 +5835,53 @@ var tasksArchive = {
5734
5835
  }
5735
5836
  };
5736
5837
 
5838
+ // src/commands/tasks/attachment-content.ts
5839
+ import { z as z108 } from "zod";
5840
+ var inputSchema105 = z108.object({
5841
+ taskId: z108.string().uuid().describe("Task ID"),
5842
+ attachmentId: z108.string().uuid().describe("Attachment ID")
5843
+ });
5844
+ var tasksAttachmentContent = {
5845
+ name: "tasks.attachmentContent",
5846
+ group: "tasks",
5847
+ description: "Get the content of a task attachment",
5848
+ inputSchema: inputSchema105,
5849
+ outputSchema: z108.any(),
5850
+ annotations: { readOnlyHint: true },
5851
+ async execute(input, ctx) {
5852
+ return ctx.client.get("task_attachment_content", {
5853
+ pathParams: { id: input.taskId, aid: input.attachmentId }
5854
+ });
5855
+ },
5856
+ formatOutput(output, format) {
5857
+ if (format === "compact") return output.content ?? JSON.stringify(output);
5858
+ return JSON.stringify(output, null, 2);
5859
+ }
5860
+ };
5861
+
5862
+ // src/commands/tasks/attachments.ts
5863
+ import { z as z109 } from "zod";
5864
+ var inputSchema106 = z109.object({
5865
+ taskId: z109.string().uuid().describe("Task ID")
5866
+ });
5867
+ var tasksAttachments = {
5868
+ name: "tasks.attachments",
5869
+ group: "tasks",
5870
+ description: "List the files attached to a task",
5871
+ inputSchema: inputSchema106,
5872
+ outputSchema: z109.any(),
5873
+ annotations: { readOnlyHint: true },
5874
+ async execute(input, ctx) {
5875
+ return ctx.client.get("task_attachments", { pathParams: { id: input.taskId } });
5876
+ },
5877
+ formatOutput(output, format) {
5878
+ if (format === "compact") return output.id ?? JSON.stringify(output);
5879
+ return JSON.stringify(output, null, 2);
5880
+ }
5881
+ };
5882
+
5737
5883
  // src/commands/tasks/create.ts
5738
- import { z as z104 } from "zod";
5884
+ import { z as z110 } from "zod";
5739
5885
 
5740
5886
  // src/lib/poll.ts
5741
5887
  init_errors();
@@ -5941,20 +6087,20 @@ ${this.useColor ? pc5.yellow("Stream timed out.") : "Stream timed out."}
5941
6087
  };
5942
6088
 
5943
6089
  // src/commands/tasks/create.ts
5944
- var inputSchema101 = z104.object({
5945
- project: z104.string().uuid().optional().describe("Project ID (optional; defaults to your workspace)"),
5946
- title: z104.string().optional().describe("Task title"),
5947
- message: z104.string().optional().describe("Initial message"),
5948
- wait: z104.boolean().default(false).describe("Wait for agent response (polling)"),
5949
- stream: z104.boolean().default(false).describe("Stream agent response in real-time (SSE)")
6090
+ var inputSchema107 = z110.object({
6091
+ project: z110.string().uuid().optional().describe("Project ID (optional; defaults to your workspace)"),
6092
+ title: z110.string().optional().describe("Task title"),
6093
+ message: z110.string().optional().describe("Initial message"),
6094
+ wait: z110.boolean().default(false).describe("Wait for agent response (polling)"),
6095
+ stream: z110.boolean().default(false).describe("Stream agent response in real-time (SSE)")
5950
6096
  });
5951
6097
  var tasksCreate = {
5952
6098
  name: "tasks.create",
5953
6099
  group: "tasks",
5954
6100
  description: "Create a new task in a project. If a message is provided it is queued, but the AI response is NOT returned \u2014 the agent processes asynchronously. Poll elnora_tasks_messages every 5-10s until the last message has role 'assistant' with metadata.status 'completed'. Timeout after 5 min.",
5955
6101
  stdinField: "message",
5956
- inputSchema: inputSchema101,
5957
- outputSchema: z104.any(),
6102
+ inputSchema: inputSchema107,
6103
+ outputSchema: z110.any(),
5958
6104
  async execute(input, ctx) {
5959
6105
  const result = await ctx.client.post("tasks", {
5960
6106
  // projectId is optional (ELN-880 Phase C): when omitted the backend creates the
@@ -6006,16 +6152,16 @@ var tasksCreate = {
6006
6152
  };
6007
6153
 
6008
6154
  // src/commands/tasks/get.ts
6009
- import { z as z105 } from "zod";
6010
- var inputSchema102 = z105.object({
6011
- taskId: z105.string().uuid().describe("Task ID")
6155
+ import { z as z111 } from "zod";
6156
+ var inputSchema108 = z111.object({
6157
+ taskId: z111.string().uuid().describe("Task ID")
6012
6158
  });
6013
6159
  var tasksGet = {
6014
6160
  name: "tasks.get",
6015
6161
  group: "tasks",
6016
6162
  description: "Get details of a specific task",
6017
- inputSchema: inputSchema102,
6018
- outputSchema: z105.any(),
6163
+ inputSchema: inputSchema108,
6164
+ outputSchema: z111.any(),
6019
6165
  annotations: { readOnlyHint: true },
6020
6166
  async execute(input, ctx) {
6021
6167
  return ctx.client.get("task", {
@@ -6029,28 +6175,26 @@ var tasksGet = {
6029
6175
  };
6030
6176
 
6031
6177
  // src/commands/tasks/list.ts
6032
- import { z as z106 } from "zod";
6033
- var inputSchema103 = z106.object({
6034
- project: z106.string().uuid().optional().describe("Project ID to filter by"),
6178
+ import { z as z112 } from "zod";
6179
+ var inputSchema109 = z112.object({
6180
+ project: z112.string().uuid().optional().describe("Project ID to filter by"),
6181
+ status: z112.enum(["active", "archived", "all"]).optional().describe("Lifecycle filter: active (default), archived, or all"),
6035
6182
  ...paginationInput
6036
6183
  });
6037
6184
  var tasksList = {
6038
6185
  name: "tasks.list",
6039
6186
  group: "tasks",
6040
- description: "List tasks, optionally filtered by project",
6041
- inputSchema: inputSchema103,
6042
- outputSchema: z106.any(),
6187
+ description: "List tasks, optionally filtered by project or lifecycle status",
6188
+ inputSchema: inputSchema109,
6189
+ outputSchema: z112.any(),
6043
6190
  annotations: { readOnlyHint: true },
6044
6191
  async execute(input, ctx) {
6192
+ const queryParams = { page: input.page, pageSize: input.pageSize };
6193
+ if (input.status) queryParams.status = input.status;
6045
6194
  if (input.project) {
6046
- return ctx.client.get("project_tasks", {
6047
- pathParams: { id: input.project },
6048
- queryParams: { page: input.page, pageSize: input.pageSize }
6049
- });
6195
+ return ctx.client.get("project_tasks", { pathParams: { id: input.project }, queryParams });
6050
6196
  }
6051
- return ctx.client.get("tasks", {
6052
- queryParams: { page: input.page, pageSize: input.pageSize }
6053
- });
6197
+ return ctx.client.get("tasks", { queryParams });
6054
6198
  },
6055
6199
  formatOutput(output, format) {
6056
6200
  if (format === "compact") return output.id ?? JSON.stringify(output);
@@ -6059,18 +6203,18 @@ var tasksList = {
6059
6203
  };
6060
6204
 
6061
6205
  // src/commands/tasks/messages.ts
6062
- import { z as z107 } from "zod";
6063
- var inputSchema104 = z107.object({
6064
- taskId: z107.string().uuid().describe("Task ID"),
6065
- cursor: z107.string().optional().describe("Pagination cursor"),
6066
- limit: z107.number().int().min(1).max(100).default(50).describe("Results per page")
6206
+ import { z as z113 } from "zod";
6207
+ var inputSchema110 = z113.object({
6208
+ taskId: z113.string().uuid().describe("Task ID"),
6209
+ cursor: z113.string().optional().describe("Pagination cursor"),
6210
+ limit: z113.number().int().min(1).max(100).default(50).describe("Results per page")
6067
6211
  });
6068
6212
  var tasksMessages = {
6069
6213
  name: "tasks.messages",
6070
6214
  group: "tasks",
6071
6215
  description: "List messages for a task",
6072
- inputSchema: inputSchema104,
6073
- outputSchema: z107.any(),
6216
+ inputSchema: inputSchema110,
6217
+ outputSchema: z113.any(),
6074
6218
  annotations: { readOnlyHint: true },
6075
6219
  async execute(input, ctx) {
6076
6220
  const queryParams = { limit: input.limit };
@@ -6089,23 +6233,23 @@ var tasksMessages = {
6089
6233
  };
6090
6234
 
6091
6235
  // src/commands/tasks/send.ts
6092
- import { z as z108 } from "zod";
6236
+ import { z as z114 } from "zod";
6093
6237
  init_profiles();
6094
6238
  var UUID_RE2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
6095
- var inputSchema105 = z108.object({
6096
- taskId: z108.string().uuid().describe("Task ID"),
6097
- message: z108.string().min(1).describe("Message content"),
6098
- fileRefs: z108.string().optional().describe("Comma-separated file reference UUIDs"),
6099
- wait: z108.boolean().default(false).describe("Wait for agent response (polling)"),
6100
- stream: z108.boolean().default(false).describe("Stream agent response in real-time (SSE)")
6239
+ var inputSchema111 = z114.object({
6240
+ taskId: z114.string().uuid().describe("Task ID"),
6241
+ message: z114.string().min(1).describe("Message content"),
6242
+ fileRefs: z114.string().optional().describe("Comma-separated file reference UUIDs"),
6243
+ wait: z114.boolean().default(false).describe("Wait for agent response (polling)"),
6244
+ stream: z114.boolean().default(false).describe("Stream agent response in real-time (SSE)")
6101
6245
  });
6102
6246
  var tasksSend = {
6103
6247
  name: "tasks.send",
6104
6248
  group: "tasks",
6105
6249
  description: "Send a message to a task. Returns the created user message immediately \u2014 the agent processes asynchronously. To get the AI response, poll elnora_tasks_messages until the last message has role 'assistant' with metadata.status 'completed'. Poll every 5-10s, timeout after 5 min.",
6106
6250
  stdinField: "message",
6107
- inputSchema: inputSchema105,
6108
- outputSchema: z108.any(),
6251
+ inputSchema: inputSchema111,
6252
+ outputSchema: z114.any(),
6109
6253
  async execute(input, ctx) {
6110
6254
  let referencedFileIds;
6111
6255
  if (input.fileRefs) {
@@ -6160,20 +6304,42 @@ var tasksSend = {
6160
6304
  }
6161
6305
  };
6162
6306
 
6307
+ // src/commands/tasks/unarchive.ts
6308
+ import { z as z115 } from "zod";
6309
+ var inputSchema112 = z115.object({
6310
+ taskId: z115.string().uuid().describe("Task ID to unarchive")
6311
+ });
6312
+ var tasksUnarchive = {
6313
+ name: "tasks.unarchive",
6314
+ group: "tasks",
6315
+ description: "Unarchive a task so it reappears in the default task list",
6316
+ inputSchema: inputSchema112,
6317
+ outputSchema: z115.any(),
6318
+ annotations: { idempotentHint: true },
6319
+ async execute(input, ctx) {
6320
+ await ctx.client.post("task_unarchive", {}, { pathParams: { id: input.taskId } });
6321
+ return { unarchived: true, taskId: input.taskId };
6322
+ },
6323
+ formatOutput(output, format) {
6324
+ if (format === "compact") return output.taskId ?? JSON.stringify(output);
6325
+ return JSON.stringify(output, null, 2);
6326
+ }
6327
+ };
6328
+
6163
6329
  // src/commands/tasks/update.ts
6164
6330
  init_errors();
6165
- import { z as z109 } from "zod";
6166
- var inputSchema106 = z109.object({
6167
- taskId: z109.string().uuid().describe("Task ID"),
6168
- title: z109.string().min(1).optional().describe("New task title"),
6169
- status: z109.string().optional().describe("New task status")
6331
+ import { z as z116 } from "zod";
6332
+ var inputSchema113 = z116.object({
6333
+ taskId: z116.string().uuid().describe("Task ID"),
6334
+ title: z116.string().min(1).optional().describe("New task title"),
6335
+ status: z116.string().optional().describe("New task status")
6170
6336
  });
6171
6337
  var tasksUpdate = {
6172
6338
  name: "tasks.update",
6173
6339
  group: "tasks",
6174
6340
  description: "Update an existing task",
6175
- inputSchema: inputSchema106,
6176
- outputSchema: z109.any(),
6341
+ inputSchema: inputSchema113,
6342
+ outputSchema: z116.any(),
6177
6343
  annotations: { idempotentHint: true },
6178
6344
  async execute(input, ctx) {
6179
6345
  const { taskId, ...fields } = input;
@@ -6195,7 +6361,18 @@ var tasksUpdate = {
6195
6361
 
6196
6362
  // src/commands/tasks/index.ts
6197
6363
  function registerTaskCommands() {
6198
- return [tasksList, tasksGet, tasksCreate, tasksSend, tasksMessages, tasksUpdate, tasksArchive];
6364
+ return [
6365
+ tasksList,
6366
+ tasksGet,
6367
+ tasksCreate,
6368
+ tasksSend,
6369
+ tasksMessages,
6370
+ tasksUpdate,
6371
+ tasksArchive,
6372
+ tasksUnarchive,
6373
+ tasksAttachments,
6374
+ tasksAttachmentContent
6375
+ ];
6199
6376
  }
6200
6377
 
6201
6378
  // src/core/registry.ts
@@ -6236,6 +6413,7 @@ function buildRegistry() {
6236
6413
  registerFileCommands(),
6237
6414
  registerOrgCommands(),
6238
6415
  registerFolderCommands(),
6416
+ registerReviewCommands(),
6239
6417
  registerSearchCommands(),
6240
6418
  registerProtocolCommands(),
6241
6419
  registerLibraryCommands(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elnora-ai/cli",
3
- "version": "2.4.0",
3
+ "version": "2.5.1",
4
4
  "description": "Elnora AI Platform CLI",
5
5
  "type": "module",
6
6
  "bin": {