@tickernelz/paperclip-pro-server 2026.1016.2 → 2026.1017.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +2 -0
- package/dist/middleware/auth.js.map +1 -1
- package/dist/routes/access.d.ts.map +1 -1
- package/dist/routes/access.js +24 -10
- package/dist/routes/access.js.map +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +60 -10
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/approvals.d.ts.map +1 -1
- package/dist/routes/approvals.js +14 -10
- package/dist/routes/approvals.js.map +1 -1
- package/dist/routes/authz.d.ts +1 -0
- package/dist/routes/authz.d.ts.map +1 -1
- package/dist/routes/authz.js +26 -5
- package/dist/routes/authz.js.map +1 -1
- package/dist/routes/companies.d.ts.map +1 -1
- package/dist/routes/companies.js +18 -21
- package/dist/routes/companies.js.map +1 -1
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +80 -21
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/paperclip-mcp.d.ts.map +1 -1
- package/dist/routes/paperclip-mcp.js +13 -3
- package/dist/routes/paperclip-mcp.js.map +1 -1
- package/dist/routes/workspace-command-authz.d.ts.map +1 -1
- package/dist/routes/workspace-command-authz.js +2 -1
- package/dist/routes/workspace-command-authz.js.map +1 -1
- package/dist/routes/workspace-runtime-service-authz.d.ts.map +1 -1
- package/dist/routes/workspace-runtime-service-authz.js +5 -2
- package/dist/routes/workspace-runtime-service-authz.js.map +1 -1
- package/dist/services/agent-authority-escalation.js +2 -2
- package/dist/services/agent-authority-escalation.js.map +1 -1
- package/dist/services/attention.d.ts.map +1 -1
- package/dist/services/attention.js +4 -0
- package/dist/services/attention.js.map +1 -1
- package/dist/services/authorization.d.ts +1 -0
- package/dist/services/authorization.d.ts.map +1 -1
- package/dist/services/authorization.js +39 -3
- package/dist/services/authorization.js.map +1 -1
- package/dist/services/heartbeat/retries.d.ts +1 -0
- package/dist/services/heartbeat/retries.d.ts.map +1 -1
- package/dist/services/heartbeat/retries.js +8 -2
- package/dist/services/heartbeat/retries.js.map +1 -1
- package/dist/services/heartbeat/scheduling.d.ts.map +1 -1
- package/dist/services/heartbeat/scheduling.js +83 -2
- package/dist/services/heartbeat/scheduling.js.map +1 -1
- package/dist/services/heartbeat/workspaces.d.ts +4 -0
- package/dist/services/heartbeat/workspaces.d.ts.map +1 -1
- package/dist/services/heartbeat/workspaces.js +46 -9
- package/dist/services/heartbeat/workspaces.js.map +1 -1
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +3 -3
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/native-runtime/status-decision-committer.d.ts +12 -0
- package/dist/services/native-runtime/status-decision-committer.d.ts.map +1 -1
- package/dist/services/native-runtime/status-decision-committer.js +67 -9
- package/dist/services/native-runtime/status-decision-committer.js.map +1 -1
- package/dist/services/native-runtime/task-reassignment.test.js +8 -1
- package/dist/services/native-runtime/task-reassignment.test.js.map +1 -1
- package/dist/services/recovery/service.d.ts +3 -2
- package/dist/services/recovery/service.d.ts.map +1 -1
- package/dist/services/recovery/service.js +12 -1
- package/dist/services/recovery/service.js.map +1 -1
- package/node_modules/@microsoft/teams.api/package.json +4 -4
- package/node_modules/@microsoft/teams.apps/dist/middleware/auth/inbound-activity-token-validator.d.ts +10 -0
- package/node_modules/@microsoft/teams.apps/dist/middleware/auth/inbound-activity-token-validator.js +22 -3
- package/node_modules/@microsoft/teams.apps/package.json +5 -5
- package/node_modules/@microsoft/teams.cards/package.json +2 -2
- package/node_modules/@microsoft/teams.common/package.json +2 -2
- package/node_modules/@microsoft/teams.graph/package.json +3 -3
- package/node_modules/@microsoft/teams.graph-endpoints/package.json +2 -2
- package/package.json +21 -21
- package/ui-dist/assets/{AgentAvatar-DZh8tNnK.js → AgentAvatar-Cy7DadMK.js} +1 -1
- package/ui-dist/assets/{Agents.production-CVULb5cR.js → Agents.production-BJyEbiQk.js} +2 -2
- package/ui-dist/assets/{BreadcrumbContext-Bxr1TyKN.js → BreadcrumbContext-CIC8QOSJ.js} +2 -2
- package/ui-dist/assets/{CompanyActivity.production-Wked11oO.js → CompanyActivity.production-Dp4ldx4P.js} +1 -1
- package/ui-dist/assets/{CompanyExport-CsJNakda.js → CompanyExport-BBAKbfHg.js} +2 -2
- package/ui-dist/assets/{CompanySkills.production-CXPBOlb3.js → CompanySkills.production-XuOHqAg6.js} +3 -3
- package/ui-dist/assets/{EmptyState-DliXLd04.js → EmptyState-Dvu_j1Dk.js} +1 -1
- package/ui-dist/assets/{MarkdownBody-B5ygzgk6.js → MarkdownBody-Dh6kczcO.js} +3 -3
- package/ui-dist/assets/{MarkdownEditor-D7suACD6.js → MarkdownEditor-nPcj3w4g.js} +4 -4
- package/ui-dist/assets/{OrgChart.production-BjDW9Rac.js → OrgChart.production-B-U1K3BO.js} +1 -1
- package/ui-dist/assets/{PageSkeleton-BZF4K6Hf.js → PageSkeleton-B858kNMV.js} +1 -1
- package/ui-dist/assets/{RoutineDetail.production-C03tDWie.js → RoutineDetail.production-DR37hdFP.js} +1 -1
- package/ui-dist/assets/{RoutineRunVariablesDialog-DE5hp-_u.js → RoutineRunVariablesDialog-TmqPj_PL.js} +2 -2
- package/ui-dist/assets/{Routines.production-CDaXZ2Kc.js → Routines.production-D4Jwvus7.js} +1 -1
- package/ui-dist/assets/{StatusIcon-YdJnE47W.js → StatusIcon-PIDWeOS3.js} +1 -1
- package/ui-dist/assets/{ToastContext-Dh8dPdr5.js → ToastContext-B6w8XXdu.js} +1 -1
- package/ui-dist/assets/{agent-avatar-url-BnmqahQ7.js → agent-avatar-url-Dp-4-Emx.js} +1 -1
- package/ui-dist/assets/{alert-dialog-BxpRolrb.js → alert-dialog-Cgn1_GT7.js} +1 -1
- package/ui-dist/assets/{arrow-right-bnOoaiPg.js → arrow-right-Dblp-MTW.js} +1 -1
- package/ui-dist/assets/{badge-D5aOL1Ll.js → badge-B6lcLGFG.js} +1 -1
- package/ui-dist/assets/{bot-DpNd1tv2.js → bot-BIsZWSPn.js} +1 -1
- package/ui-dist/assets/{card-PCL2aF_L.js → card-Byu34cBe.js} +1 -1
- package/ui-dist/assets/{check-BiXfODpl.js → check-AN9f-5s7.js} +1 -1
- package/ui-dist/assets/{checkbox-5wFlZdZn.js → checkbox-DVrU8RYw.js} +1 -1
- package/ui-dist/assets/{clipboard-CTmezHYG.js → clipboard-Bj1LrAus.js} +1 -1
- package/ui-dist/assets/{company-members-Dd6xBf6K.js → company-members-B3Kl56Wi.js} +1 -1
- package/ui-dist/assets/{definition-CjvFnh6k.js → definition-DSY4nExe.js} +1 -1
- package/ui-dist/assets/{dist-BrRwU9U9.js → dist-BoN0lntx.js} +1 -1
- package/ui-dist/assets/{dist-CvM0_U_m.js → dist-DNeg6Olm.js} +1 -1
- package/ui-dist/assets/{dist-CMegW-DS.js → dist-qobNlkwf.js} +1 -1
- package/ui-dist/assets/{environments-Bj-4l7Ol.js → environments-CnsaRGwX.js} +1 -1
- package/ui-dist/assets/{external-link-LnxJtUIq.js → external-link-DJ5KXpF5.js} +1 -1
- package/ui-dist/assets/{file-text-Ba5Wddur.js → file-text-BqJfYVg5.js} +1 -1
- package/ui-dist/assets/{health-D8T5Zr74.js → health-DXJ-aWLi.js} +1 -1
- package/ui-dist/assets/{heartbeats-Dae6h2SU.js → heartbeats-BoD7FLml.js} +1 -1
- package/ui-dist/assets/{index-D4MfEOIw.js → index-BVwUuuxT.js} +168 -168
- package/ui-dist/assets/{input-CtLHwxEw.js → input-BGjNwUvf.js} +1 -1
- package/ui-dist/assets/{label-YjU0jMtG.js → label-CKJXPwWx.js} +2 -2
- package/ui-dist/assets/{mention-chips-ClRmijVb.js → mention-chips-BovBgzq0.js} +1 -1
- package/ui-dist/assets/{rotate-ccw-2WnWy1fs.js → rotate-ccw-B7ntLtp4.js} +1 -1
- package/ui-dist/assets/{select-DRgGQ-iP.js → select-DIma4_VX.js} +1 -1
- package/ui-dist/assets/{sheet-CACWxbsc.js → sheet-C9tsiOQC.js} +1 -1
- package/ui-dist/assets/skeleton-CyS6Uq5n.js +1 -0
- package/ui-dist/assets/{tabs-BfOtoFWj.js → tabs-nc-7quf8.js} +1 -1
- package/ui-dist/assets/{use-adapter-capabilities-JhD0-FlQ.js → use-adapter-capabilities-DiUfxjZz.js} +1 -1
- package/ui-dist/assets/{use-copy-action-qHyHFl14.js → use-copy-action-RWCAx8p8.js} +1 -1
- package/ui-dist/assets/{useHiddenSettings-Dz7GWNDr.js → useHiddenSettings-Be7MTSIM.js} +1 -1
- package/ui-dist/index.html +39 -39
- package/ui-dist/sw.js +1 -1
- package/ui-dist/assets/skeleton-DCrngTtF.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/routes/issues.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/routes/issues.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/issues.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { parseObject } from "../adapters/utils.js";
|
|
2
2
|
import { enqueueFastResponse } from "../services/fast-responses.js";
|
|
3
|
+
import { deferUntilAdapterTurnActive } from "@tickernelz/paperclip-pro-adapter-utils/adapter-steer-registry";
|
|
3
4
|
import { hasRequiredWorkspaceRecovery, LEGACY_WORKSPACE_RECOVERY_SCHEMA } from "../services/workspace-restore-recovery-state.js";
|
|
4
5
|
import { monitorPoliciesEqual, applyActorMonitorScheduledBy, assertCanManageIssueMonitor, summarizeIssueMonitor } from "../services/issue-monitors.js";
|
|
5
6
|
import { canActorReadHeartbeatRun } from "../services/heartbeat-run-privacy.js";
|
|
@@ -56,7 +57,7 @@ import { logger } from "../middleware/logger.js";
|
|
|
56
57
|
import { badRequest, conflict, forbidden, HttpError, notFound, unauthorized, unprocessable, } from "../errors.js";
|
|
57
58
|
import { privateJsonEtag } from "../middleware/private-json-etag.js";
|
|
58
59
|
import { createRequestPromiseMemo } from "../lib/request-promise-memo.js";
|
|
59
|
-
import { assertBoard, assertBoardOrAgentAuthority, assertCompanyAccess, getAccessibleResource, getActorInfo, hasAgentAuthority, } from "./authz.js";
|
|
60
|
+
import { assertBoard, assertBoardOrAgentAuthority, assertCompanyAccess, getAccessibleResource, getActorInfo, hasAgentAuthority, isCompanyOwnerAgentActor, } from "./authz.js";
|
|
60
61
|
import { assertNoAgentHostWorkspaceCommandMutation, collectIssueWorkspaceCommandPaths, } from "./workspace-command-authz.js";
|
|
61
62
|
import { shouldWakeAssigneeOnCheckout } from "./issues-checkout-wakeup.js";
|
|
62
63
|
import { normalizeContentType, normalizeUploadAttachmentContentType, } from "../attachment-types.js";
|
|
@@ -2379,7 +2380,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
2379
2380
|
return resolveActorSourceTrustForIssue({ db, issue, actor });
|
|
2380
2381
|
}
|
|
2381
2382
|
async function assertCrossIssueInfluenceWithinRunCap(req, res, issue, kind) {
|
|
2382
|
-
if (req.actor.type !== "agent")
|
|
2383
|
+
if (req.actor.type !== "agent" || isCompanyOwnerAgentActor(req))
|
|
2383
2384
|
return true;
|
|
2384
2385
|
if (!req.actor.agentId || !req.actor.runId)
|
|
2385
2386
|
throw crossIssueInfluenceRunContextError();
|
|
@@ -2640,7 +2641,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
2640
2641
|
});
|
|
2641
2642
|
}
|
|
2642
2643
|
async function actorIsLowTrustReview(req, companyId, issue) {
|
|
2643
|
-
if (req.actor.type !== "agent")
|
|
2644
|
+
if (req.actor.type !== "agent" || isCompanyOwnerAgentActor(req))
|
|
2644
2645
|
return false;
|
|
2645
2646
|
const resolution = await resolveAgentTrustForIssue({
|
|
2646
2647
|
agentId: req.actor.agentId,
|
|
@@ -3861,7 +3862,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
3861
3862
|
async function assertAgentIssueMutationAllowed(req, res, issue, options = {}) {
|
|
3862
3863
|
if (!(await assertIssueReadAllowed(req, res, issue)))
|
|
3863
3864
|
return false;
|
|
3864
|
-
if (req.actor.type !== "agent")
|
|
3865
|
+
if (req.actor.type !== "agent" || isCompanyOwnerAgentActor(req))
|
|
3865
3866
|
return true;
|
|
3866
3867
|
const actorAgentId = req.actor.agentId;
|
|
3867
3868
|
if (!actorAgentId) {
|
|
@@ -7413,7 +7414,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
7413
7414
|
agentId: actor.agentId ?? null,
|
|
7414
7415
|
userId: actor.actorType === "user" ? actor.actorId : null,
|
|
7415
7416
|
},
|
|
7416
|
-
allowBoardOverride: req.actor.type === "board" && req.actor.source !== "mcp_oauth",
|
|
7417
|
+
allowBoardOverride: (req.actor.type === "board" && req.actor.source !== "mcp_oauth") || isCompanyOwnerAgentActor(req),
|
|
7417
7418
|
commentBody: resolutionNote ?? null,
|
|
7418
7419
|
});
|
|
7419
7420
|
Object.assign(updateFields, transition.patch);
|
|
@@ -10369,7 +10370,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
10369
10370
|
: null;
|
|
10370
10371
|
const { comment: commentBody, commentClientRequestId, attachmentIds: commentAttachmentIds, reviewInteractionId: requestedReviewInteractionId, reviewRequest, reopen: reopenRequested, resume: resumeRequested, interrupt: interruptRequested, deferWakeForGoal, hiddenAt: hiddenAtRaw, expectedExecutionPolicy, onBehalfOfUserId: _requestedOnBehalfOfUserId, modelOverride: requestedModelOverride, ...updateFields } = req.body;
|
|
10371
10372
|
if (requestedModelOverride !== undefined) {
|
|
10372
|
-
if (req.actor.type === "agent") {
|
|
10373
|
+
if (req.actor.type === "agent" && !isCompanyOwnerAgentActor(req)) {
|
|
10373
10374
|
res.status(403).json({
|
|
10374
10375
|
error: "Agents cannot change the per-task model override",
|
|
10375
10376
|
});
|
|
@@ -10567,7 +10568,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
10567
10568
|
});
|
|
10568
10569
|
return;
|
|
10569
10570
|
}
|
|
10570
|
-
if (req.actor.type !== "board") {
|
|
10571
|
+
if (req.actor.type !== "board" && !isCompanyOwnerAgentActor(req)) {
|
|
10571
10572
|
res.status(403).json({
|
|
10572
10573
|
error: "Only board users can interrupt active runs from issue comments",
|
|
10573
10574
|
});
|
|
@@ -10655,7 +10656,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
10655
10656
|
agentId: actor.agentId ?? null,
|
|
10656
10657
|
userId: actor.actorType === "user" ? actor.actorId : null,
|
|
10657
10658
|
},
|
|
10658
|
-
allowBoardOverride: req.actor.type === "board" && req.actor.source !== "mcp_oauth",
|
|
10659
|
+
allowBoardOverride: (req.actor.type === "board" && req.actor.source !== "mcp_oauth") || isCompanyOwnerAgentActor(req),
|
|
10659
10660
|
commentBody,
|
|
10660
10661
|
reviewRequest: reviewRequest === undefined ? undefined : reviewRequest,
|
|
10661
10662
|
monitorExplicitlyUpdated: req.body.executionPolicy !== undefined && monitorChanged,
|
|
@@ -10719,6 +10720,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
10719
10720
|
if (descriptor && typeof descriptor === "object") {
|
|
10720
10721
|
const owner = descriptor.owner;
|
|
10721
10722
|
if (req.actor.type === "agent" &&
|
|
10723
|
+
!isCompanyOwnerAgentActor(req) &&
|
|
10722
10724
|
(owner === "board" || "userId" in owner)) {
|
|
10723
10725
|
throw forbidden("Agents may only name themselves as an unblock owner");
|
|
10724
10726
|
}
|
|
@@ -10732,6 +10734,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
10732
10734
|
if (!target)
|
|
10733
10735
|
throw unprocessable("Unblock owner agent must belong to the issue company");
|
|
10734
10736
|
if (req.actor.type === "agent" &&
|
|
10737
|
+
!isCompanyOwnerAgentActor(req) &&
|
|
10735
10738
|
req.actor.agentId !== owner.agentId) {
|
|
10736
10739
|
throw forbidden("Agents may only name themselves as an unblock owner");
|
|
10737
10740
|
}
|
|
@@ -13143,13 +13146,31 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
13143
13146
|
* because you asked" from "you asked to steer and got a queue instead".
|
|
13144
13147
|
*/
|
|
13145
13148
|
async function resolveMessageDeliveryDisposition(input) {
|
|
13149
|
+
const queued = async (steeringUnavailable, detail = {}) => {
|
|
13150
|
+
if (steeringUnavailable !== "not_requested") {
|
|
13151
|
+
try {
|
|
13152
|
+
await logQueuedCommentQueued({
|
|
13153
|
+
issue: input.issue,
|
|
13154
|
+
actor: input.actor,
|
|
13155
|
+
commentId: input.commentId,
|
|
13156
|
+
targetRunId: detail.targetRunId ?? null,
|
|
13157
|
+
reason: steeringUnavailable,
|
|
13158
|
+
errorCode: detail.errorCode ?? null,
|
|
13159
|
+
});
|
|
13160
|
+
}
|
|
13161
|
+
catch (err) {
|
|
13162
|
+
logger.warn({ err, issueId: input.issue.id, commentId: input.commentId, reason: steeringUnavailable }, "failed to record the queue reason for a posted comment");
|
|
13163
|
+
}
|
|
13164
|
+
}
|
|
13165
|
+
return { deliveredAs: "queued", steeringUnavailable };
|
|
13166
|
+
};
|
|
13146
13167
|
const effective = input.requested ??
|
|
13147
13168
|
(await instanceSettings.getGeneral()).defaultMessageDelivery;
|
|
13148
13169
|
if (effective === "queue") {
|
|
13149
13170
|
return { deliveredAs: "queued", steeringUnavailable: "not_requested" };
|
|
13150
13171
|
}
|
|
13151
13172
|
if (input.actor.actorType !== "agent" && !input.boardUserId) {
|
|
13152
|
-
return
|
|
13173
|
+
return queued("board_only");
|
|
13153
13174
|
}
|
|
13154
13175
|
if (input.actor.actorType === "agent" &&
|
|
13155
13176
|
(!input.actor.agentId || input.actor.agentId === input.issue.assigneeAgentId)) {
|
|
@@ -13161,7 +13182,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
13161
13182
|
return false;
|
|
13162
13183
|
});
|
|
13163
13184
|
if (!maySteer)
|
|
13164
|
-
return
|
|
13185
|
+
return queued("conversation_order");
|
|
13165
13186
|
}
|
|
13166
13187
|
try {
|
|
13167
13188
|
await input.wakeDispatch;
|
|
@@ -13171,14 +13192,11 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
13171
13192
|
}
|
|
13172
13193
|
const resolved = await resolveQueuedSteeringTarget(input);
|
|
13173
13194
|
if (resolved.kind === "unavailable") {
|
|
13174
|
-
return
|
|
13195
|
+
return queued(resolved.reason);
|
|
13175
13196
|
}
|
|
13176
13197
|
const target = resolved.kind === "target" ? resolved.target : null;
|
|
13177
13198
|
if (!target) {
|
|
13178
|
-
return
|
|
13179
|
-
deliveredAs: "queued",
|
|
13180
|
-
steeringUnavailable: input.requested === "steer" ? "no_active_run" : "not_requested",
|
|
13181
|
-
};
|
|
13199
|
+
return queued(input.requested === "steer" ? "no_active_run" : "not_requested");
|
|
13182
13200
|
}
|
|
13183
13201
|
if (input.actor.actorType === "agent") {
|
|
13184
13202
|
const blocked = await agentSteeringBlock({
|
|
@@ -13188,7 +13206,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
13188
13206
|
targetRunId: target.targetRunId,
|
|
13189
13207
|
});
|
|
13190
13208
|
if (blocked)
|
|
13191
|
-
return
|
|
13209
|
+
return queued(blocked, { targetRunId: target.targetRunId });
|
|
13192
13210
|
}
|
|
13193
13211
|
let steered;
|
|
13194
13212
|
try {
|
|
@@ -13201,10 +13219,18 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
13201
13219
|
});
|
|
13202
13220
|
}
|
|
13203
13221
|
catch (error) {
|
|
13204
|
-
|
|
13205
|
-
|
|
13206
|
-
|
|
13207
|
-
|
|
13222
|
+
if (steeringErrorCode(error) === "steering_stale_turn") {
|
|
13223
|
+
deferUntilAdapterTurnActive(target.targetRunId, async () => {
|
|
13224
|
+
const issue = await svc.getById(input.issue.id);
|
|
13225
|
+
if (!issue || issue.companyId !== input.issue.companyId)
|
|
13226
|
+
return;
|
|
13227
|
+
await resolveMessageDeliveryDisposition({ ...input, issue, wakeDispatch: Promise.resolve() });
|
|
13228
|
+
});
|
|
13229
|
+
}
|
|
13230
|
+
return queued(steeringUnavailableFromError(error), {
|
|
13231
|
+
targetRunId: target.targetRunId,
|
|
13232
|
+
errorCode: steeringErrorCode(error),
|
|
13233
|
+
});
|
|
13208
13234
|
}
|
|
13209
13235
|
try {
|
|
13210
13236
|
await logQueuedCommentSteered({
|
|
@@ -13228,6 +13254,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
13228
13254
|
if (!["accepted", "answered", "rejected"].includes(interaction.status))
|
|
13229
13255
|
return false;
|
|
13230
13256
|
let steered = null;
|
|
13257
|
+
let targetRunId = null;
|
|
13231
13258
|
const issue = await svc.getById(input.issueId).catch(() => null);
|
|
13232
13259
|
if (!issue?.assigneeAgentId)
|
|
13233
13260
|
return false;
|
|
@@ -13241,6 +13268,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
13241
13268
|
const resolved = await resolveQueuedSteeringTarget({ issue, commentId: interaction.id, actor });
|
|
13242
13269
|
if (resolved.kind !== "target")
|
|
13243
13270
|
return false;
|
|
13271
|
+
targetRunId = resolved.target.targetRunId;
|
|
13244
13272
|
steered = {
|
|
13245
13273
|
targetRunId: resolved.target.targetRunId,
|
|
13246
13274
|
receipt: await steerQueuedCommentWithRetry({
|
|
@@ -13253,6 +13281,18 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
13253
13281
|
};
|
|
13254
13282
|
}
|
|
13255
13283
|
catch (err) {
|
|
13284
|
+
if (targetRunId && steeringErrorCode(err) === "steering_stale_turn") {
|
|
13285
|
+
deferUntilAdapterTurnActive(targetRunId, async () => {
|
|
13286
|
+
const [current] = await db
|
|
13287
|
+
.select()
|
|
13288
|
+
.from(issueThreadInteractions)
|
|
13289
|
+
.where(and(eq(issueThreadInteractions.id, interaction.id), eq(issueThreadInteractions.companyId, interaction.companyId)))
|
|
13290
|
+
.limit(1);
|
|
13291
|
+
if (!current || current.issueId !== input.issueId)
|
|
13292
|
+
return;
|
|
13293
|
+
await steerInteractionResponse({ ...input, interaction: current });
|
|
13294
|
+
});
|
|
13295
|
+
}
|
|
13256
13296
|
logger.warn({ err, issueId: issue.id, interactionId: interaction.id, code: steeringErrorCode(err) }, "interaction response stays queued because steering was refused");
|
|
13257
13297
|
return false;
|
|
13258
13298
|
}
|
|
@@ -13428,6 +13468,25 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
13428
13468
|
},
|
|
13429
13469
|
});
|
|
13430
13470
|
}
|
|
13471
|
+
async function logQueuedCommentQueued(input) {
|
|
13472
|
+
await logActivity(db, {
|
|
13473
|
+
companyId: input.issue.companyId,
|
|
13474
|
+
actorType: input.actor.actorType,
|
|
13475
|
+
actorId: input.actor.actorId,
|
|
13476
|
+
agentId: input.actor.agentId,
|
|
13477
|
+
runId: input.actor.runId,
|
|
13478
|
+
agentApiKeyId: input.actor.agentApiKeyId,
|
|
13479
|
+
action: "issue.queued_comment_queued",
|
|
13480
|
+
entityType: "issue",
|
|
13481
|
+
entityId: input.issue.id,
|
|
13482
|
+
details: {
|
|
13483
|
+
commentId: input.commentId,
|
|
13484
|
+
targetRunId: input.targetRunId,
|
|
13485
|
+
reason: input.reason,
|
|
13486
|
+
errorCode: input.errorCode,
|
|
13487
|
+
},
|
|
13488
|
+
});
|
|
13489
|
+
}
|
|
13431
13490
|
router.post("/issues/:id/queued-comments/:commentId/steer", validate(queuedCommentSteeringTargetSchema), async (req, res) => {
|
|
13432
13491
|
assertBoard(req);
|
|
13433
13492
|
if (!req.actor.userId)
|
|
@@ -15080,7 +15139,7 @@ export function issueRoutes(db, storage, opts = {}) {
|
|
|
15080
15139
|
});
|
|
15081
15140
|
}
|
|
15082
15141
|
if (interruptRequested) {
|
|
15083
|
-
if (req.actor.type !== "board") {
|
|
15142
|
+
if (req.actor.type !== "board" && !isCompanyOwnerAgentActor(req)) {
|
|
15084
15143
|
res.status(403).json({
|
|
15085
15144
|
error: "Only board users can interrupt active runs from issue comments",
|
|
15086
15145
|
});
|