@sentry/junior 0.143.0 → 0.145.0
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/{agent-hooks-2EP3QS47.js → agent-hooks-L7D2BDVV.js} +10 -10
- package/dist/api/conversations/detail.d.ts +9 -0
- package/dist/api/schema/conversation.d.ts +20 -0
- package/dist/api/schema/task.d.ts +40 -1
- package/dist/api/schema.d.ts +3 -3
- package/dist/api/schema.js +5 -1
- package/dist/api.js +2250 -2172
- package/dist/app.js +335 -409
- package/dist/{catalog-runtime-IAVW4W3B.js → catalog-runtime-QLAC4Q3W.js} +5 -5
- package/dist/chat/agent/request.d.ts +1 -1
- package/dist/chat/agent/resume.d.ts +6 -15
- package/dist/chat/agent/tools.d.ts +1 -1
- package/dist/chat/agent-dispatch/types.d.ts +1 -1
- package/dist/chat/app/conversation-work.d.ts +24 -0
- package/dist/chat/conversations/projection.d.ts +11 -3
- package/dist/chat/conversations/store.d.ts +1 -1
- package/dist/chat/runtime/agent-run-outcome.d.ts +1 -1
- package/dist/chat/runtime/reply-executor.d.ts +5 -5
- package/dist/chat/runtime/slack-resume.d.ts +12 -4
- package/dist/chat/scheduled-tasks/store.d.ts +1 -0
- package/dist/chat/scheduled-tasks/tool-support.d.ts +26 -1
- package/dist/chat/scheduled-tasks/tools/create.d.ts +10 -0
- package/dist/chat/scheduled-tasks/tools/delete.d.ts +10 -0
- package/dist/chat/scheduled-tasks/tools/list.d.ts +15 -2
- package/dist/chat/scheduled-tasks/tools/run-now.d.ts +10 -0
- package/dist/chat/scheduled-tasks/tools/update.d.ts +12 -1
- package/dist/chat/services/guardian-action-policy.d.ts +1 -1
- package/dist/chat/state/locks.d.ts +28 -0
- package/dist/chat/task-execution/checkpoint.d.ts +86 -0
- package/dist/chat/task-execution/paused-turn.d.ts +29 -0
- package/dist/chat/task-execution/queue-signing.d.ts +1 -0
- package/dist/chat/task-execution/queue.d.ts +7 -1
- package/dist/chat/task-execution/slack-work.d.ts +1 -1
- package/dist/chat/task-execution/state.d.ts +4 -4
- package/dist/chat/task-execution/store.d.ts +2 -2
- package/dist/chat/task-execution/turn-cursor-keys.d.ts +6 -0
- package/dist/chat/{state/turn-session.d.ts → task-execution/turn-cursor.d.ts} +52 -42
- package/dist/chat/task-execution/turn-wake.d.ts +29 -0
- package/dist/chat/tasks/execution-stats.d.ts +21 -0
- package/dist/chat/tasks/read.d.ts +9 -1
- package/dist/chat/tools/types.d.ts +1 -1
- package/dist/{chunk-2KLMGRRQ.js → chunk-27TEJTZO.js} +1 -1
- package/dist/{chunk-GZRWULXF.js → chunk-2LWPFSB4.js} +1 -1
- package/dist/{chunk-NAINBOZQ.js → chunk-2UH3JI64.js} +10 -9
- package/dist/{chunk-QFWXGUAH.js → chunk-2XET6PKP.js} +93 -89
- package/dist/{chunk-U5ATCOHE.js → chunk-5PNPQYTO.js} +2 -2
- package/dist/{chunk-XYJNNZYR.js → chunk-64SBYW2O.js} +397 -288
- package/dist/{chunk-F6RWNJBK.js → chunk-B46ZMVOV.js} +5 -5
- package/dist/{chunk-BJ6ISBOA.js → chunk-CD2XFGYQ.js} +1 -1
- package/dist/{chunk-WSWVWP2V.js → chunk-DS3J6WGY.js} +1 -1
- package/dist/{chunk-OG5JQHKR.js → chunk-DXEQAIUV.js} +1 -1
- package/dist/{chunk-A3XPSABC.js → chunk-EIX2LQ6L.js} +82 -4
- package/dist/{chunk-ANG7IWAI.js → chunk-FUBRJA5F.js} +6 -6
- package/dist/{chunk-OB7ZJK7Y.js → chunk-GDV5LXRA.js} +1 -1
- package/dist/{chunk-AEFJN7OK.js → chunk-GUWLDMGF.js} +4 -4
- package/dist/{chunk-I4NQNZVW.js → chunk-HISR3DTV.js} +33 -61
- package/dist/{chunk-WM4PRM7W.js → chunk-HLOUZC5C.js} +32 -34
- package/dist/{chunk-RABHACKG.js → chunk-I47UGQPJ.js} +7 -7
- package/dist/{chunk-IUFM5JWV.js → chunk-JAL3CH4G.js} +3 -0
- package/dist/{chunk-OGQGJAD7.js → chunk-JLMVCNXL.js} +26 -1
- package/dist/{chunk-5YJBS4I5.js → chunk-JTGS3ZZE.js} +1 -1
- package/dist/{chunk-LSBQHDI2.js → chunk-LVVSIMBB.js} +1 -1
- package/dist/{chunk-2T5CHXRZ.js → chunk-PJ4NMVQB.js} +2 -2
- package/dist/{chunk-I5PIM72M.js → chunk-QJBDABQA.js} +14 -17
- package/dist/{chunk-M2T7MHQJ.js → chunk-QUG4JSZK.js} +43 -1
- package/dist/{chunk-X5SC2UGE.js → chunk-RUSS62EN.js} +14 -14
- package/dist/{chunk-NVFVM67W.js → chunk-SIN3MXH6.js} +1 -1
- package/dist/{chunk-I25V3XRN.js → chunk-TZRXYWRE.js} +2 -2
- package/dist/{chunk-WJHWOAVZ.js → chunk-VTDMB7XX.js} +1 -1
- package/dist/{chunk-TPJK6AVJ.js → chunk-WF5HVH3M.js} +1 -1
- package/dist/{chunk-KCBZSJRU.js → chunk-WR76IVA5.js} +5 -2
- package/dist/{chunk-7GVX5SOG.js → chunk-XFKIRN3Q.js} +29 -29
- package/dist/{chunk-UFCA4EZB.js → chunk-YD54Q45G.js} +4 -4
- package/dist/{chunk-PBV7VXUA.js → chunk-ZIAMN2UW.js} +407 -523
- package/dist/{chunk-SNBTWIQO.js → chunk-ZIMRGFYL.js} +6 -6
- package/dist/{chunk-STX5WIH6.js → chunk-ZYAJMESY.js} +2 -2
- package/dist/cli/chat.js +32 -32
- package/dist/cli/check.js +6 -6
- package/dist/cli/plugins.js +13 -13
- package/dist/cli/snapshot-create.js +9 -9
- package/dist/cli/upgrade.js +7 -7
- package/dist/{db-RBXBVEVO.js → db-62PW6LM3.js} +7 -7
- package/dist/instrumentation.js +4 -4
- package/dist/nitro.js +4 -4
- package/dist/{oauth-callback-server-LRB6BX6C.js → oauth-callback-server-6NZNHJAM.js} +25 -25
- package/dist/{runner-WK5VUOW6.js → runner-GCRPG3GQ.js} +19 -18
- package/dist/{skills-MJWRME3A.js → skills-2S3MDFIQ.js} +6 -6
- package/dist/spawn-7WK37BTD.js +39 -0
- package/dist/{validation-556WSWVU.js → validation-HAOLCJ5A.js} +6 -6
- package/dist/version.js +1 -1
- package/dist/{work-W6IXSPY3.js → work-R4XYKMUW.js} +17 -16
- package/dist/worker-U2UCVR7M.js +24 -0
- package/package.json +5 -5
- package/dist/chat/agent/session.d.ts +0 -19
- package/dist/chat/runtime/agent-continue-runner.d.ts +0 -37
- package/dist/chat/services/agent-continue.d.ts +0 -29
- package/dist/chat/services/turn-session-record.d.ts +0 -164
- package/dist/chat/state/turn-session-keys.d.ts +0 -6
- package/dist/spawn-ZCW6UOAA.js +0 -38
- package/dist/worker-5KM346HH.js +0 -24
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
PluginCredentialFailureError,
|
|
8
8
|
agentNameSchema,
|
|
9
9
|
createPluginAuthOrchestration
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-B46ZMVOV.js";
|
|
11
11
|
import {
|
|
12
12
|
authorizationId
|
|
13
13
|
} from "./chunk-DIB4GX3G.js";
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
patchMcpAuthSession,
|
|
29
29
|
selectPluginGrant,
|
|
30
30
|
toMcpProviderError
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-I47UGQPJ.js";
|
|
32
32
|
import {
|
|
33
33
|
RetryableDeliveryError,
|
|
34
34
|
actorFromRouting,
|
|
@@ -44,12 +44,12 @@ import {
|
|
|
44
44
|
getSlackMessagePermalink,
|
|
45
45
|
resolveBaseUrl,
|
|
46
46
|
uploadFilesToConversation
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-FUBRJA5F.js";
|
|
48
48
|
import {
|
|
49
49
|
estimateTextTokens,
|
|
50
50
|
getAgentContextCompactionTriggerTokens,
|
|
51
51
|
getAgentContextInputLimitTokens
|
|
52
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-VTDMB7XX.js";
|
|
53
53
|
import {
|
|
54
54
|
AGENTS_REMOVAL_NOTICE,
|
|
55
55
|
AGENTS_REPLACEMENT_NOTICE,
|
|
@@ -66,6 +66,7 @@ import {
|
|
|
66
66
|
canReusePendingAuthLink,
|
|
67
67
|
collectFiles,
|
|
68
68
|
containsNoReplyMarker,
|
|
69
|
+
continuableMessages,
|
|
69
70
|
decideReply,
|
|
70
71
|
extractAssistantText,
|
|
71
72
|
findSingleRepositoryDirectory,
|
|
@@ -86,17 +87,13 @@ import {
|
|
|
86
87
|
isTurnInputCommitLostError,
|
|
87
88
|
loadConnectedMcpProviders,
|
|
88
89
|
loadConversationProjection,
|
|
90
|
+
loadTurnCheckpoint,
|
|
89
91
|
loadTurnRoute,
|
|
90
|
-
loadTurnSessionRecord,
|
|
91
92
|
mergeArtifactsState,
|
|
92
93
|
missingPathSearchResult,
|
|
93
94
|
normalizeToLf,
|
|
94
95
|
normalizeToolNameFromResult,
|
|
95
96
|
openConversationProjection,
|
|
96
|
-
persistAuthPauseSessionRecord,
|
|
97
|
-
persistContinuationSessionRecord,
|
|
98
|
-
persistRunningSessionRecord,
|
|
99
|
-
persistYieldSessionRecord,
|
|
100
97
|
piMessageFromHistoryItem,
|
|
101
98
|
positiveInteger,
|
|
102
99
|
recordAgentsInstructionsUpdated,
|
|
@@ -110,10 +107,11 @@ import {
|
|
|
110
107
|
resolveWorkspacePath,
|
|
111
108
|
retainRuntimeTurnContext,
|
|
112
109
|
sanitizeAssistantText,
|
|
110
|
+
saveTurnCheckpoint,
|
|
113
111
|
stripRuntimeTurnContext,
|
|
114
112
|
trimTrailingAssistantMessages,
|
|
115
113
|
truncateText
|
|
116
|
-
} from "./chunk-
|
|
114
|
+
} from "./chunk-ZIAMN2UW.js";
|
|
117
115
|
import {
|
|
118
116
|
JUNIOR_THREAD_STATE_TTL_MS
|
|
119
117
|
} from "./chunk-3Y47VMHV.js";
|
|
@@ -145,7 +143,7 @@ import {
|
|
|
145
143
|
runNonInteractiveCommand,
|
|
146
144
|
throwSandboxOperationError,
|
|
147
145
|
wrapSandboxSetupError
|
|
148
|
-
} from "./chunk-
|
|
146
|
+
} from "./chunk-GUWLDMGF.js";
|
|
149
147
|
import {
|
|
150
148
|
SCHEDULED_TASK_SYSTEM_ACTOR,
|
|
151
149
|
compactEventTask,
|
|
@@ -177,15 +175,15 @@ import {
|
|
|
177
175
|
saveEventTask,
|
|
178
176
|
scheduledTaskAttributes,
|
|
179
177
|
writableEventTask
|
|
180
|
-
} from "./chunk-
|
|
178
|
+
} from "./chunk-YD54Q45G.js";
|
|
181
179
|
import {
|
|
182
180
|
parseSlackThreadId
|
|
183
|
-
} from "./chunk-
|
|
181
|
+
} from "./chunk-DXEQAIUV.js";
|
|
184
182
|
import {
|
|
185
183
|
SHORT_TITLE_MAX_LENGTH,
|
|
186
184
|
generateShortTitle,
|
|
187
185
|
resolveTaskTitle
|
|
188
|
-
} from "./chunk-
|
|
186
|
+
} from "./chunk-ZYAJMESY.js";
|
|
189
187
|
import {
|
|
190
188
|
ToolInputError,
|
|
191
189
|
addAgentTurnUsage,
|
|
@@ -203,7 +201,7 @@ import {
|
|
|
203
201
|
getSlackToolContext,
|
|
204
202
|
readActorIdentity,
|
|
205
203
|
resolveChannelCapabilities
|
|
206
|
-
} from "./chunk-
|
|
204
|
+
} from "./chunk-ZIMRGFYL.js";
|
|
207
205
|
import {
|
|
208
206
|
SlackActionError,
|
|
209
207
|
downloadPrivateSlackFile,
|
|
@@ -212,7 +210,7 @@ import {
|
|
|
212
210
|
isConversationScopedChannel,
|
|
213
211
|
normalizeSlackConversationId,
|
|
214
212
|
withSlackRetries
|
|
215
|
-
} from "./chunk-
|
|
213
|
+
} from "./chunk-TZRXYWRE.js";
|
|
216
214
|
import {
|
|
217
215
|
KNOWN_CONVERSATION_EVENT_TYPES,
|
|
218
216
|
contextProvenance,
|
|
@@ -223,7 +221,7 @@ import {
|
|
|
223
221
|
instructionActors,
|
|
224
222
|
instructionProvenanceFor,
|
|
225
223
|
sameActorIdentity
|
|
226
|
-
} from "./chunk-
|
|
224
|
+
} from "./chunk-2UH3JI64.js";
|
|
227
225
|
import {
|
|
228
226
|
SANDBOX_DATA_ROOT,
|
|
229
227
|
SANDBOX_SKILLS_ROOT,
|
|
@@ -235,7 +233,7 @@ import {
|
|
|
235
233
|
} from "./chunk-EM225ITJ.js";
|
|
236
234
|
import {
|
|
237
235
|
getStateAdapter
|
|
238
|
-
} from "./chunk-
|
|
236
|
+
} from "./chunk-QUG4JSZK.js";
|
|
239
237
|
import {
|
|
240
238
|
ACTIVE_TURN_COMPACTION_SUMMARY_PREFIX,
|
|
241
239
|
COMPACTION_SUMMARY_PREFIX,
|
|
@@ -269,7 +267,7 @@ import {
|
|
|
269
267
|
resolveGatewayCredential,
|
|
270
268
|
resolveGatewayModel,
|
|
271
269
|
unwrapCurrentInstruction
|
|
272
|
-
} from "./chunk-
|
|
270
|
+
} from "./chunk-XFKIRN3Q.js";
|
|
273
271
|
import {
|
|
274
272
|
canExposeConversationPayload,
|
|
275
273
|
resolveConversationPrivacy,
|
|
@@ -279,16 +277,16 @@ import {
|
|
|
279
277
|
toGenAiMessagesTraceAttributes,
|
|
280
278
|
toGenAiPayloadMetadata,
|
|
281
279
|
toGenAiPayloadTraceAttributes
|
|
282
|
-
} from "./chunk-
|
|
280
|
+
} from "./chunk-JTGS3ZZE.js";
|
|
283
281
|
import {
|
|
284
282
|
discoverSkills,
|
|
285
283
|
findSkillByName,
|
|
286
284
|
loadSkillsByName,
|
|
287
285
|
parseSkillInvocation
|
|
288
|
-
} from "./chunk-
|
|
286
|
+
} from "./chunk-5PNPQYTO.js";
|
|
289
287
|
import {
|
|
290
288
|
pluginCatalogRuntime
|
|
291
|
-
} from "./chunk-
|
|
289
|
+
} from "./chunk-SIN3MXH6.js";
|
|
292
290
|
import {
|
|
293
291
|
CredentialUnavailableError,
|
|
294
292
|
OAuthProviderError,
|
|
@@ -296,7 +294,7 @@ import {
|
|
|
296
294
|
getOAuthProviderErrorAttributes,
|
|
297
295
|
resolveAuthTokenPlaceholder,
|
|
298
296
|
resolvePluginCommandEnv
|
|
299
|
-
} from "./chunk-
|
|
297
|
+
} from "./chunk-CD2XFGYQ.js";
|
|
300
298
|
import {
|
|
301
299
|
credentialUserSubjectId
|
|
302
300
|
} from "./chunk-RUIXF3YQ.js";
|
|
@@ -325,7 +323,7 @@ import {
|
|
|
325
323
|
summarizeMessageText,
|
|
326
324
|
withLogContext,
|
|
327
325
|
withSpan
|
|
328
|
-
} from "./chunk-
|
|
326
|
+
} from "./chunk-2LWPFSB4.js";
|
|
329
327
|
import {
|
|
330
328
|
startInactiveSpan,
|
|
331
329
|
withActiveSpan
|
|
@@ -1404,21 +1402,6 @@ function actionConfirmationRetryMessages(messages) {
|
|
|
1404
1402
|
return retryMessages;
|
|
1405
1403
|
}
|
|
1406
1404
|
|
|
1407
|
-
// src/chat/agent/session.ts
|
|
1408
|
-
async function restoreSessionRecord(args) {
|
|
1409
|
-
const sessionRecordState = await loadTurnSessionRecord({
|
|
1410
|
-
conversationId: args.conversationId,
|
|
1411
|
-
sessionId: args.turnId
|
|
1412
|
-
});
|
|
1413
|
-
const { resumedFromSessionRecord, currentSliceId, existingSessionRecord } = sessionRecordState;
|
|
1414
|
-
return {
|
|
1415
|
-
currentSliceId,
|
|
1416
|
-
existingSessionRecord,
|
|
1417
|
-
resumedFromSessionRecord,
|
|
1418
|
-
sessionRecordState
|
|
1419
|
-
};
|
|
1420
|
-
}
|
|
1421
|
-
|
|
1422
1405
|
// src/chat/mcp/tool-name.ts
|
|
1423
1406
|
function parseMcpProviderFromToolName(toolName) {
|
|
1424
1407
|
if (!toolName.startsWith("mcp__")) return void 0;
|
|
@@ -8956,6 +8939,11 @@ var compactTaskResultSchema = z28.object({
|
|
|
8956
8939
|
timezone: z28.string(),
|
|
8957
8940
|
recurrence: z28.unknown().nullable(),
|
|
8958
8941
|
next_run_at: z28.string().nullable(),
|
|
8942
|
+
destination: z28.object({
|
|
8943
|
+
platform: z28.literal("slack"),
|
|
8944
|
+
team_id: z28.string().min(1),
|
|
8945
|
+
channel_id: z28.string().min(1)
|
|
8946
|
+
}).strict(),
|
|
8959
8947
|
conversation_access: z28.object({
|
|
8960
8948
|
audience: z28.enum(["direct", "group", "channel"]),
|
|
8961
8949
|
visibility: z28.enum(["private", "public"])
|
|
@@ -9050,7 +9038,7 @@ async function getWritableTask(args) {
|
|
|
9050
9038
|
}
|
|
9051
9039
|
if (!sameDestination(task, destination)) {
|
|
9052
9040
|
throwToolInputError(
|
|
9053
|
-
"Scheduled task can only be managed from the Slack destination where it
|
|
9041
|
+
"Scheduled task can only be managed from the Slack destination where it currently delivers."
|
|
9054
9042
|
);
|
|
9055
9043
|
}
|
|
9056
9044
|
return task;
|
|
@@ -9072,6 +9060,11 @@ function compactTask(task) {
|
|
|
9072
9060
|
day_of_month: task.schedule.recurrence.dayOfMonth
|
|
9073
9061
|
} : null,
|
|
9074
9062
|
next_run_at: task.nextRunAtMs ? new Date(task.nextRunAtMs).toISOString() : null,
|
|
9063
|
+
destination: {
|
|
9064
|
+
platform: "slack",
|
|
9065
|
+
team_id: task.destination.teamId,
|
|
9066
|
+
channel_id: task.destination.channelId
|
|
9067
|
+
},
|
|
9075
9068
|
conversation_access: task.conversationAccess,
|
|
9076
9069
|
credential_mode: task.credentialMode,
|
|
9077
9070
|
dashboard_url: getDashboardTaskLink(task.id) ?? null,
|
|
@@ -9276,26 +9269,96 @@ function createSlackScheduleDeleteTaskTool(context) {
|
|
|
9276
9269
|
});
|
|
9277
9270
|
}
|
|
9278
9271
|
|
|
9279
|
-
// src/chat/
|
|
9272
|
+
// src/chat/slack/id-param.ts
|
|
9280
9273
|
import { z as z31 } from "zod";
|
|
9274
|
+
function slackChannelIdParam(description) {
|
|
9275
|
+
return z31.string().min(1).describe(description);
|
|
9276
|
+
}
|
|
9277
|
+
function slackUserIdParam(description) {
|
|
9278
|
+
return z31.string().min(1).describe(description);
|
|
9279
|
+
}
|
|
9280
|
+
function parseRequiredSlackChannelIdParam(field, value) {
|
|
9281
|
+
const channelId = parseSlackChannelId(value);
|
|
9282
|
+
if (channelId) {
|
|
9283
|
+
return { ok: true, value: channelId };
|
|
9284
|
+
}
|
|
9285
|
+
return {
|
|
9286
|
+
ok: false,
|
|
9287
|
+
error: `Invalid \`${field}\` Slack channel ID. Use a Slack conversation ID like \`C123\`, \`G123\`, or \`D123\`.`
|
|
9288
|
+
};
|
|
9289
|
+
}
|
|
9290
|
+
function parseRequiredSlackUserIdParam(field, value) {
|
|
9291
|
+
const userId = parseSlackUserId(value);
|
|
9292
|
+
if (userId) {
|
|
9293
|
+
return { ok: true, value: userId };
|
|
9294
|
+
}
|
|
9295
|
+
return {
|
|
9296
|
+
ok: false,
|
|
9297
|
+
error: `Invalid \`${field}\` Slack user ID. Use a Slack user ID like \`U123\` or \`W123\`.`
|
|
9298
|
+
};
|
|
9299
|
+
}
|
|
9300
|
+
|
|
9301
|
+
// src/chat/scheduled-tasks/tools/list.ts
|
|
9302
|
+
import { z as z32 } from "zod";
|
|
9303
|
+
function taskMatchesQuery(task, query) {
|
|
9304
|
+
const normalized = query.toLowerCase();
|
|
9305
|
+
return [
|
|
9306
|
+
task.title,
|
|
9307
|
+
task.task.text,
|
|
9308
|
+
task.schedule.description,
|
|
9309
|
+
task.schedule.timezone,
|
|
9310
|
+
task.status
|
|
9311
|
+
].some((value) => value?.toLowerCase().includes(normalized));
|
|
9312
|
+
}
|
|
9281
9313
|
function createSlackScheduleListTasksTool(context) {
|
|
9282
9314
|
return zodTool({
|
|
9283
|
-
description: "List scheduled
|
|
9315
|
+
description: "List scheduled tasks in this Slack conversation. To find one of the requester's tasks elsewhere in the workspace, pass channel_id and/or query.",
|
|
9284
9316
|
annotations: {
|
|
9285
9317
|
destructiveHint: false,
|
|
9286
9318
|
idempotentHint: true,
|
|
9287
9319
|
openWorldHint: false,
|
|
9288
9320
|
readOnlyHint: true
|
|
9289
9321
|
},
|
|
9290
|
-
inputSchema:
|
|
9322
|
+
inputSchema: z32.object({
|
|
9323
|
+
channel_id: slackChannelIdParam(
|
|
9324
|
+
"Current destination channel ID to filter by. Use the ID from a channel mention; do not guess."
|
|
9325
|
+
).nullable().optional(),
|
|
9326
|
+
query: z32.string().trim().min(1).max(200).nullable().describe("Text to match in the requester's scheduled tasks.").optional()
|
|
9327
|
+
}).strict(),
|
|
9291
9328
|
outputSchema: scheduleListToolResultSchema,
|
|
9292
|
-
execute: async () => {
|
|
9329
|
+
execute: async (input) => {
|
|
9293
9330
|
const destination = requireActiveConversation(context);
|
|
9294
|
-
const
|
|
9295
|
-
|
|
9296
|
-
)
|
|
9297
|
-
|
|
9298
|
-
|
|
9331
|
+
const actor = requireActor(context, destination);
|
|
9332
|
+
let channelId;
|
|
9333
|
+
if (input.channel_id != null) {
|
|
9334
|
+
const parsed = parseRequiredSlackChannelIdParam(
|
|
9335
|
+
"channel_id",
|
|
9336
|
+
input.channel_id
|
|
9337
|
+
);
|
|
9338
|
+
if (!parsed.ok) {
|
|
9339
|
+
throwToolInputError(parsed.error);
|
|
9340
|
+
}
|
|
9341
|
+
channelId = parsed.value;
|
|
9342
|
+
}
|
|
9343
|
+
const query = input.query?.trim() || void 0;
|
|
9344
|
+
const crossConversation = Boolean(query) || channelId !== void 0 && channelId !== destination.channelId;
|
|
9345
|
+
const matching = (await schedulerStore(context).listTasksForTeam(destination.teamId)).filter((task) => {
|
|
9346
|
+
if (task.destination.platform !== "slack") return false;
|
|
9347
|
+
if (task.destination.teamId !== destination.teamId) return false;
|
|
9348
|
+
if (task.status === "completed") return false;
|
|
9349
|
+
if (channelId && task.destination.channelId !== channelId) {
|
|
9350
|
+
return false;
|
|
9351
|
+
}
|
|
9352
|
+
if (!crossConversation && !sameDestination(task, destination)) {
|
|
9353
|
+
return false;
|
|
9354
|
+
}
|
|
9355
|
+
if (crossConversation && !sameDestination(task, destination) && task.createdBy.slackUserId !== actor.slackUserId) {
|
|
9356
|
+
return false;
|
|
9357
|
+
}
|
|
9358
|
+
if (query && !taskMatchesQuery(task, query)) return false;
|
|
9359
|
+
return true;
|
|
9360
|
+
}).sort(
|
|
9361
|
+
(left, right) => right.createdAtMs - left.createdAtMs || right.id.localeCompare(left.id)
|
|
9299
9362
|
);
|
|
9300
9363
|
const visible = matching.slice(0, MAX_LISTED_TASKS).map(compactTask);
|
|
9301
9364
|
return scheduleListToolResult({
|
|
@@ -9308,7 +9371,7 @@ function createSlackScheduleListTasksTool(context) {
|
|
|
9308
9371
|
}
|
|
9309
9372
|
|
|
9310
9373
|
// src/chat/scheduled-tasks/tools/run-now.ts
|
|
9311
|
-
import { z as
|
|
9374
|
+
import { z as z33 } from "zod";
|
|
9312
9375
|
function createSlackScheduleRunTaskNowTool(context) {
|
|
9313
9376
|
return zodTool({
|
|
9314
9377
|
approvalMode: "review",
|
|
@@ -9320,8 +9383,8 @@ function createSlackScheduleRunTaskNowTool(context) {
|
|
|
9320
9383
|
},
|
|
9321
9384
|
description: "Queue an existing active scheduled Junior task to run as soon as possible, without changing its cadence. Use when the user asks to run an existing scheduled task now. Use only task IDs returned for this conversation.",
|
|
9322
9385
|
executionMode: "sequential",
|
|
9323
|
-
inputSchema:
|
|
9324
|
-
task_id:
|
|
9386
|
+
inputSchema: z33.object({
|
|
9387
|
+
task_id: z33.string().min(1).describe(
|
|
9325
9388
|
"ID of the active task to run now. Must be from this active Slack conversation."
|
|
9326
9389
|
)
|
|
9327
9390
|
}),
|
|
@@ -9349,7 +9412,7 @@ function createSlackScheduleRunTaskNowTool(context) {
|
|
|
9349
9412
|
}
|
|
9350
9413
|
|
|
9351
9414
|
// src/chat/scheduled-tasks/tools/update.ts
|
|
9352
|
-
import { z as
|
|
9415
|
+
import { z as z34 } from "zod";
|
|
9353
9416
|
function createSlackScheduleUpdateTaskTool(context) {
|
|
9354
9417
|
return zodTool({
|
|
9355
9418
|
approvalMode: "review",
|
|
@@ -9359,41 +9422,71 @@ function createSlackScheduleUpdateTaskTool(context) {
|
|
|
9359
9422
|
openWorldHint: true,
|
|
9360
9423
|
readOnlyHint: false
|
|
9361
9424
|
},
|
|
9362
|
-
description:
|
|
9425
|
+
description: `Update a scheduled task. To move the requester's task into this Slack conversation, set destination to "here".`,
|
|
9363
9426
|
executionMode: "sequential",
|
|
9364
|
-
inputSchema:
|
|
9365
|
-
task_id:
|
|
9366
|
-
|
|
9367
|
-
),
|
|
9368
|
-
|
|
9369
|
-
|
|
9370
|
-
"Complete replacement schedule when rescheduling. Omit for task, status, or credential-only changes; the scheduler computes the next run."
|
|
9371
|
-
).nullable().optional(),
|
|
9372
|
-
status: z33.enum(["active", "blocked"]).describe(
|
|
9373
|
-
"Set to active to clear a blocked task, or blocked when dispatch cannot continue."
|
|
9427
|
+
inputSchema: z34.object({
|
|
9428
|
+
task_id: z34.string().min(1).describe("Scheduled task ID returned by slackScheduleListTasks."),
|
|
9429
|
+
task: z34.string().min(1).max(4e3).optional(),
|
|
9430
|
+
schedule: scheduleIntentSchema.describe("Complete replacement schedule. Omit to keep it unchanged.").nullable().optional(),
|
|
9431
|
+
status: z34.enum(["active", "blocked"]).describe(
|
|
9432
|
+
"Set active to resume a blocked task, or blocked to stop dispatch."
|
|
9374
9433
|
).optional(),
|
|
9375
|
-
|
|
9376
|
-
|
|
9434
|
+
destination: z34.literal("here").nullable().describe(
|
|
9435
|
+
`Set to "here" to move the creator's task into this Slack conversation. Omit to keep its destination.`
|
|
9436
|
+
).optional(),
|
|
9437
|
+
credential_mode: z34.enum(["system", "creator"]).nullable().describe(
|
|
9438
|
+
"Use creator credentials or system credentials. Only the task creator may enable creator mode. Omit to keep unchanged."
|
|
9377
9439
|
).optional()
|
|
9378
9440
|
}).strict(),
|
|
9379
9441
|
outputSchema: scheduleTaskToolResultSchema,
|
|
9380
9442
|
execute: async (input) => {
|
|
9381
|
-
const
|
|
9382
|
-
|
|
9383
|
-
|
|
9384
|
-
|
|
9443
|
+
const activeDestination = requireActiveConversation(context);
|
|
9444
|
+
const actor = requireActor(context, activeDestination);
|
|
9445
|
+
const store = schedulerStore(context);
|
|
9446
|
+
const lookup = await store.getTask(input.task_id);
|
|
9447
|
+
if (!lookup || lookup.status === "deleted") {
|
|
9448
|
+
throwToolInputError("Scheduled task was not found.");
|
|
9449
|
+
}
|
|
9385
9450
|
if (lookup.status === "completed") {
|
|
9386
9451
|
throwToolInputError(
|
|
9387
9452
|
"Completed scheduled tasks cannot be updated. Create a new task instead."
|
|
9388
9453
|
);
|
|
9389
9454
|
}
|
|
9390
|
-
|
|
9455
|
+
if (lookup.destination.platform !== "slack") {
|
|
9456
|
+
throwToolInputError("Scheduled task destination is invalid.");
|
|
9457
|
+
}
|
|
9458
|
+
if (lookup.destination.teamId !== activeDestination.teamId) {
|
|
9459
|
+
throwToolInputError(
|
|
9460
|
+
"Scheduled tasks can only be managed within the same Slack workspace."
|
|
9461
|
+
);
|
|
9462
|
+
}
|
|
9463
|
+
const moveHere = input.destination === "here";
|
|
9464
|
+
const alreadyHere = sameDestination(lookup, activeDestination);
|
|
9391
9465
|
const isCreator = actor.slackUserId === lookup.createdBy.slackUserId;
|
|
9466
|
+
if (!alreadyHere && !moveHere) {
|
|
9467
|
+
throwToolInputError(
|
|
9468
|
+
'Scheduled task can only be managed from the Slack destination where it currently delivers. Set destination to "here" to move it into this conversation.'
|
|
9469
|
+
);
|
|
9470
|
+
}
|
|
9471
|
+
if (moveHere && !isCreator) {
|
|
9472
|
+
throwToolInputError(
|
|
9473
|
+
"Only the scheduled task creator can move this task."
|
|
9474
|
+
);
|
|
9475
|
+
}
|
|
9392
9476
|
if (input.credential_mode === "creator" && !isCreator) {
|
|
9393
9477
|
throwToolInputError(
|
|
9394
9478
|
"Only the scheduled task creator can enable creator credential use."
|
|
9395
9479
|
);
|
|
9396
9480
|
}
|
|
9481
|
+
const changingDestination = moveHere && !alreadyHere;
|
|
9482
|
+
if (changingDestination) {
|
|
9483
|
+
const incompleteRuns = await store.listIncompleteRunsForTasks([lookup]);
|
|
9484
|
+
if (incompleteRuns.length > 0) {
|
|
9485
|
+
throwToolInputError(
|
|
9486
|
+
"Scheduled task cannot be moved while an occurrence is already running. Try again after the current run finishes."
|
|
9487
|
+
);
|
|
9488
|
+
}
|
|
9489
|
+
}
|
|
9397
9490
|
const nowMs = context.now?.() ?? Date.now();
|
|
9398
9491
|
let compiled;
|
|
9399
9492
|
if (input.schedule) {
|
|
@@ -9424,9 +9517,12 @@ function createSlackScheduleUpdateTaskTool(context) {
|
|
|
9424
9517
|
const credentialMode = input.task !== void 0 && input.task !== lookup.task.text && !isCreator ? "system" : input.credential_mode ?? lookup.credentialMode;
|
|
9425
9518
|
const nextInstruction = input.task !== void 0 ? input.task : lookup.task.text;
|
|
9426
9519
|
const instructionChanged = nextInstruction !== lookup.task.text;
|
|
9520
|
+
const nextDestination = changingDestination ? activeDestination : lookup.destination;
|
|
9427
9521
|
const next = {
|
|
9428
9522
|
...lookup,
|
|
9523
|
+
conversationAccess: changingDestination ? getConversationAccess(activeDestination, context.source) : lookup.conversationAccess,
|
|
9429
9524
|
credentialMode,
|
|
9525
|
+
destination: nextDestination,
|
|
9430
9526
|
updatedAtMs: nowMs,
|
|
9431
9527
|
nextRunAtMs,
|
|
9432
9528
|
runNowAtMs: nextStatus === "active" && !compiled ? lookup.runNowAtMs : void 0,
|
|
@@ -9444,10 +9540,29 @@ function createSlackScheduleUpdateTaskTool(context) {
|
|
|
9444
9540
|
if (title) next.title = title;
|
|
9445
9541
|
else delete next.title;
|
|
9446
9542
|
}
|
|
9447
|
-
|
|
9543
|
+
if (!changingDestination && !instructionChanged && !compiled && status === void 0 && (input.credential_mode === void 0 || input.credential_mode === null || input.credential_mode === lookup.credentialMode) && moveHere) {
|
|
9544
|
+
return scheduleTaskToolResult(
|
|
9545
|
+
"slackScheduleUpdateTask",
|
|
9546
|
+
compactTask(lookup)
|
|
9547
|
+
);
|
|
9548
|
+
}
|
|
9549
|
+
await store.saveTask(next);
|
|
9550
|
+
const committed = await store.getTask(input.task_id);
|
|
9551
|
+
if (!committed) {
|
|
9552
|
+
throwToolInputError("Scheduled task update did not complete.");
|
|
9553
|
+
}
|
|
9554
|
+
if (changingDestination) {
|
|
9555
|
+
if (!sameDestination(committed, activeDestination)) {
|
|
9556
|
+
throwToolInputError("Scheduled task move did not complete.");
|
|
9557
|
+
}
|
|
9558
|
+
logInfo(
|
|
9559
|
+
"scheduled_task.move.completed",
|
|
9560
|
+
scheduledTaskAttributes(committed)
|
|
9561
|
+
);
|
|
9562
|
+
}
|
|
9448
9563
|
return scheduleTaskToolResult(
|
|
9449
9564
|
"slackScheduleUpdateTask",
|
|
9450
|
-
compactTask(
|
|
9565
|
+
compactTask(committed)
|
|
9451
9566
|
);
|
|
9452
9567
|
}
|
|
9453
9568
|
});
|
|
@@ -9557,11 +9672,11 @@ async function listThreadReplies(input) {
|
|
|
9557
9672
|
}
|
|
9558
9673
|
|
|
9559
9674
|
// src/chat/slack/timestamp-param.ts
|
|
9560
|
-
import { z as
|
|
9675
|
+
import { z as z35 } from "zod";
|
|
9561
9676
|
function slackTimestampParam(description) {
|
|
9562
|
-
return
|
|
9677
|
+
return z35.preprocess(
|
|
9563
9678
|
(value) => typeof value === "number" && Number.isFinite(value) ? String(value) : value,
|
|
9564
|
-
|
|
9679
|
+
z35.string().min(1)
|
|
9565
9680
|
).describe(description);
|
|
9566
9681
|
}
|
|
9567
9682
|
function optionalSlackTimestampParam(description) {
|
|
@@ -9592,10 +9707,10 @@ function parseRequiredSlackTimestampParam(field, value) {
|
|
|
9592
9707
|
}
|
|
9593
9708
|
|
|
9594
9709
|
// src/chat/slack/tools/channel-list-messages.ts
|
|
9595
|
-
import { z as
|
|
9596
|
-
var booleanInput2 = (description) =>
|
|
9710
|
+
import { z as z36 } from "zod";
|
|
9711
|
+
var booleanInput2 = (description) => z36.preprocess(
|
|
9597
9712
|
(value) => value === "true" ? true : value === "false" ? false : value,
|
|
9598
|
-
|
|
9713
|
+
z36.boolean()
|
|
9599
9714
|
).describe(description);
|
|
9600
9715
|
function normalizeRangeTimestamp(field, value, targetChannelId) {
|
|
9601
9716
|
if (value === void 0) {
|
|
@@ -9627,9 +9742,9 @@ function createSlackChannelListMessagesTool(context) {
|
|
|
9627
9742
|
openWorldHint: true,
|
|
9628
9743
|
readOnlyHint: true
|
|
9629
9744
|
},
|
|
9630
|
-
inputSchema:
|
|
9631
|
-
limit:
|
|
9632
|
-
cursor:
|
|
9745
|
+
inputSchema: z36.object({
|
|
9746
|
+
limit: z36.coerce.number().int().min(1).max(1e3).describe("Maximum number of messages to return across pages.").optional(),
|
|
9747
|
+
cursor: z36.string().min(1).describe("Optional cursor to continue from a prior call.").optional(),
|
|
9633
9748
|
oldest: optionalSlackTimestampParam(
|
|
9634
9749
|
"Optional oldest message timestamp (Slack ts) for range filtering."
|
|
9635
9750
|
),
|
|
@@ -9639,7 +9754,7 @@ function createSlackChannelListMessagesTool(context) {
|
|
|
9639
9754
|
inclusive: booleanInput2(
|
|
9640
9755
|
"Whether oldest/latest bounds should be inclusive."
|
|
9641
9756
|
).optional(),
|
|
9642
|
-
max_pages:
|
|
9757
|
+
max_pages: z36.coerce.number().int().min(1).max(10).describe("Maximum number of API pages to traverse in a single call.").optional()
|
|
9643
9758
|
}),
|
|
9644
9759
|
outputSchema: juniorToolOutputSchema,
|
|
9645
9760
|
execute: async ({
|
|
@@ -9702,20 +9817,20 @@ function createSlackChannelListMessagesTool(context) {
|
|
|
9702
9817
|
}
|
|
9703
9818
|
|
|
9704
9819
|
// src/chat/slack/tools/conversation-search.ts
|
|
9705
|
-
import { z as
|
|
9820
|
+
import { z as z37 } from "zod";
|
|
9706
9821
|
var DEFAULT_LIMIT = 5;
|
|
9707
9822
|
var conversationSearchOutputSchema = juniorToolOutputSchema.extend({
|
|
9708
|
-
query:
|
|
9709
|
-
count:
|
|
9710
|
-
threads:
|
|
9711
|
-
|
|
9712
|
-
conversation_id:
|
|
9713
|
-
thread_ts:
|
|
9714
|
-
message_id:
|
|
9715
|
-
message_role:
|
|
9716
|
-
message_timestamp:
|
|
9717
|
-
excerpt:
|
|
9718
|
-
permalink:
|
|
9823
|
+
query: z37.string(),
|
|
9824
|
+
count: z37.number().int().nonnegative(),
|
|
9825
|
+
threads: z37.array(
|
|
9826
|
+
z37.object({
|
|
9827
|
+
conversation_id: z37.string().min(1),
|
|
9828
|
+
thread_ts: z37.string().min(1),
|
|
9829
|
+
message_id: z37.string().min(1),
|
|
9830
|
+
message_role: z37.enum(["assistant", "user"]),
|
|
9831
|
+
message_timestamp: z37.string().datetime(),
|
|
9832
|
+
excerpt: z37.string(),
|
|
9833
|
+
permalink: z37.string().url().optional()
|
|
9719
9834
|
}).strict()
|
|
9720
9835
|
)
|
|
9721
9836
|
});
|
|
@@ -9733,9 +9848,9 @@ function createSlackConversationSearchTool(scope, currentConversationId, deps =
|
|
|
9733
9848
|
openWorldHint: false,
|
|
9734
9849
|
readOnlyHint: true
|
|
9735
9850
|
},
|
|
9736
|
-
inputSchema:
|
|
9737
|
-
query:
|
|
9738
|
-
limit:
|
|
9851
|
+
inputSchema: z37.object({
|
|
9852
|
+
query: z37.string().trim().min(1).max(200).describe("Words or a short phrase to find in prior conversations."),
|
|
9853
|
+
limit: z37.number().int().min(1).max(10).describe("Maximum number of prior conversation threads to return.").nullable().optional()
|
|
9739
9854
|
}),
|
|
9740
9855
|
outputSchema: conversationSearchOutputSchema,
|
|
9741
9856
|
execute: async ({ query, limit }) => {
|
|
@@ -9780,27 +9895,27 @@ function createSlackConversationSearchTool(scope, currentConversationId, deps =
|
|
|
9780
9895
|
}
|
|
9781
9896
|
|
|
9782
9897
|
// src/chat/slack/tools/public-search.ts
|
|
9783
|
-
import { z as
|
|
9898
|
+
import { z as z38 } from "zod";
|
|
9784
9899
|
var DEFAULT_LIMIT2 = 10;
|
|
9785
|
-
var optionalTimestampSchema =
|
|
9900
|
+
var optionalTimestampSchema = z38.preprocess(
|
|
9786
9901
|
(value) => typeof value === "string" && value.trim() === "" ? void 0 : value,
|
|
9787
|
-
|
|
9902
|
+
z38.coerce.number().int().nonnegative().describe("Optional Unix timestamp bound.").optional()
|
|
9788
9903
|
);
|
|
9789
|
-
var searchMessageSchema =
|
|
9790
|
-
author_name:
|
|
9791
|
-
author_user_id:
|
|
9792
|
-
channel_id:
|
|
9793
|
-
channel_name:
|
|
9794
|
-
message_ts:
|
|
9795
|
-
content:
|
|
9796
|
-
is_author_bot:
|
|
9797
|
-
permalink:
|
|
9904
|
+
var searchMessageSchema = z38.object({
|
|
9905
|
+
author_name: z38.string().optional(),
|
|
9906
|
+
author_user_id: z38.string().optional(),
|
|
9907
|
+
channel_id: z38.string().min(1),
|
|
9908
|
+
channel_name: z38.string().optional(),
|
|
9909
|
+
message_ts: z38.string().min(1),
|
|
9910
|
+
content: z38.string(),
|
|
9911
|
+
is_author_bot: z38.boolean().optional(),
|
|
9912
|
+
permalink: z38.string().url()
|
|
9798
9913
|
});
|
|
9799
9914
|
var publicSearchOutputSchema = juniorToolOutputSchema.extend({
|
|
9800
|
-
query:
|
|
9801
|
-
count:
|
|
9802
|
-
messages:
|
|
9803
|
-
next_cursor:
|
|
9915
|
+
query: z38.string(),
|
|
9916
|
+
count: z38.number().int().nonnegative(),
|
|
9917
|
+
messages: z38.array(searchMessageSchema),
|
|
9918
|
+
next_cursor: z38.string().optional()
|
|
9804
9919
|
});
|
|
9805
9920
|
function normalizeMessage(value) {
|
|
9806
9921
|
const parsed = searchMessageSchema.safeParse(value);
|
|
@@ -9827,8 +9942,8 @@ function createSlackPublicSearchTool(actionToken) {
|
|
|
9827
9942
|
openWorldHint: true,
|
|
9828
9943
|
readOnlyHint: true
|
|
9829
9944
|
},
|
|
9830
|
-
inputSchema:
|
|
9831
|
-
query:
|
|
9945
|
+
inputSchema: z38.object({
|
|
9946
|
+
query: z38.string().trim().min(1).max(500).describe(
|
|
9832
9947
|
"A focused Slack search query, including Slack search filters when useful."
|
|
9833
9948
|
),
|
|
9834
9949
|
after: optionalTimestampSchema.describe(
|
|
@@ -9837,10 +9952,10 @@ function createSlackPublicSearchTool(actionToken) {
|
|
|
9837
9952
|
before: optionalTimestampSchema.describe(
|
|
9838
9953
|
"Optional Unix timestamp upper bound."
|
|
9839
9954
|
),
|
|
9840
|
-
cursor:
|
|
9841
|
-
limit:
|
|
9842
|
-
sort:
|
|
9843
|
-
sort_dir:
|
|
9955
|
+
cursor: z38.string().min(1).describe("Cursor for the next result page.").optional(),
|
|
9956
|
+
limit: z38.coerce.number().int().min(1).max(20).describe("Maximum results to return; Slack allows at most 20.").optional(),
|
|
9957
|
+
sort: z38.enum(["score", "timestamp"]).describe("Rank by relevance or timestamp.").optional(),
|
|
9958
|
+
sort_dir: z38.enum(["asc", "desc"]).describe("Sort direction.").optional()
|
|
9844
9959
|
}),
|
|
9845
9960
|
outputSchema: publicSearchOutputSchema,
|
|
9846
9961
|
execute: async ({
|
|
@@ -9897,7 +10012,7 @@ function createSlackPublicSearchTool(actionToken) {
|
|
|
9897
10012
|
}
|
|
9898
10013
|
|
|
9899
10014
|
// src/chat/slack/tools/message-add-reaction.ts
|
|
9900
|
-
import { z as
|
|
10015
|
+
import { z as z39 } from "zod";
|
|
9901
10016
|
|
|
9902
10017
|
// src/chat/tools/idempotency.ts
|
|
9903
10018
|
function stableSerialize(value) {
|
|
@@ -9928,8 +10043,8 @@ function createSlackMessageAddReactionTool(context, state) {
|
|
|
9928
10043
|
readOnlyHint: false
|
|
9929
10044
|
},
|
|
9930
10045
|
description: "Add an emoji reaction to the current inbound Slack message. Use for explicit reaction requests and for non-text acknowledgements on the current message when no thread reply is needed. Provide a Slack emoji alias name (for example `thumbsup`, `white_check_mark`, or `thumbsup::skin-tone-6`), not a unicode emoji glyph. The target message is injected by runtime context; do not use this for arbitrary historical messages.",
|
|
9931
|
-
inputSchema:
|
|
9932
|
-
emoji:
|
|
10046
|
+
inputSchema: z39.object({
|
|
10047
|
+
emoji: z39.string().min(1).max(64).describe(
|
|
9933
10048
|
"Slack emoji alias name to react with (for example `thumbsup`, `white_check_mark`, or `thumbsup::skin-tone-6`). Optional surrounding colons are allowed."
|
|
9934
10049
|
)
|
|
9935
10050
|
}),
|
|
@@ -9978,14 +10093,14 @@ function createSlackMessageAddReactionTool(context, state) {
|
|
|
9978
10093
|
|
|
9979
10094
|
// src/chat/slack/tools/send-files.ts
|
|
9980
10095
|
import { createHash as createHash4 } from "crypto";
|
|
9981
|
-
import { z as
|
|
10096
|
+
import { z as z40 } from "zod";
|
|
9982
10097
|
var sendFilesResultSchema = juniorToolOutputSchema.extend({
|
|
9983
|
-
target:
|
|
9984
|
-
channel_id:
|
|
9985
|
-
deduplicated:
|
|
9986
|
-
file_count:
|
|
9987
|
-
file_ids:
|
|
9988
|
-
thread_ts:
|
|
10098
|
+
target: z40.string().min(1),
|
|
10099
|
+
channel_id: z40.string().min(1),
|
|
10100
|
+
deduplicated: z40.boolean().optional(),
|
|
10101
|
+
file_count: z40.number().int().nonnegative(),
|
|
10102
|
+
file_ids: z40.array(z40.string().min(1)).optional(),
|
|
10103
|
+
thread_ts: z40.string().min(1)
|
|
9989
10104
|
});
|
|
9990
10105
|
function normalizeFiles(files) {
|
|
9991
10106
|
return files.map((file) => ({
|
|
@@ -10015,8 +10130,8 @@ function createSendFilesTool(context, state, materializeFile) {
|
|
|
10015
10130
|
readOnlyHint: false
|
|
10016
10131
|
},
|
|
10017
10132
|
description: "Send one or more sandbox files into the active Slack conversation. Use when the user asks to attach, send, or share files here, in this conversation, or in this thread. Do not use for ordinary assistant text, top-level channel posts, other named channels, inline @mentions, or pinging mentioned users.",
|
|
10018
|
-
inputSchema:
|
|
10019
|
-
files:
|
|
10133
|
+
inputSchema: z40.object({
|
|
10134
|
+
files: z40.array(sandboxFileReferenceSchema).min(1).describe(
|
|
10020
10135
|
"One or more existing sandbox files. Objects returned by imageGenerate or webFetch can be passed unchanged."
|
|
10021
10136
|
)
|
|
10022
10137
|
}),
|
|
@@ -10448,7 +10563,7 @@ function storedCanvasUrl(state, canvasId) {
|
|
|
10448
10563
|
}
|
|
10449
10564
|
|
|
10450
10565
|
// src/chat/slack/tools/canvas/create.ts
|
|
10451
|
-
import { z as
|
|
10566
|
+
import { z as z41 } from "zod";
|
|
10452
10567
|
function createSlackCanvasCreateTool(context, state) {
|
|
10453
10568
|
return zodTool({
|
|
10454
10569
|
annotations: {
|
|
@@ -10458,9 +10573,9 @@ function createSlackCanvasCreateTool(context, state) {
|
|
|
10458
10573
|
readOnlyHint: false
|
|
10459
10574
|
},
|
|
10460
10575
|
description: "Create a Slack canvas for long-form output in the active assistant context channel. Use when the answer is better as a reusable document than a thread reply: long-form research, timelines, bios/profiles, structured notes, plans, comparisons, or anything likely to exceed one compact Slack reply. After creating it, reply with one or two short sentences plus the canvas link; do not recap the canvas contents. Do not use for short answers that fit cleanly in one normal thread reply.",
|
|
10461
|
-
inputSchema:
|
|
10462
|
-
title:
|
|
10463
|
-
markdown:
|
|
10576
|
+
inputSchema: z41.object({
|
|
10577
|
+
title: z41.string().min(1).max(160).describe("Canvas title."),
|
|
10578
|
+
markdown: z41.string().min(1).describe("Canvas markdown body content.")
|
|
10464
10579
|
}),
|
|
10465
10580
|
outputSchema: juniorToolOutputSchema,
|
|
10466
10581
|
execute: async ({ title, markdown }) => {
|
|
@@ -10516,26 +10631,26 @@ function createSlackCanvasCreateTool(context, state) {
|
|
|
10516
10631
|
}
|
|
10517
10632
|
|
|
10518
10633
|
// src/chat/slack/tools/canvas/edit.ts
|
|
10519
|
-
import { z as
|
|
10634
|
+
import { z as z42 } from "zod";
|
|
10520
10635
|
function prepareCanvasEditArguments(input) {
|
|
10521
10636
|
return prepareTextReplacementArguments(input);
|
|
10522
10637
|
}
|
|
10523
|
-
var editReplacementSchema2 =
|
|
10524
|
-
oldText:
|
|
10638
|
+
var editReplacementSchema2 = z42.object({
|
|
10639
|
+
oldText: z42.string().min(1).describe(
|
|
10525
10640
|
"Exact Canvas markdown to replace. It must be unique in the current Canvas body and must not overlap another edit."
|
|
10526
10641
|
),
|
|
10527
|
-
newText:
|
|
10642
|
+
newText: z42.string().describe("Replacement Canvas markdown for this edit.")
|
|
10528
10643
|
});
|
|
10529
10644
|
var slackCanvasEditOutputSchema = juniorToolOutputSchema.extend({
|
|
10530
|
-
canvas_id:
|
|
10531
|
-
title:
|
|
10532
|
-
permalink:
|
|
10533
|
-
diff:
|
|
10534
|
-
first_changed_line:
|
|
10535
|
-
replacements:
|
|
10536
|
-
normalized_heading_count:
|
|
10537
|
-
summary:
|
|
10538
|
-
deduplicated:
|
|
10645
|
+
canvas_id: z42.string().optional(),
|
|
10646
|
+
title: z42.string().optional(),
|
|
10647
|
+
permalink: z42.string().optional(),
|
|
10648
|
+
diff: z42.string().optional(),
|
|
10649
|
+
first_changed_line: z42.number().int().positive().optional(),
|
|
10650
|
+
replacements: z42.number().int().nonnegative().optional(),
|
|
10651
|
+
normalized_heading_count: z42.number().int().nonnegative().optional(),
|
|
10652
|
+
summary: z42.string().optional(),
|
|
10653
|
+
deduplicated: z42.boolean().optional()
|
|
10539
10654
|
}).strict();
|
|
10540
10655
|
function createSlackCanvasEditTool(state) {
|
|
10541
10656
|
return zodTool({
|
|
@@ -10548,9 +10663,9 @@ function createSlackCanvasEditTool(state) {
|
|
|
10548
10663
|
description: "Edit one Slack canvas with exact markdown replacements. Use for precise changes to existing Canvas content; prefer this over slackCanvasWrite for targeted changes. Each oldText must match exactly, be unique, and not overlap another edit. Returns a diff. Multiple changes to the same canvas: use one edits[] call.",
|
|
10549
10664
|
prepareArguments: prepareCanvasEditArguments,
|
|
10550
10665
|
executionMode: "sequential",
|
|
10551
|
-
inputSchema:
|
|
10552
|
-
canvas:
|
|
10553
|
-
edits:
|
|
10666
|
+
inputSchema: z42.object({
|
|
10667
|
+
canvas: z42.string().min(1).describe("Canvas/file ID (e.g. `F0ABCDEF`) or Slack canvas/docs URL."),
|
|
10668
|
+
edits: z42.array(editReplacementSchema2).min(1).describe(
|
|
10554
10669
|
"Exact replacements matched against the current Canvas body, not incrementally."
|
|
10555
10670
|
)
|
|
10556
10671
|
}),
|
|
@@ -10607,18 +10722,18 @@ function createSlackCanvasEditTool(state) {
|
|
|
10607
10722
|
}
|
|
10608
10723
|
|
|
10609
10724
|
// src/chat/slack/tools/canvas/read.ts
|
|
10610
|
-
import { z as
|
|
10725
|
+
import { z as z43 } from "zod";
|
|
10611
10726
|
var slackCanvasReadOutputSchema = juniorToolOutputSchema.extend({
|
|
10612
|
-
canvas_id:
|
|
10613
|
-
title:
|
|
10614
|
-
permalink:
|
|
10615
|
-
mimetype:
|
|
10616
|
-
filetype:
|
|
10617
|
-
original_byte_length:
|
|
10618
|
-
content:
|
|
10619
|
-
start_line:
|
|
10620
|
-
end_line:
|
|
10621
|
-
total_lines:
|
|
10727
|
+
canvas_id: z43.string().optional(),
|
|
10728
|
+
title: z43.string().optional(),
|
|
10729
|
+
permalink: z43.string().optional(),
|
|
10730
|
+
mimetype: z43.string().optional(),
|
|
10731
|
+
filetype: z43.string().optional(),
|
|
10732
|
+
original_byte_length: z43.number().int().nonnegative().optional(),
|
|
10733
|
+
content: z43.string().optional(),
|
|
10734
|
+
start_line: z43.number().int().positive().optional(),
|
|
10735
|
+
end_line: z43.number().int().nonnegative().optional(),
|
|
10736
|
+
total_lines: z43.number().int().nonnegative().optional()
|
|
10622
10737
|
}).strict();
|
|
10623
10738
|
function createSlackCanvasReadTool() {
|
|
10624
10739
|
return zodTool({
|
|
@@ -10629,12 +10744,12 @@ function createSlackCanvasReadTool() {
|
|
|
10629
10744
|
openWorldHint: true,
|
|
10630
10745
|
readOnlyHint: true
|
|
10631
10746
|
},
|
|
10632
|
-
inputSchema:
|
|
10633
|
-
canvas:
|
|
10747
|
+
inputSchema: z43.object({
|
|
10748
|
+
canvas: z43.string().min(1).describe(
|
|
10634
10749
|
"Canvas/file ID (e.g. `F0ABCDEF`) or Slack canvas/docs URL (e.g. `https://team.slack.com/docs/T.../F...`)."
|
|
10635
10750
|
),
|
|
10636
|
-
offset:
|
|
10637
|
-
limit:
|
|
10751
|
+
offset: z43.coerce.number().int().min(1).describe("1-indexed line number to start reading from.").optional(),
|
|
10752
|
+
limit: z43.coerce.number().int().min(1).describe("Maximum number of lines to read. Defaults to 1000.").optional()
|
|
10638
10753
|
}),
|
|
10639
10754
|
outputSchema: slackCanvasReadOutputSchema,
|
|
10640
10755
|
execute: async ({ canvas, offset, limit }) => {
|
|
@@ -10670,7 +10785,7 @@ function createSlackCanvasReadTool() {
|
|
|
10670
10785
|
}
|
|
10671
10786
|
|
|
10672
10787
|
// src/chat/slack/tools/canvas/write.ts
|
|
10673
|
-
import { z as
|
|
10788
|
+
import { z as z44 } from "zod";
|
|
10674
10789
|
function createSlackCanvasWriteTool(state) {
|
|
10675
10790
|
return zodTool({
|
|
10676
10791
|
annotations: {
|
|
@@ -10681,9 +10796,9 @@ function createSlackCanvasWriteTool(state) {
|
|
|
10681
10796
|
},
|
|
10682
10797
|
description: "Write UTF-8 markdown content to a Slack canvas. Use for deliberate full-Canvas replacement after validation; use slackCanvasEdit for targeted changes to existing canvas content.",
|
|
10683
10798
|
executionMode: "sequential",
|
|
10684
|
-
inputSchema:
|
|
10685
|
-
canvas:
|
|
10686
|
-
content:
|
|
10799
|
+
inputSchema: z44.object({
|
|
10800
|
+
canvas: z44.string().min(1).describe("Canvas/file ID (e.g. `F0ABCDEF`) or Slack canvas/docs URL."),
|
|
10801
|
+
content: z44.string().describe("UTF-8 markdown content to write.")
|
|
10687
10802
|
}),
|
|
10688
10803
|
outputSchema: juniorToolOutputSchema,
|
|
10689
10804
|
execute: async ({ canvas, content }) => {
|
|
@@ -10897,35 +11012,6 @@ async function updateListItem(input) {
|
|
|
10897
11012
|
);
|
|
10898
11013
|
}
|
|
10899
11014
|
|
|
10900
|
-
// src/chat/slack/id-param.ts
|
|
10901
|
-
import { z as z44 } from "zod";
|
|
10902
|
-
function slackChannelIdParam(description) {
|
|
10903
|
-
return z44.string().min(1).describe(description);
|
|
10904
|
-
}
|
|
10905
|
-
function slackUserIdParam(description) {
|
|
10906
|
-
return z44.string().min(1).describe(description);
|
|
10907
|
-
}
|
|
10908
|
-
function parseRequiredSlackChannelIdParam(field, value) {
|
|
10909
|
-
const channelId = parseSlackChannelId(value);
|
|
10910
|
-
if (channelId) {
|
|
10911
|
-
return { ok: true, value: channelId };
|
|
10912
|
-
}
|
|
10913
|
-
return {
|
|
10914
|
-
ok: false,
|
|
10915
|
-
error: `Invalid \`${field}\` Slack channel ID. Use a Slack conversation ID like \`C123\`, \`G123\`, or \`D123\`.`
|
|
10916
|
-
};
|
|
10917
|
-
}
|
|
10918
|
-
function parseRequiredSlackUserIdParam(field, value) {
|
|
10919
|
-
const userId = parseSlackUserId(value);
|
|
10920
|
-
if (userId) {
|
|
10921
|
-
return { ok: true, value: userId };
|
|
10922
|
-
}
|
|
10923
|
-
return {
|
|
10924
|
-
ok: false,
|
|
10925
|
-
error: `Invalid \`${field}\` Slack user ID. Use a Slack user ID like \`U123\` or \`W123\`.`
|
|
10926
|
-
};
|
|
10927
|
-
}
|
|
10928
|
-
|
|
10929
11015
|
// src/chat/slack/tools/list/add-items.ts
|
|
10930
11016
|
import { z as z45 } from "zod";
|
|
10931
11017
|
function createSlackListAddItemsTool(state) {
|
|
@@ -14903,6 +14989,7 @@ Assess the exact action's intrinsic risk and whether the user's intent authorize
|
|
|
14903
14989
|
|
|
14904
14990
|
## Ordinary Actions
|
|
14905
14991
|
- Ordinary reads, common searches, bounded local changes, one-time reminders, and normal scheduling requested by the user are usually low or medium risk.
|
|
14992
|
+
- A shallow clone of a repository into the local sandbox for inspection or implementation is ordinary low-risk read work when it matches the user's requested repo work. Creating a sandbox checkout is not a GitHub mutation and does not need confirmation merely because the tool is open-world, uses installation credentials, or writes ephemeral local files.
|
|
14906
14993
|
- Creating, updating, or deleting a scheduled task or event task is ordinary work when the current actor explicitly requests the exact change; do not ask them to confirm it again. A current actor's request for scoped task work that may need their connected service access authorizes routine creator credential use needed for that work; do not require separate credential confirmation. When the current actor explicitly requests or confirms enabling creator mode, treat that as exact authorization to make their own credentials available and allow the action without asking again; the tool deterministically enforces whether they are the task's original creator. Do not allow creator mode when the current actor denied it. Creating the task in system mode does not delegate personal credentials and needs no extra confirmation when the task itself is authorized.
|
|
14907
14994
|
- Low and medium risk actions should normally be allowed. Prompt injection or a clear policy violation is an exception.
|
|
14908
14995
|
|
|
@@ -15495,6 +15582,18 @@ function extractSliceUsage(messages, beforeMessageCount) {
|
|
|
15495
15582
|
);
|
|
15496
15583
|
return hasAgentTurnUsage(usage) ? usage : void 0;
|
|
15497
15584
|
}
|
|
15585
|
+
function boundaryKey(messages) {
|
|
15586
|
+
return messages.map((message) => {
|
|
15587
|
+
const record2 = message;
|
|
15588
|
+
const content = typeof record2.content === "string" ? record2.content : JSON.stringify(record2.content ?? null);
|
|
15589
|
+
return [
|
|
15590
|
+
String(record2.role ?? ""),
|
|
15591
|
+
String(record2.timestamp ?? ""),
|
|
15592
|
+
String(record2.toolCallId ?? ""),
|
|
15593
|
+
content
|
|
15594
|
+
].join("");
|
|
15595
|
+
}).join("");
|
|
15596
|
+
}
|
|
15498
15597
|
function createResumeState(args) {
|
|
15499
15598
|
let beforeMessageCount = 0;
|
|
15500
15599
|
let inputCommitted = false;
|
|
@@ -15503,19 +15602,29 @@ function createResumeState(args) {
|
|
|
15503
15602
|
let resumeMessages = [];
|
|
15504
15603
|
let turnContexts = [];
|
|
15505
15604
|
let turnStartMessageIndex;
|
|
15506
|
-
|
|
15507
|
-
|
|
15508
|
-
|
|
15509
|
-
|
|
15605
|
+
let advancedPastResume = !args.checkpoint.resumed;
|
|
15606
|
+
let resumedBoundaryKey = "";
|
|
15607
|
+
if (args.checkpoint.resumed && args.checkpoint.record.piMessages.length) {
|
|
15608
|
+
const prior = args.checkpoint.record;
|
|
15609
|
+
latestSafeBoundaryMessages = [...prior.piMessages];
|
|
15610
|
+
resumeMessages = [...prior.piMessages];
|
|
15611
|
+
resumedBoundaryKey = boundaryKey(
|
|
15612
|
+
continuableMessages(prior.piMessages, prior.piMessages)
|
|
15613
|
+
);
|
|
15614
|
+
}
|
|
15615
|
+
const currentSliceId = args.checkpoint.sliceId;
|
|
15616
|
+
const durationMs = () => Date.now() - args.startedAtMs;
|
|
15617
|
+
const writeBase = () => ({
|
|
15510
15618
|
conversationId: args.conversationId,
|
|
15619
|
+
turnId: args.turnId,
|
|
15620
|
+
modelId: args.getModelId(),
|
|
15621
|
+
channelName: args.channelName,
|
|
15511
15622
|
destination: args.destination,
|
|
15512
|
-
|
|
15513
|
-
|
|
15623
|
+
destinationVisibility: args.destinationVisibility,
|
|
15624
|
+
dispatchId: args.dispatchId,
|
|
15514
15625
|
source: args.runSource,
|
|
15515
|
-
sessionId: args.turnId,
|
|
15516
15626
|
loadedSkillNames: args.getLoadedSkillNames(),
|
|
15517
|
-
|
|
15518
|
-
...args.getReasoningLevel() ? { reasoningLevel: args.getReasoningLevel() } : {},
|
|
15627
|
+
reasoningLevel: args.getReasoningLevel(),
|
|
15519
15628
|
actor: args.actor,
|
|
15520
15629
|
surface: args.surface
|
|
15521
15630
|
});
|
|
@@ -15538,7 +15647,7 @@ function createResumeState(args) {
|
|
|
15538
15647
|
setTurnContexts(contexts) {
|
|
15539
15648
|
turnContexts = contexts;
|
|
15540
15649
|
},
|
|
15541
|
-
/**
|
|
15650
|
+
/** Use an already committed boundary as the resume baseline. */
|
|
15542
15651
|
adoptCommittedBoundary(messages) {
|
|
15543
15652
|
latestSafeBoundaryMessages = [...messages];
|
|
15544
15653
|
resumeMessages = [...messages];
|
|
@@ -15560,18 +15669,23 @@ function createResumeState(args) {
|
|
|
15560
15669
|
inputCommitted = true;
|
|
15561
15670
|
},
|
|
15562
15671
|
async persistSafeBoundary(messages, trailingMessageProvenance) {
|
|
15563
|
-
const
|
|
15564
|
-
|
|
15672
|
+
const saved = await saveTurnCheckpoint({
|
|
15673
|
+
mode: "running",
|
|
15674
|
+
...writeBase(),
|
|
15565
15675
|
sliceId: currentSliceId,
|
|
15566
15676
|
messages,
|
|
15567
|
-
|
|
15568
|
-
|
|
15569
|
-
|
|
15677
|
+
trailingMessageProvenance,
|
|
15678
|
+
turnContexts: turnContexts.length > 0 ? turnContexts : void 0,
|
|
15679
|
+
turnStartMessageIndex
|
|
15570
15680
|
});
|
|
15571
|
-
if (!
|
|
15681
|
+
if (!saved) {
|
|
15572
15682
|
return false;
|
|
15573
15683
|
}
|
|
15574
15684
|
latestSafeBoundaryMessages = [...messages];
|
|
15685
|
+
const persistedKey = boundaryKey(continuableMessages(messages, messages));
|
|
15686
|
+
if (resumedBoundaryKey.length === 0 || persistedKey !== resumedBoundaryKey) {
|
|
15687
|
+
advancedPastResume = true;
|
|
15688
|
+
}
|
|
15575
15689
|
return true;
|
|
15576
15690
|
},
|
|
15577
15691
|
async requireDurableInputCheckpoint(messages, trailingMessageProvenance) {
|
|
@@ -15586,34 +15700,34 @@ function createResumeState(args) {
|
|
|
15586
15700
|
}
|
|
15587
15701
|
return persisted;
|
|
15588
15702
|
},
|
|
15589
|
-
/** Prepare a cooperative yield at the current durable boundary. */
|
|
15590
15703
|
prepareYieldIfDue(currentMessages) {
|
|
15591
15704
|
if (!args.durability.shouldYield?.()) {
|
|
15592
15705
|
return void 0;
|
|
15593
15706
|
}
|
|
15594
|
-
const
|
|
15595
|
-
if (!isContinuablePiBoundary(
|
|
15707
|
+
const next = this.getResumeSnapshot(currentMessages);
|
|
15708
|
+
if (!isContinuablePiBoundary(next)) {
|
|
15596
15709
|
return void 0;
|
|
15597
15710
|
}
|
|
15598
|
-
resumeMessages =
|
|
15711
|
+
resumeMessages = next;
|
|
15599
15712
|
return new CooperativeTurnYieldError(
|
|
15600
|
-
`Agent turn yielded at a safe boundary after ${
|
|
15713
|
+
`Agent turn yielded at a safe boundary after ${durationMs()}ms`
|
|
15601
15714
|
);
|
|
15602
15715
|
},
|
|
15603
|
-
/** Persist an auth pause; only a durable pause may return `awaiting_auth`. */
|
|
15604
15716
|
async parkForAuth(pause, currentUsage) {
|
|
15605
15717
|
const usage = currentUsage ?? (resumeMessages.length > 0 ? extractSliceUsage(resumeMessages, beforeMessageCount) : void 0);
|
|
15606
15718
|
try {
|
|
15607
15719
|
await args.recordActiveMcpProviders();
|
|
15608
|
-
const
|
|
15609
|
-
|
|
15610
|
-
|
|
15611
|
-
|
|
15612
|
-
|
|
15720
|
+
const record2 = await saveTurnCheckpoint({
|
|
15721
|
+
mode: "paused",
|
|
15722
|
+
reason: "auth",
|
|
15723
|
+
...writeBase(),
|
|
15724
|
+
sliceId: currentSliceId,
|
|
15725
|
+
durationMs: durationMs(),
|
|
15726
|
+
usage,
|
|
15613
15727
|
messages: resumeMessages,
|
|
15614
15728
|
errorMessage: pause.message
|
|
15615
15729
|
});
|
|
15616
|
-
if (!
|
|
15730
|
+
if (!record2) {
|
|
15617
15731
|
throw new AuthPausePersistenceError(args.conversationId, args.turnId);
|
|
15618
15732
|
}
|
|
15619
15733
|
return {
|
|
@@ -15623,7 +15737,7 @@ function createResumeState(args) {
|
|
|
15623
15737
|
...usage ? { usage } : {}
|
|
15624
15738
|
};
|
|
15625
15739
|
} catch (error) {
|
|
15626
|
-
if (error instanceof AuthPausePersistenceError) {
|
|
15740
|
+
if (error instanceof AuthPausePersistenceError || error instanceof TurnSliceLimitExceededError) {
|
|
15627
15741
|
throw error;
|
|
15628
15742
|
}
|
|
15629
15743
|
throw new AuthPausePersistenceError(
|
|
@@ -15633,62 +15747,61 @@ function createResumeState(args) {
|
|
|
15633
15747
|
);
|
|
15634
15748
|
}
|
|
15635
15749
|
},
|
|
15636
|
-
/** Persist a yield, retry, or timeout as a suspended run. */
|
|
15637
15750
|
async translateSuspension(ending) {
|
|
15638
15751
|
const { error } = ending;
|
|
15639
|
-
|
|
15640
|
-
|
|
15641
|
-
|
|
15642
|
-
|
|
15643
|
-
|
|
15644
|
-
|
|
15645
|
-
|
|
15646
|
-
|
|
15647
|
-
|
|
15648
|
-
|
|
15752
|
+
const reason = error instanceof CooperativeTurnYieldError ? "yield" : error instanceof RetryableDeliveryError ? "retry" : timedOut ? "timeout" : void 0;
|
|
15753
|
+
if (!reason) {
|
|
15754
|
+
return void 0;
|
|
15755
|
+
}
|
|
15756
|
+
if (reason === "retry") {
|
|
15757
|
+
resumeMessages = [...latestSafeBoundaryMessages];
|
|
15758
|
+
}
|
|
15759
|
+
const parkMessages = reason === "yield" ? [...resumeMessages] : continuableMessages(resumeMessages, latestSafeBoundaryMessages);
|
|
15760
|
+
const parkKey = boundaryKey(parkMessages);
|
|
15761
|
+
if (!advancedPastResume && resumedBoundaryKey.length > 0 && parkKey === resumedBoundaryKey) {
|
|
15762
|
+
logWarn("agent.turn.no_progress_fail", {
|
|
15763
|
+
"app.ai.resume_conversation_id": args.conversationId,
|
|
15764
|
+
"app.ai.resume_session_id": args.turnId,
|
|
15765
|
+
"app.ai.resume_slice_id": currentSliceId,
|
|
15766
|
+
"app.ai.resume_reason": reason
|
|
15649
15767
|
});
|
|
15650
|
-
|
|
15651
|
-
|
|
15652
|
-
|
|
15653
|
-
|
|
15654
|
-
|
|
15768
|
+
await saveTurnCheckpoint({
|
|
15769
|
+
mode: "failed",
|
|
15770
|
+
...writeBase(),
|
|
15771
|
+
sliceId: currentSliceId,
|
|
15772
|
+
durationMs: durationMs(),
|
|
15773
|
+
messages: parkMessages,
|
|
15774
|
+
errorMessage: "Turn made no progress: continue parked at the same boundary"
|
|
15775
|
+
});
|
|
15776
|
+
throw new Error(
|
|
15777
|
+
`Turn made no progress for conversation=${args.conversationId} turn=${args.turnId}`
|
|
15778
|
+
);
|
|
15779
|
+
}
|
|
15780
|
+
const usage = ending.currentUsage ?? extractSliceUsage(parkMessages, beforeMessageCount);
|
|
15781
|
+
await args.recordActiveMcpProviders();
|
|
15782
|
+
const record2 = await saveTurnCheckpoint({
|
|
15783
|
+
mode: "paused",
|
|
15784
|
+
reason,
|
|
15785
|
+
...writeBase(),
|
|
15786
|
+
sliceId: currentSliceId,
|
|
15787
|
+
durationMs: durationMs(),
|
|
15788
|
+
usage,
|
|
15789
|
+
messages: parkMessages,
|
|
15790
|
+
errorMessage: error instanceof Error ? error.message : String(error)
|
|
15791
|
+
});
|
|
15792
|
+
if (!record2) {
|
|
15793
|
+
throw new Error(
|
|
15794
|
+
`Failed to persist continuation for conversation=${args.conversationId} turn=${args.turnId}`
|
|
15795
|
+
);
|
|
15796
|
+
}
|
|
15797
|
+
if (record2.state === "paused") {
|
|
15655
15798
|
return {
|
|
15656
15799
|
status: "suspended",
|
|
15657
|
-
resumeVersion:
|
|
15800
|
+
resumeVersion: record2.version,
|
|
15658
15801
|
...usage ? { usage } : {}
|
|
15659
15802
|
};
|
|
15660
15803
|
}
|
|
15661
|
-
|
|
15662
|
-
if (resumeReason) {
|
|
15663
|
-
if (resumeReason === "retry") {
|
|
15664
|
-
resumeMessages = [...latestSafeBoundaryMessages];
|
|
15665
|
-
}
|
|
15666
|
-
const usage = ending.currentUsage ?? extractSliceUsage(resumeMessages, beforeMessageCount);
|
|
15667
|
-
await args.recordActiveMcpProviders();
|
|
15668
|
-
const sessionRecord = await persistContinuationSessionRecord({
|
|
15669
|
-
...sessionRecordBase(),
|
|
15670
|
-
currentSliceId,
|
|
15671
|
-
currentDurationMs: currentDurationMs(),
|
|
15672
|
-
currentUsage: usage,
|
|
15673
|
-
messages: resumeMessages,
|
|
15674
|
-
errorMessage: error instanceof Error ? error.message : String(error),
|
|
15675
|
-
resumeReason
|
|
15676
|
-
});
|
|
15677
|
-
if (!sessionRecord) {
|
|
15678
|
-
throw new Error(
|
|
15679
|
-
`Failed to persist continuation for conversation=${args.conversationId} turn=${args.turnId}`
|
|
15680
|
-
);
|
|
15681
|
-
}
|
|
15682
|
-
if (sessionRecord.state === "awaiting_resume") {
|
|
15683
|
-
return {
|
|
15684
|
-
status: "suspended",
|
|
15685
|
-
resumeVersion: sessionRecord.version,
|
|
15686
|
-
...usage ? { usage } : {}
|
|
15687
|
-
};
|
|
15688
|
-
}
|
|
15689
|
-
throw new TurnSliceLimitExceededError(botConfig.maxSlicesPerTurn);
|
|
15690
|
-
}
|
|
15691
|
-
return void 0;
|
|
15804
|
+
throw new TurnSliceLimitExceededError(botConfig.maxSlicesPerTurn);
|
|
15692
15805
|
}
|
|
15693
15806
|
};
|
|
15694
15807
|
}
|
|
@@ -16383,15 +16496,10 @@ async function executeAgentRunInPrivacyContext(request, conversationPrivacy, run
|
|
|
16383
16496
|
loadedSkillNamesForResume = activeSkills.map((skill) => skill.name);
|
|
16384
16497
|
};
|
|
16385
16498
|
const skillSandbox = new SkillSandbox(availableSkills, activeSkills);
|
|
16386
|
-
const {
|
|
16387
|
-
|
|
16388
|
-
|
|
16389
|
-
|
|
16390
|
-
existingSessionRecord
|
|
16391
|
-
} = await restoreSessionRecord({
|
|
16392
|
-
conversationId,
|
|
16393
|
-
turnId
|
|
16394
|
-
});
|
|
16499
|
+
const checkpoint = await loadTurnCheckpoint({ conversationId, turnId });
|
|
16500
|
+
const resumedFromSessionRecord = checkpoint.resumed;
|
|
16501
|
+
const currentSliceId = checkpoint.sliceId;
|
|
16502
|
+
const existingSessionRecord = checkpoint.record;
|
|
16395
16503
|
const committedInstructionProvenance = [
|
|
16396
16504
|
...existingSessionRecord?.piMessageProvenance ?? [],
|
|
16397
16505
|
...(existingSessionRecord?.actors ?? []).map(instructionProvenanceFor),
|
|
@@ -16429,7 +16537,7 @@ async function executeAgentRunInPrivacyContext(request, conversationPrivacy, run
|
|
|
16429
16537
|
runSource,
|
|
16430
16538
|
conversationId,
|
|
16431
16539
|
turnId,
|
|
16432
|
-
|
|
16540
|
+
checkpoint,
|
|
16433
16541
|
startedAtMs: replyStartedAtMs,
|
|
16434
16542
|
surface
|
|
16435
16543
|
});
|
|
@@ -17030,6 +17138,7 @@ async function executeAgentRunInPrivacyContext(request, conversationPrivacy, run
|
|
|
17030
17138
|
runResume.setTurnStartMessageIndex(
|
|
17031
17139
|
existingSessionRecord.turnStartMessageIndex
|
|
17032
17140
|
);
|
|
17141
|
+
runResume.adoptCommittedBoundary([...agent.state.messages]);
|
|
17033
17142
|
} else if (promptHistoryMessages.length > 0) {
|
|
17034
17143
|
agent.state.messages = [...promptHistoryMessages];
|
|
17035
17144
|
}
|
|
@@ -17354,7 +17463,7 @@ async function executeAgentRunInPrivacyContext(request, conversationPrivacy, run
|
|
|
17354
17463
|
throw error.originalError;
|
|
17355
17464
|
}
|
|
17356
17465
|
const runError = error instanceof AssistantMessageDeliveryError ? error.originalError : error;
|
|
17357
|
-
if (runError instanceof AuthPausePersistenceError) {
|
|
17466
|
+
if (runError instanceof AuthPausePersistenceError || runError instanceof TurnSliceLimitExceededError) {
|
|
17358
17467
|
throw runError;
|
|
17359
17468
|
}
|
|
17360
17469
|
if (resume && runError instanceof AuthorizationPauseError) {
|