@integrity-labs/agt-cli 0.28.1137 → 0.28.1139

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 (30) hide show
  1. package/dist/bin/agt.js +5 -5
  2. package/dist/{chunk-LQCWKNFX.js → chunk-7U4VSBOE.js} +2 -2
  3. package/dist/{chunk-WIU4HUHD.js → chunk-DYFE224A.js} +33 -1
  4. package/dist/{chunk-WIU4HUHD.js.map → chunk-DYFE224A.js.map} +1 -1
  5. package/dist/{chunk-HZFUOGUV.js → chunk-PI2WUKWD.js} +4 -4
  6. package/dist/{claude-pair-runtime-OZLZFJZR.js → claude-pair-runtime-BOTE3DRW.js} +2 -2
  7. package/dist/lib/manager-worker.js +261 -16
  8. package/dist/lib/manager-worker.js.map +1 -1
  9. package/dist/mcp/augmented-admin.js +164 -54
  10. package/dist/mcp/augmented-help-kb.js +164 -54
  11. package/dist/mcp/augmented-support.js +164 -54
  12. package/dist/mcp/direct-chat-channel.js +121 -41
  13. package/dist/mcp/index.js +243 -59
  14. package/dist/mcp/origami.js +121 -41
  15. package/dist/mcp/slack-channel.js +121 -41
  16. package/dist/mcp/teams-channel.js +89 -41
  17. package/dist/mcp/telegram-channel.js +121 -41
  18. package/dist/mcp/whatsapp-channel.js +5447 -4340
  19. package/dist/mcp/whatsapp-link.js +5442 -4383
  20. package/dist/mcp/xero.js +6048 -2067
  21. package/dist/{persistent-session-2X3BCGV5.js → persistent-session-6O66QEI4.js} +3 -3
  22. package/dist/{responsiveness-probe-QFLFS5QX.js → responsiveness-probe-WGD3NDWG.js} +3 -3
  23. package/dist/{session-auth-dead-QE7GT5Y5.js → session-auth-dead-6N2AEFKX.js} +2 -2
  24. package/package.json +2 -2
  25. /package/dist/{chunk-LQCWKNFX.js.map → chunk-7U4VSBOE.js.map} +0 -0
  26. /package/dist/{chunk-HZFUOGUV.js.map → chunk-PI2WUKWD.js.map} +0 -0
  27. /package/dist/{claude-pair-runtime-OZLZFJZR.js.map → claude-pair-runtime-BOTE3DRW.js.map} +0 -0
  28. /package/dist/{persistent-session-2X3BCGV5.js.map → persistent-session-6O66QEI4.js.map} +0 -0
  29. /package/dist/{responsiveness-probe-QFLFS5QX.js.map → responsiveness-probe-WGD3NDWG.js.map} +0 -0
  30. /package/dist/{session-auth-dead-QE7GT5Y5.js.map → session-auth-dead-6N2AEFKX.js.map} +0 -0
package/dist/mcp/index.js CHANGED
@@ -22462,6 +22462,37 @@ function describeAssignProject(o) {
22462
22462
  return `${head} ${from} To undo: ${tool} with ${idArg}="${o.leafId}", ${undoArg}.`;
22463
22463
  }
22464
22464
 
22465
+ // src/project-summary-render.ts
22466
+ function projectPastDue(p2, today) {
22467
+ return p2.status === "active" && !!p2.target_date && p2.target_date < today;
22468
+ }
22469
+ function ownerLabel(p2) {
22470
+ if (!p2.owner_person_id) return null;
22471
+ return p2.owner_name ? `${p2.owner_name} (person_id ${p2.owner_person_id})` : `person_id ${p2.owner_person_id}`;
22472
+ }
22473
+ function dueLabel(p2, today) {
22474
+ if (!p2.target_date) return null;
22475
+ return projectPastDue(p2, today) ? `${p2.target_date} (PAST DUE)` : p2.target_date;
22476
+ }
22477
+ function projectListLine(p2, today) {
22478
+ const extra = [
22479
+ ownerLabel(p2) ? `owner ${ownerLabel(p2)}` : null,
22480
+ dueLabel(p2, today) ? `due ${dueLabel(p2, today)}` : null
22481
+ ].filter((s) => s !== null);
22482
+ const tail = extra.length ? `, ${extra.join(", ")}` : "";
22483
+ return `- ${p2.name} [${p2.status}] (id: ${p2.id}, created ${p2.created_at}${tail})`;
22484
+ }
22485
+ function projectOwnerDateLines(p2, today) {
22486
+ return [`Owner: ${ownerLabel(p2) ?? "none"}`, `Target date: ${dueLabel(p2, today) ?? "none"}`];
22487
+ }
22488
+ function todayInTz(timeZone, now = /* @__PURE__ */ new Date()) {
22489
+ try {
22490
+ return new Intl.DateTimeFormat("en-CA", { timeZone, year: "numeric", month: "2-digit", day: "2-digit" }).format(now);
22491
+ } catch {
22492
+ return now.toISOString().slice(0, 10);
22493
+ }
22494
+ }
22495
+
22465
22496
  // src/kanban-assign-result.ts
22466
22497
  function kanbanAssignResultText(data, fallbackTargetAgent, fallbackTargetTeam) {
22467
22498
  if (!data.ok) return `Failed to assign task to ${fallbackTargetAgent}.`;
@@ -31050,6 +31081,38 @@ var FLAG_REGISTRY = [
31050
31081
  // it back on for their own org.
31051
31082
  platformAdminOnly: true
31052
31083
  },
31084
+ {
31085
+ key: "two-factor-settings",
31086
+ description: "Show Settings > Two-factor authentication, where a console user sets up or removes an authenticator app (ENG-11619). Gates SETTING UP only: anyone who already has an authenticator is asked for a code before a console page loads whatever this flag says, so switching it off never turns an existing user's two-factor off. Phase 1: console pages only, not the API.",
31087
+ flagType: "boolean",
31088
+ // PUBLIC (ADR-0022 §2): the nav reads it via usePublicBooleanFlag and the
31089
+ // page via getPublicBooleanFlagServer, so it is in the GET /flags map. No
31090
+ // env override (UI rollout, not an operator gate). Ships dark (default
31091
+ // false). The staff factor reset on the admin organization page is in
31092
+ // place, so a lost phone is recoverable.
31093
+ public: true,
31094
+ defaultValue: false,
31095
+ // Platform admin only until ENG-11619 phase 2. Phase 1 gates console PAGE
31096
+ // LOADS: an enrolled user's password-only (aal1) session is still accepted
31097
+ // by the Hono API and the webapp's /api/* handlers. An org admin switching
31098
+ // this on would reasonably believe a stolen password is now useless, and
31099
+ // it is not yet (Obi Wan be8af20e689c on #7092). Drop this once phase 2
31100
+ // refuses aal1 there too.
31101
+ platformAdminOnly: true
31102
+ },
31103
+ {
31104
+ key: "two-factor-reminder-banner",
31105
+ description: "Show a banner across the console asking every user without an authenticator app to set one up before two-factor becomes required (ENG-11619). Also makes Settings > Two-factor authentication reachable, as `two-factor-settings` does, because the banner links there. Closing it hides it for a day in that browser.",
31106
+ flagType: "boolean",
31107
+ // PUBLIC: the nav reads it client-side; the layout and the settings page read
31108
+ // it server-side. Ships dark (default false): turn it on for one org first.
31109
+ public: true,
31110
+ defaultValue: false,
31111
+ // Staff only, for the same reason as `two-factor-settings` above: it opens
31112
+ // the settings page, and phase 1 still accepts an aal1 session outside page
31113
+ // loads, so an org admin must not be the one deciding they are covered.
31114
+ platformAdminOnly: true
31115
+ },
31053
31116
  {
31054
31117
  key: "platform-maintenance-mode",
31055
31118
  description: 'Platform-wide maintenance mode (ENG-6506; widened to modes by ENG-11436). off = normal operation (ships dark; channels behave exactly as today). tools-offline = every agent KEEPS conversing but every Augmented tool that WRITES to the control plane refuses with a reason, so nothing is created during a window whose database restore would discard it; reads are untouched. fleet-offline = the previous boolean-true behaviour AND the write gate: admitted human inbound gets a "we are offline for maintenance" notice instead of being dispatched, for whole-platform downtime such as DB upgrades. The modes are CUMULATIVE \u2014 fleet-offline gates writes too, because silencing channel inbound does not stop a /loop or a scheduled task filing work. Read host-side per inbound and per tool call from the flags cache (no MCP restart). (Proactive "back online" follow-up is the ENG-6508 fast-follow, not this flag.)',
@@ -40194,7 +40257,7 @@ function object(shape, params) {
40194
40257
  return new ZodMiniObject(def);
40195
40258
  }
40196
40259
 
40197
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
40260
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
40198
40261
  function isZ4Schema(s) {
40199
40262
  const schema = s;
40200
40263
  return !!schema._zod;
@@ -40278,17 +40341,33 @@ function normalizeObjectSchema(schema) {
40278
40341
  }
40279
40342
  return void 0;
40280
40343
  }
40344
+ function getDotPath(path) {
40345
+ if (path.length === 0) {
40346
+ return "object root";
40347
+ }
40348
+ return path.reduce((acc, seg, index) => {
40349
+ if (index === 0) {
40350
+ return String(seg);
40351
+ }
40352
+ if (typeof seg === "number") {
40353
+ return `${acc}[${seg}]`;
40354
+ }
40355
+ return `${acc}.${seg}`;
40356
+ }, "");
40357
+ }
40281
40358
  function getParseErrorMessage(error2) {
40282
40359
  if (error2 && typeof error2 === "object") {
40360
+ if ("issues" in error2 && Array.isArray(error2.issues) && error2.issues.length > 0) {
40361
+ return error2.issues.map((i) => {
40362
+ if (!i.path?.length) {
40363
+ return i.message;
40364
+ }
40365
+ return `${i.message} at ${getDotPath(i.path)}`;
40366
+ }).join("\n");
40367
+ }
40283
40368
  if ("message" in error2 && typeof error2.message === "string") {
40284
40369
  return error2.message;
40285
40370
  }
40286
- if ("issues" in error2 && Array.isArray(error2.issues) && error2.issues.length > 0) {
40287
- const firstIssue = error2.issues[0];
40288
- if (firstIssue && typeof firstIssue === "object" && "message" in firstIssue) {
40289
- return String(firstIssue.message);
40290
- }
40291
- }
40292
40371
  try {
40293
40372
  return JSON.stringify(error2);
40294
40373
  } catch {
@@ -41033,7 +41112,7 @@ function preprocess(fn, schema) {
41033
41112
  // ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/external.js
41034
41113
  config(en_default2());
41035
41114
 
41036
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
41115
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
41037
41116
  var LATEST_PROTOCOL_VERSION = "2025-11-25";
41038
41117
  var SUPPORTED_PROTOCOL_VERSIONS = [LATEST_PROTOCOL_VERSION, "2025-06-18", "2025-03-26", "2024-11-05", "2024-10-07"];
41039
41118
  var RELATED_TASK_META_KEY = "io.modelcontextprotocol/related-task";
@@ -41043,10 +41122,9 @@ var ProgressTokenSchema = union([string2(), number2().int()]);
41043
41122
  var CursorSchema = string2();
41044
41123
  var TaskCreationParamsSchema = looseObject({
41045
41124
  /**
41046
- * Time in milliseconds to keep task results available after completion.
41047
- * If null, the task has unlimited lifetime until manually cleaned up.
41125
+ * Requested duration in milliseconds to retain task from creation.
41048
41126
  */
41049
- ttl: union([number2(), _null3()]).optional(),
41127
+ ttl: number2().optional(),
41050
41128
  /**
41051
41129
  * Time in milliseconds to wait between task status requests.
41052
41130
  */
@@ -41346,7 +41424,11 @@ var ClientCapabilitiesSchema = object2({
41346
41424
  /**
41347
41425
  * Present if the client supports task creation.
41348
41426
  */
41349
- tasks: ClientTasksCapabilitySchema.optional()
41427
+ tasks: ClientTasksCapabilitySchema.optional(),
41428
+ /**
41429
+ * Extensions that the client supports. Keys are extension identifiers (vendor-prefix/extension-name).
41430
+ */
41431
+ extensions: record(string2(), AssertObjectSchema).optional()
41350
41432
  });
41351
41433
  var InitializeRequestParamsSchema = BaseRequestParamsSchema.extend({
41352
41434
  /**
@@ -41407,7 +41489,11 @@ var ServerCapabilitiesSchema = object2({
41407
41489
  /**
41408
41490
  * Present if the server supports task creation.
41409
41491
  */
41410
- tasks: ServerTasksCapabilitySchema.optional()
41492
+ tasks: ServerTasksCapabilitySchema.optional(),
41493
+ /**
41494
+ * Extensions that the server supports. Keys are extension identifiers (vendor-prefix/extension-name).
41495
+ */
41496
+ extensions: record(string2(), AssertObjectSchema).optional()
41411
41497
  });
41412
41498
  var InitializeResultSchema = ResultSchema.extend({
41413
41499
  /**
@@ -41599,6 +41685,12 @@ var ResourceSchema = object2({
41599
41685
  * The MIME type of this resource, if known.
41600
41686
  */
41601
41687
  mimeType: optional(string2()),
41688
+ /**
41689
+ * The size of the raw resource content, in bytes (i.e., before base64 encoding or any tokenization), if known.
41690
+ *
41691
+ * This can be used by Hosts to display file sizes and estimate context window usage.
41692
+ */
41693
+ size: optional(number2()),
41602
41694
  /**
41603
41695
  * Optional annotations for the client.
41604
41696
  */
@@ -42551,7 +42643,7 @@ var UrlElicitationRequiredError = class extends McpError {
42551
42643
  }
42552
42644
  };
42553
42645
 
42554
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
42646
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
42555
42647
  function isTerminal(status) {
42556
42648
  return status === "completed" || status === "failed" || status === "cancelled";
42557
42649
  }
@@ -43840,7 +43932,7 @@ var zodToJsonSchema = (schema, options) => {
43840
43932
  return combined;
43841
43933
  };
43842
43934
 
43843
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
43935
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
43844
43936
  function mapMiniTarget(t) {
43845
43937
  if (!t)
43846
43938
  return "draft-7";
@@ -43882,7 +43974,7 @@ function parseWithCompat(schema, data) {
43882
43974
  return result.data;
43883
43975
  }
43884
43976
 
43885
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js
43977
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js
43886
43978
  var DEFAULT_REQUEST_TIMEOUT_MSEC = 6e4;
43887
43979
  var Protocol = class {
43888
43980
  constructor(_options) {
@@ -43923,6 +44015,9 @@ var Protocol = class {
43923
44015
  this.setRequestHandler(GetTaskPayloadRequestSchema, async (request, extra) => {
43924
44016
  const handleTaskResult = async () => {
43925
44017
  const taskId = request.params.taskId;
44018
+ if (!await this._taskStore.getTask(taskId, extra.sessionId)) {
44019
+ throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`);
44020
+ }
43926
44021
  if (this._taskMessageQueue) {
43927
44022
  let queuedMessage;
43928
44023
  while (queuedMessage = await this._taskMessageQueue.dequeue(taskId, extra.sessionId)) {
@@ -43953,12 +44048,12 @@ var Protocol = class {
43953
44048
  throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`);
43954
44049
  }
43955
44050
  if (!isTerminal(task.status)) {
43956
- await this._waitForTaskUpdate(taskId, extra.signal);
44051
+ await this._waitForTaskUpdate(taskId, extra.signal, extra.sessionId);
43957
44052
  return await handleTaskResult();
43958
44053
  }
43959
44054
  if (isTerminal(task.status)) {
43960
44055
  const result = await this._taskStore.getTaskResult(taskId, extra.sessionId);
43961
- this._clearTaskQueue(taskId);
44056
+ this._clearTaskQueue(taskId, extra.sessionId);
43962
44057
  return {
43963
44058
  ...result,
43964
44059
  _meta: {
@@ -43995,7 +44090,7 @@ var Protocol = class {
43995
44090
  throw new McpError(ErrorCode.InvalidParams, `Cannot cancel task in terminal status: ${task.status}`);
43996
44091
  }
43997
44092
  await this._taskStore.updateTaskStatus(request.params.taskId, "cancelled", "Client cancelled task execution.", extra.sessionId);
43998
- this._clearTaskQueue(request.params.taskId);
44093
+ this._clearTaskQueue(request.params.taskId, extra.sessionId);
43999
44094
  const cancelledTask = await this._taskStore.getTask(request.params.taskId, extra.sessionId);
44000
44095
  if (!cancelledTask) {
44001
44096
  throw new McpError(ErrorCode.InvalidParams, `Task not found after cancellation: ${request.params.taskId}`);
@@ -44094,6 +44189,10 @@ var Protocol = class {
44094
44189
  this._progressHandlers.clear();
44095
44190
  this._taskProgressTokens.clear();
44096
44191
  this._pendingDebouncedNotifications.clear();
44192
+ for (const info of this._timeoutInfo.values()) {
44193
+ clearTimeout(info.timeoutId);
44194
+ }
44195
+ this._timeoutInfo.clear();
44097
44196
  for (const controller of this._requestHandlerAbortControllers.values()) {
44098
44197
  controller.abort();
44099
44198
  }
@@ -44119,6 +44218,19 @@ var Protocol = class {
44119
44218
  const handler = this._requestHandlers.get(request.method) ?? this.fallbackRequestHandler;
44120
44219
  const capturedTransport = this._transport;
44121
44220
  const relatedTaskId = request.params?._meta?.[RELATED_TASK_META_KEY]?.taskId;
44221
+ const sessionId = capturedTransport?.sessionId;
44222
+ const store = this._taskStore;
44223
+ let relatedTaskFound = true;
44224
+ let relatedTaskLookup;
44225
+ if (relatedTaskId && store && this._taskMessageQueue && sessionId !== void 0) {
44226
+ relatedTaskFound = false;
44227
+ relatedTaskLookup = (async () => {
44228
+ if (!await store.getTask(relatedTaskId, sessionId)) {
44229
+ throw new McpError(ErrorCode.InvalidParams, `Task not found: ${relatedTaskId}`);
44230
+ }
44231
+ relatedTaskFound = true;
44232
+ })();
44233
+ }
44122
44234
  if (handler === void 0) {
44123
44235
  const errorResponse = {
44124
44236
  jsonrpc: "2.0",
@@ -44128,7 +44240,10 @@ var Protocol = class {
44128
44240
  message: "Method not found"
44129
44241
  }
44130
44242
  };
44131
- if (relatedTaskId && this._taskMessageQueue) {
44243
+ if (relatedTaskId && relatedTaskLookup) {
44244
+ const queuedError = { type: "error", message: errorResponse, timestamp: Date.now() };
44245
+ relatedTaskLookup.then(() => this._enqueueTaskMessage(relatedTaskId, queuedError, sessionId), () => capturedTransport?.send(errorResponse)).catch((error2) => this._onerror(new Error(`Failed to send an error response: ${error2}`)));
44246
+ } else if (relatedTaskId && this._taskMessageQueue) {
44132
44247
  this._enqueueTaskMessage(relatedTaskId, {
44133
44248
  type: "error",
44134
44249
  message: errorResponse,
@@ -44179,7 +44294,10 @@ var Protocol = class {
44179
44294
  closeSSEStream: extra?.closeSSEStream,
44180
44295
  closeStandaloneSSEStream: extra?.closeStandaloneSSEStream
44181
44296
  };
44182
- Promise.resolve().then(() => {
44297
+ (relatedTaskLookup ?? Promise.resolve()).then(() => {
44298
+ if (relatedTaskLookup && abortController.signal.aborted) {
44299
+ throw new McpError(ErrorCode.ConnectionClosed, "Request was cancelled");
44300
+ }
44183
44301
  if (taskCreationParams) {
44184
44302
  this.assertTaskHandlerCapability(request.method);
44185
44303
  }
@@ -44214,7 +44332,7 @@ var Protocol = class {
44214
44332
  ...error2["data"] !== void 0 && { data: error2["data"] }
44215
44333
  }
44216
44334
  };
44217
- if (relatedTaskId && this._taskMessageQueue) {
44335
+ if (relatedTaskId && this._taskMessageQueue && relatedTaskFound) {
44218
44336
  await this._enqueueTaskMessage(relatedTaskId, {
44219
44337
  type: "error",
44220
44338
  message: errorResponse,
@@ -44224,7 +44342,9 @@ var Protocol = class {
44224
44342
  await capturedTransport?.send(errorResponse);
44225
44343
  }
44226
44344
  }).catch((error2) => this._onerror(new Error(`Failed to send response: ${error2}`))).finally(() => {
44227
- this._requestHandlerAbortControllers.delete(request.id);
44345
+ if (this._requestHandlerAbortControllers.get(request.id) === abortController) {
44346
+ this._requestHandlerAbortControllers.delete(request.id);
44347
+ }
44228
44348
  });
44229
44349
  }
44230
44350
  _onprogress(notification) {
@@ -44692,7 +44812,7 @@ var Protocol = class {
44692
44812
  throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured");
44693
44813
  }
44694
44814
  const maxQueueSize = this._options?.maxTaskQueueSize;
44695
- await this._taskMessageQueue.enqueue(taskId, message, sessionId, maxQueueSize);
44815
+ await this._taskMessageQueue.enqueue(taskId, message, sessionId ?? this._transport?.sessionId, maxQueueSize);
44696
44816
  }
44697
44817
  /**
44698
44818
  * Clears the message queue for a task and rejects any pending request resolvers.
@@ -44721,12 +44841,13 @@ var Protocol = class {
44721
44841
  * Uses polling to check for updates at the task's configured poll interval.
44722
44842
  * @param taskId The task ID to wait for
44723
44843
  * @param signal Abort signal to cancel the wait
44844
+ * @param sessionId Session of the request that waits, passed to the task store
44724
44845
  * @returns Promise that resolves when an update occurs or rejects if aborted
44725
44846
  */
44726
- async _waitForTaskUpdate(taskId, signal) {
44847
+ async _waitForTaskUpdate(taskId, signal, sessionId) {
44727
44848
  let interval = this._options?.defaultTaskPollInterval ?? 1e3;
44728
44849
  try {
44729
- const task = await this._taskStore?.getTask(taskId);
44850
+ const task = await this._taskStore?.getTask(taskId, sessionId);
44730
44851
  if (task?.pollInterval) {
44731
44852
  interval = task.pollInterval;
44732
44853
  }
@@ -44830,7 +44951,7 @@ function mergeCapabilities(base, additional) {
44830
44951
  return result;
44831
44952
  }
44832
44953
 
44833
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js
44954
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js
44834
44955
  var import_ajv = __toESM(require_ajv(), 1);
44835
44956
  var import_ajv_formats3 = __toESM(require_dist(), 1);
44836
44957
  function createDefaultAjvInstance() {
@@ -44898,7 +45019,7 @@ var AjvJsonSchemaValidator = class {
44898
45019
  }
44899
45020
  };
44900
45021
 
44901
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js
45022
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js
44902
45023
  var ExperimentalServerTasks = class {
44903
45024
  constructor(_server) {
44904
45025
  this._server = _server;
@@ -45111,7 +45232,7 @@ var ExperimentalServerTasks = class {
45111
45232
  }
45112
45233
  };
45113
45234
 
45114
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js
45235
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js
45115
45236
  function assertToolsCallTaskCapability(requests, method, entityName) {
45116
45237
  if (!requests) {
45117
45238
  throw new Error(`${entityName} does not support task creation (required for ${method})`);
@@ -45146,7 +45267,7 @@ function assertClientRequestTaskCapability(requests, method, entityName) {
45146
45267
  }
45147
45268
  }
45148
45269
 
45149
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js
45270
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js
45150
45271
  var Server = class extends Protocol {
45151
45272
  /**
45152
45273
  * Initializes this server with the given name and version information.
@@ -45212,16 +45333,7 @@ var Server = class extends Protocol {
45212
45333
  if (!methodSchema) {
45213
45334
  throw new Error("Schema is missing a method literal");
45214
45335
  }
45215
- let methodValue;
45216
- if (isZ4Schema(methodSchema)) {
45217
- const v4Schema = methodSchema;
45218
- const v4Def = v4Schema._zod?.def;
45219
- methodValue = v4Def?.value ?? v4Schema.value;
45220
- } else {
45221
- const v3Schema = methodSchema;
45222
- const legacyDef = v3Schema._def;
45223
- methodValue = legacyDef?.value ?? v3Schema.value;
45224
- }
45336
+ const methodValue = getLiteralValue(methodSchema);
45225
45337
  if (typeof methodValue !== "string") {
45226
45338
  throw new Error("Schema method literal must be a string");
45227
45339
  }
@@ -45526,7 +45638,7 @@ var Server = class extends Protocol {
45526
45638
  }
45527
45639
  };
45528
45640
 
45529
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js
45641
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js
45530
45642
  var COMPLETABLE_SYMBOL = /* @__PURE__ */ Symbol.for("mcp.completable");
45531
45643
  function isCompletable(schema) {
45532
45644
  return !!schema && typeof schema === "object" && COMPLETABLE_SYMBOL in schema;
@@ -45540,7 +45652,7 @@ var McpZodTypeKind;
45540
45652
  McpZodTypeKind2["Completable"] = "McpCompletable";
45541
45653
  })(McpZodTypeKind || (McpZodTypeKind = {}));
45542
45654
 
45543
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/toolNameValidation.js
45655
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/toolNameValidation.js
45544
45656
  var TOOL_NAME_REGEX = /^[A-Za-z0-9._-]{1,128}$/;
45545
45657
  function validateToolName(name) {
45546
45658
  const warnings = [];
@@ -45598,7 +45710,7 @@ function validateAndWarnToolName(name) {
45598
45710
  return result.isValid;
45599
45711
  }
45600
45712
 
45601
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/mcp-server.js
45713
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/mcp-server.js
45602
45714
  var ExperimentalMcpServerTasks = class {
45603
45715
  constructor(_mcpServer) {
45604
45716
  this._mcpServer = _mcpServer;
@@ -45613,7 +45725,43 @@ var ExperimentalMcpServerTasks = class {
45613
45725
  }
45614
45726
  };
45615
45727
 
45616
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js
45728
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js
45729
+ function toolInputElementCount(value, max) {
45730
+ let count = 0;
45731
+ const stack = [value];
45732
+ while (stack.length > 0) {
45733
+ const node = stack.pop();
45734
+ if (node === null || typeof node !== "object")
45735
+ continue;
45736
+ if (Array.isArray(node)) {
45737
+ for (const child of node) {
45738
+ if (++count > max)
45739
+ return count;
45740
+ if (child !== null && typeof child === "object")
45741
+ stack.push(child);
45742
+ }
45743
+ } else {
45744
+ for (const key in node) {
45745
+ if (!Object.prototype.hasOwnProperty.call(node, key))
45746
+ continue;
45747
+ if (++count > max)
45748
+ return count;
45749
+ const child = node[key];
45750
+ if (child !== null && typeof child === "object")
45751
+ stack.push(child);
45752
+ }
45753
+ }
45754
+ }
45755
+ return count;
45756
+ }
45757
+ function resolveMaxToolInputElements(value) {
45758
+ if (value === void 0 || value === Infinity)
45759
+ return void 0;
45760
+ if (typeof value !== "number" || Number.isNaN(value) || value < 1) {
45761
+ throw new RangeError(`maxToolInputElements must be a number of at least 1, or Infinity, got ${String(value)}`);
45762
+ }
45763
+ return value;
45764
+ }
45617
45765
  var McpServer = class {
45618
45766
  constructor(serverInfo, options) {
45619
45767
  this._registeredResources = {};
@@ -45625,6 +45773,7 @@ var McpServer = class {
45625
45773
  this._resourceHandlersInitialized = false;
45626
45774
  this._promptHandlersInitialized = false;
45627
45775
  this.server = new Server(serverInfo, options);
45776
+ this._maxToolInputElements = resolveMaxToolInputElements(options?.maxToolInputElements);
45628
45777
  }
45629
45778
  /**
45630
45779
  * Access experimental features.
@@ -45755,12 +45904,15 @@ var McpServer = class {
45755
45904
  * Validates tool input arguments against the tool's input schema.
45756
45905
  */
45757
45906
  async validateToolInput(tool, args, toolName) {
45907
+ if (this._maxToolInputElements !== void 0 && toolInputElementCount(args, this._maxToolInputElements) > this._maxToolInputElements) {
45908
+ throw new McpError(ErrorCode.InvalidParams, `Invalid arguments for tool ${toolName}: arguments contain more than the maximum of ${this._maxToolInputElements} elements`);
45909
+ }
45758
45910
  if (!tool.inputSchema) {
45759
45911
  return void 0;
45760
45912
  }
45761
45913
  const inputObj = normalizeObjectSchema(tool.inputSchema);
45762
45914
  const schemaToParse = inputObj ?? tool.inputSchema;
45763
- const parseResult = await safeParseAsync2(schemaToParse, args);
45915
+ const parseResult = await safeParseAsync2(schemaToParse, args ?? {});
45764
45916
  if (!parseResult.success) {
45765
45917
  const error2 = "error" in parseResult ? parseResult.error : "Unknown error";
45766
45918
  const errorMessage = getParseErrorMessage(error2);
@@ -45998,7 +46150,7 @@ var McpServer = class {
45998
46150
  }
45999
46151
  if (prompt.argsSchema) {
46000
46152
  const argsObj = normalizeObjectSchema(prompt.argsSchema);
46001
- const parseResult = await safeParseAsync2(argsObj, request.params.arguments);
46153
+ const parseResult = await safeParseAsync2(argsObj, request.params.arguments ?? {});
46002
46154
  if (!parseResult.success) {
46003
46155
  const error2 = "error" in parseResult ? parseResult.error : "Unknown error";
46004
46156
  const errorMessage = getParseErrorMessage(error2);
@@ -46237,6 +46389,9 @@ var McpServer = class {
46237
46389
  annotations = rest.shift();
46238
46390
  }
46239
46391
  } else if (typeof firstArg === "object" && firstArg !== null) {
46392
+ if (Object.values(firstArg).some((v) => typeof v === "object" && v !== null)) {
46393
+ throw new Error(`Tool ${name} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);
46394
+ }
46240
46395
  annotations = rest.shift();
46241
46396
  }
46242
46397
  }
@@ -46355,6 +46510,9 @@ function getZodSchemaObject(schema) {
46355
46510
  if (isZodRawShapeCompat(schema)) {
46356
46511
  return objectFromShape(schema);
46357
46512
  }
46513
+ if (!isZodSchemaInstance(schema)) {
46514
+ throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");
46515
+ }
46358
46516
  return schema;
46359
46517
  }
46360
46518
  function promptArgumentsFromSchema(schema) {
@@ -46399,12 +46557,21 @@ var EMPTY_COMPLETION_RESULT = {
46399
46557
  }
46400
46558
  };
46401
46559
 
46402
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
46560
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
46403
46561
  import process2 from "process";
46404
46562
 
46405
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
46563
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
46564
+ var STDIO_DEFAULT_MAX_BUFFER_SIZE = 10 * 1024 * 1024;
46406
46565
  var ReadBuffer = class {
46566
+ constructor(options) {
46567
+ this._maxBufferSize = options?.maxBufferSize ?? STDIO_DEFAULT_MAX_BUFFER_SIZE;
46568
+ }
46407
46569
  append(chunk) {
46570
+ const newSize = (this._buffer?.length ?? 0) + chunk.length;
46571
+ if (newSize > this._maxBufferSize) {
46572
+ this.clear();
46573
+ throw new Error(`ReadBuffer exceeded maximum size of ${this._maxBufferSize} bytes`);
46574
+ }
46408
46575
  this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
46409
46576
  }
46410
46577
  readMessage() {
@@ -46430,20 +46597,26 @@ function serializeMessage(message) {
46430
46597
  return JSON.stringify(message) + "\n";
46431
46598
  }
46432
46599
 
46433
- // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.27.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
46600
+ // ../../node_modules/.pnpm/@modelcontextprotocol+sdk@1.32.1_zod@3.25.76/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
46434
46601
  var StdioServerTransport = class {
46435
- constructor(_stdin = process2.stdin, _stdout = process2.stdout) {
46602
+ constructor(_stdin = process2.stdin, _stdout = process2.stdout, options) {
46436
46603
  this._stdin = _stdin;
46437
46604
  this._stdout = _stdout;
46438
- this._readBuffer = new ReadBuffer();
46439
46605
  this._started = false;
46440
46606
  this._ondata = (chunk) => {
46441
- this._readBuffer.append(chunk);
46442
- this.processReadBuffer();
46607
+ try {
46608
+ this._readBuffer.append(chunk);
46609
+ this.processReadBuffer();
46610
+ } catch (error2) {
46611
+ this.onerror?.(error2);
46612
+ this.close().catch(() => {
46613
+ });
46614
+ }
46443
46615
  };
46444
46616
  this._onerror = (error2) => {
46445
46617
  this.onerror?.(error2);
46446
46618
  };
46619
+ this._readBuffer = new ReadBuffer({ maxBufferSize: options?.maxBufferSize });
46447
46620
  }
46448
46621
  /**
46449
46622
  * Starts listening for messages on stdin.
@@ -52243,6 +52416,7 @@ server.tool(
52243
52416
  content: [{ type: "text", text: await resolveArtefactText(params.url) }]
52244
52417
  })
52245
52418
  );
52419
+ var todayInAgentTz = () => todayInTz();
52246
52420
  async function listProjectsText(params) {
52247
52421
  const data = await apiPost("/host/my-projects", {
52248
52422
  agent_id: AGT_AGENT_ID,
@@ -52252,7 +52426,8 @@ async function listProjectsText(params) {
52252
52426
  if (!data.projects.length) {
52253
52427
  return "No projects yet. Create one with projects_create (ask the human first), or a human can create one in the console, to group your work under.";
52254
52428
  }
52255
- return data.projects.map((p2) => `- ${p2.name} [${p2.status}] (id: ${p2.id}, created ${p2.created_at})`).join("\n");
52429
+ const today = data.today ?? todayInAgentTz();
52430
+ return data.projects.map((p2) => projectListLine(p2, today)).join("\n");
52256
52431
  }
52257
52432
  async function getProjectText(projectId) {
52258
52433
  const data = await apiPost(
@@ -52264,6 +52439,7 @@ async function getProjectText(projectId) {
52264
52439
  `Project: ${p2.name} [${p2.status}]`,
52265
52440
  `Id: ${p2.id}`,
52266
52441
  p2.linear_project_id ? `Linear project: ${p2.linear_project_id}` : null,
52442
+ ...projectOwnerDateLines(p2, data.today ?? todayInAgentTz()),
52267
52443
  `Created: ${p2.created_at}`,
52268
52444
  `Last updated: ${p2.updated_at}`
52269
52445
  ].filter((s) => s !== null).join("\n");
@@ -52294,7 +52470,9 @@ async function createProjectText(params) {
52294
52470
  agent_id: AGT_AGENT_ID,
52295
52471
  name: params.name,
52296
52472
  status: params.status,
52297
- linear_project_id: params.linear_project_id
52473
+ linear_project_id: params.linear_project_id,
52474
+ owner_person_id: params.owner_person_id,
52475
+ target_date: params.target_date
52298
52476
  });
52299
52477
  const p2 = data.project;
52300
52478
  return `Created project "${p2.name}" [${p2.status}] (id: ${p2.id}). Tag artefacts with artefacts_assign_project and tasks with kanban_assign_project.`;
@@ -52305,7 +52483,9 @@ server.tool(
52305
52483
  {
52306
52484
  name: external_exports.string().min(1).max(200).describe('Human-readable project name (e.g. "Q3 launch microsite")'),
52307
52485
  status: external_exports.enum(["active", "archived"]).optional().describe('Project status (default "active")'),
52308
- linear_project_id: external_exports.string().optional().describe("Optional id of a Linear project to deep-link this project to")
52486
+ linear_project_id: external_exports.string().optional().describe("Optional id of a Linear project to deep-link this project to"),
52487
+ owner_person_id: external_exports.string().uuid().optional().describe("Optional: the ONE person accountable for the project (a person_id from directory_lookup, in your organization)"),
52488
+ target_date: external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional().describe("Optional: the date the outcome is due, YYYY-MM-DD")
52309
52489
  },
52310
52490
  async (params) => ({
52311
52491
  content: [{ type: "text", text: await createProjectText(params) }]
@@ -52318,7 +52498,9 @@ async function updateProjectText(params) {
52318
52498
  agent_id: AGT_AGENT_ID,
52319
52499
  name: params.name,
52320
52500
  status: params.status,
52321
- linear_project_id: params.linear_project_id
52501
+ linear_project_id: params.linear_project_id,
52502
+ owner_person_id: params.owner_person_id,
52503
+ target_date: params.target_date
52322
52504
  }
52323
52505
  );
52324
52506
  const p2 = data.project;
@@ -52326,13 +52508,15 @@ async function updateProjectText(params) {
52326
52508
  }
52327
52509
  server.tool(
52328
52510
  "projects_update",
52329
- 'Rename a project, archive or unarchive it, or set/clear its Linear link. Pass only the fields to change. A project is shared by your whole team, so ask the human to confirm before renaming or archiving one, naming the project and the change (e.g. archive "Theoretical Store Profitability"). Archiving hides it from active lists but keeps its tasks and artefacts; set status "active" to undo. Projects have no cover image, so there is nothing to set for one.',
52511
+ 'Rename a project, archive or unarchive it, or set/clear its Linear link. Pass only the fields to change. A project is shared by your whole team, so ask the human to confirm before renaming or archiving one, naming the project and the change (e.g. archive "Theoretical Store Profitability"). Archiving hides it from active lists but keeps its tasks and artefacts; set status "active" to undo. Projects have no cover image, so there is nothing to set for one. You can also set or clear its one accountable owner (a person_id from directory_lookup) and its target date (YYYY-MM-DD); pass null to clear either.',
52330
52512
  {
52331
52513
  project_id: external_exports.string().uuid().describe("The project id returned by projects_list"),
52332
52514
  // Trim BEFORE the length check, as the host does (CodeRabbit on #6642).
52333
52515
  name: external_exports.string().trim().min(1).max(200).optional().describe("New project name"),
52334
52516
  status: external_exports.enum(["active", "archived"]).optional().describe('"archived" to archive, "active" to unarchive'),
52335
- linear_project_id: external_exports.string().nullable().optional().describe("Linear project id to deep-link, or null to clear the link")
52517
+ linear_project_id: external_exports.string().nullable().optional().describe("Linear project id to deep-link, or null to clear the link"),
52518
+ owner_person_id: external_exports.string().uuid().nullable().optional().describe("The ONE accountable person (a person_id from directory_lookup), or null to clear"),
52519
+ target_date: external_exports.string().regex(/^\d{4}-\d{2}-\d{2}$/).nullable().optional().describe("Date the outcome is due, YYYY-MM-DD, or null to clear")
52336
52520
  },
52337
52521
  async (params) => ({
52338
52522
  content: [{ type: "text", text: await updateProjectText(params) }]