@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.
- package/dist/bin/agt.js +5 -5
- package/dist/{chunk-LQCWKNFX.js → chunk-7U4VSBOE.js} +2 -2
- package/dist/{chunk-WIU4HUHD.js → chunk-DYFE224A.js} +33 -1
- package/dist/{chunk-WIU4HUHD.js.map → chunk-DYFE224A.js.map} +1 -1
- package/dist/{chunk-HZFUOGUV.js → chunk-PI2WUKWD.js} +4 -4
- package/dist/{claude-pair-runtime-OZLZFJZR.js → claude-pair-runtime-BOTE3DRW.js} +2 -2
- package/dist/lib/manager-worker.js +261 -16
- package/dist/lib/manager-worker.js.map +1 -1
- package/dist/mcp/augmented-admin.js +164 -54
- package/dist/mcp/augmented-help-kb.js +164 -54
- package/dist/mcp/augmented-support.js +164 -54
- package/dist/mcp/direct-chat-channel.js +121 -41
- package/dist/mcp/index.js +243 -59
- package/dist/mcp/origami.js +121 -41
- package/dist/mcp/slack-channel.js +121 -41
- package/dist/mcp/teams-channel.js +89 -41
- package/dist/mcp/telegram-channel.js +121 -41
- package/dist/mcp/whatsapp-channel.js +5447 -4340
- package/dist/mcp/whatsapp-link.js +5442 -4383
- package/dist/mcp/xero.js +6048 -2067
- package/dist/{persistent-session-2X3BCGV5.js → persistent-session-6O66QEI4.js} +3 -3
- package/dist/{responsiveness-probe-QFLFS5QX.js → responsiveness-probe-WGD3NDWG.js} +3 -3
- package/dist/{session-auth-dead-QE7GT5Y5.js → session-auth-dead-6N2AEFKX.js} +2 -2
- package/package.json +2 -2
- /package/dist/{chunk-LQCWKNFX.js.map → chunk-7U4VSBOE.js.map} +0 -0
- /package/dist/{chunk-HZFUOGUV.js.map → chunk-PI2WUKWD.js.map} +0 -0
- /package/dist/{claude-pair-runtime-OZLZFJZR.js.map → claude-pair-runtime-BOTE3DRW.js.map} +0 -0
- /package/dist/{persistent-session-2X3BCGV5.js.map → persistent-session-6O66QEI4.js.map} +0 -0
- /package/dist/{responsiveness-probe-QFLFS5QX.js.map → responsiveness-probe-WGD3NDWG.js.map} +0 -0
- /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.
|
|
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.
|
|
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
|
-
*
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
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 &&
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
46442
|
-
|
|
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
|
-
|
|
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) }]
|