@rallycry/conveyor-agent 11.0.22 → 11.0.24

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.
@@ -8,7 +8,7 @@ import {
8
8
  readWorkspaceBytes,
9
9
  statWorkspacePath,
10
10
  workspacePathExists
11
- } from "./chunk-OMD77OIJ.js";
11
+ } from "./chunk-YNI2HFZE.js";
12
12
  import {
13
13
  reportBootMilestone
14
14
  } from "./chunk-Q4FQOJ7D.js";
@@ -26,6 +26,9 @@ function buildSpawnArgs(input) {
26
26
  args.push("--permission-mode", "plan");
27
27
  }
28
28
  args.push("--settings", input.settingsPath);
29
+ if (input.disallowedTools && input.disallowedTools.length > 0) {
30
+ args.push("--disallowed-tools", input.disallowedTools.join(","));
31
+ }
29
32
  if (input.appendSystemPrompt) {
30
33
  args.push("--append-system-prompt", input.appendSystemPrompt);
31
34
  }
@@ -1446,7 +1446,7 @@ ${q.question}${q.options.length ? "\n" + q.options.map((o) => `- ${o.label}: ${o
1446
1446
  }
1447
1447
  };
1448
1448
 
1449
- // ../shared/dist/chunk-VQSAISHG.js
1449
+ // ../shared/dist/chunk-6NPOGQPP.js
1450
1450
  import { z } from "zod";
1451
1451
  var DEFAULT_SONNET_MODEL = "claude-sonnet-5";
1452
1452
  var DEFAULT_OPUS_MODEL = "claude-opus-5";
@@ -1709,6 +1709,8 @@ import { z as z7 } from "zod";
1709
1709
  import { z as z8 } from "zod";
1710
1710
  import { z as z9 } from "zod";
1711
1711
  import { z as z10 } from "zod";
1712
+ import { z as z11 } from "zod";
1713
+ import { z as z12 } from "zod";
1712
1714
  var EXTERNAL_AGENT_MESSAGE_SOURCE = "external_agent";
1713
1715
  var TUI_KINDS = ["claude-code", "opencode", "codex"];
1714
1716
  var ACHIEVEMENT_RARITIES = [
@@ -1804,6 +1806,13 @@ var TurnEndToolCallSchema = z22.object({
1804
1806
  output: z22.string().optional(),
1805
1807
  timestamp: z22.string().optional()
1806
1808
  }).passthrough();
1809
+ var AgentTurnUsageSchema = z22.object({
1810
+ inputTokens: z22.number(),
1811
+ outputTokens: z22.number(),
1812
+ cacheReadInputTokens: z22.number(),
1813
+ cacheCreationInputTokens: z22.number(),
1814
+ totalTokens: z22.number()
1815
+ });
1807
1816
  var KnownAgentEventSchema = z22.discriminatedUnion("type", [
1808
1817
  // ── Lifecycle / connection ────────────────────────────────────────────
1809
1818
  z22.object({
@@ -1843,7 +1852,11 @@ var KnownAgentEventSchema = z22.discriminatedUnion("type", [
1843
1852
  z22.object({
1844
1853
  type: z22.literal("completed"),
1845
1854
  summary: z22.string().optional(),
1846
- durationMs: z22.number().optional()
1855
+ durationMs: z22.number().optional(),
1856
+ /** Tokens this turn consumed, summed from the transcript's assistant
1857
+ * records. Optional: an older agent build sends none, and the server
1858
+ * then records nothing rather than zeroing the session's totals. */
1859
+ usage: AgentTurnUsageSchema.optional()
1847
1860
  }).passthrough(),
1848
1861
  z22.object({ type: z22.literal("error"), message: z22.string() }).passthrough(),
1849
1862
  z22.object({ type: z22.literal("agent_typing_start") }).passthrough(),
@@ -3235,135 +3248,304 @@ var CRITICAL_AUTOMATED_SOURCES = /* @__PURE__ */ new Set([
3235
3248
  // clear the completion guard.
3236
3249
  "ci_result"
3237
3250
  ]);
3251
+ var DECISION_STATUS_LABELS = ["Open", "Decided", "Cancelled"];
3252
+ var DECISION_OPTION_KINDS = ["current", "planned", "proposed"];
3253
+ var DECISION_VOTE_SOURCES = ["web", "slack", "discord", "agent"];
3254
+ var DECISION_OPTIONS_MIN = 2;
3255
+ var DECISION_OPTIONS_MAX = 3;
3256
+ var DECISION_OPTION_LABEL_MAX = 80;
3257
+ var DECISION_QUESTION_MAX = 200;
3258
+ var DECISION_RESOLUTION_MAX = CARD_DESCRIPTION_MAX;
3259
+ var DECISION_VOTE_REASON_MAX = CARD_DESCRIPTION_MAX;
3260
+ var DECISION_DEADLINE_MIN_HOURS = 1;
3261
+ var DECISION_DEADLINE_MAX_DAYS = 30;
3262
+ var DECISION_DEADLINE_MAX_HOURS = DECISION_DEADLINE_MAX_DAYS * 24;
3263
+ var DECISION_LIST_MAX_LIMIT = 200;
3264
+ var decisionIdSchema = z10.string().cuid("Invalid decision ID");
3265
+ var optionInputSchema = z10.object({
3266
+ label: z10.string().min(1, "Option label is required").max(DECISION_OPTION_LABEL_MAX),
3267
+ description: z10.string().min(1, "Describe the option as GIVEN / WHEN / THEN"),
3268
+ kind: z10.enum(DECISION_OPTION_KINDS).optional()
3269
+ });
3270
+ var optionsArraySchema = z10.array(optionInputSchema).min(DECISION_OPTIONS_MIN, `A decision needs at least ${DECISION_OPTIONS_MIN} options`).max(
3271
+ DECISION_OPTIONS_MAX,
3272
+ `A decision takes at most ${DECISION_OPTIONS_MAX} options \u2014 more than that means the question is not framed yet`
3273
+ );
3274
+ var CreateDecisionRequestSchema = z10.object({
3275
+ projectId: z10.string().cuid("Invalid project ID"),
3276
+ /** The question, as one plain sentence. */
3277
+ title: z10.string().min(1, "A decision needs a question").max(DECISION_QUESTION_MAX),
3278
+ description: z10.string().max(CARD_DESCRIPTION_MAX).optional(),
3279
+ context: z10.string().min(1, "Context is required \u2014 say why this is being asked now"),
3280
+ options: optionsArraySchema,
3281
+ /** 1-based position of the option that wins on silence. */
3282
+ defaultOptionOrdinal: z10.number().int().min(1).max(DECISION_OPTIONS_MAX),
3283
+ deadlineHours: z10.number().min(DECISION_DEADLINE_MIN_HOURS).max(DECISION_DEADLINE_MAX_HOURS).optional(),
3284
+ /** Cards this decision blocks, by cuid or slug. */
3285
+ impactedCardRefs: z10.array(z10.string().min(1)).max(50).optional(),
3286
+ tagNames: z10.array(z10.string().min(1)).max(10).optional(),
3287
+ raisedByTaskId: z10.string().min(1).optional(),
3288
+ raisedByPrNumber: z10.number().int().positive().optional()
3289
+ });
3290
+ var VoteDecisionRequestSchema = z10.object({
3291
+ decisionId: decisionIdSchema,
3292
+ optionId: z10.string().cuid("Invalid option ID"),
3293
+ reason: z10.string().max(DECISION_VOTE_REASON_MAX).optional(),
3294
+ source: z10.enum(DECISION_VOTE_SOURCES).optional()
3295
+ });
3296
+ var RemoveDecisionVoteRequestSchema = z10.object({
3297
+ decisionId: decisionIdSchema
3298
+ });
3299
+ var ResolveDecisionRequestSchema = z10.object({
3300
+ decisionId: decisionIdSchema,
3301
+ chosenOptionId: z10.string().cuid("Invalid option ID"),
3302
+ resolution: z10.string().min(1, "A resolution is required \u2014 say what was decided").max(DECISION_RESOLUTION_MAX),
3303
+ resolutionNotes: z10.string().optional()
3304
+ });
3305
+ var CancelDecisionRequestSchema = z10.object({
3306
+ decisionId: decisionIdSchema,
3307
+ /** Why it is being dropped. Posted to the decision thread. */
3308
+ reason: z10.string().max(DECISION_RESOLUTION_MAX).optional()
3309
+ });
3310
+ var ReopenDecisionRequestSchema = z10.object({
3311
+ decisionId: decisionIdSchema,
3312
+ deadlineHours: z10.number().min(DECISION_DEADLINE_MIN_HOURS).max(DECISION_DEADLINE_MAX_HOURS).optional()
3313
+ });
3314
+ var UpdateDecisionRequestSchema = z10.object({
3315
+ decisionId: decisionIdSchema,
3316
+ title: z10.string().min(1).max(200).optional(),
3317
+ description: z10.string().max(CARD_DESCRIPTION_MAX).optional(),
3318
+ context: z10.string().min(1).optional(),
3319
+ deadlineAt: z10.string().datetime().optional(),
3320
+ /** Only accepted while the decision has zero votes. */
3321
+ options: optionsArraySchema.optional(),
3322
+ defaultOptionOrdinal: z10.number().int().min(1).max(DECISION_OPTIONS_MAX).optional(),
3323
+ addImpactedCardRefs: z10.array(z10.string().min(1)).max(50).optional(),
3324
+ removeImpactedCardIds: z10.array(z10.string().min(1)).max(50).optional()
3325
+ });
3326
+ var GetDecisionRequestSchema = z10.object({
3327
+ /** cuid or slug. A slug needs `projectId` to resolve unambiguously. */
3328
+ decisionId: z10.string().min(1),
3329
+ projectId: z10.string().cuid().optional()
3330
+ });
3331
+ var ListDecisionsRequestSchema = z10.object({
3332
+ projectId: z10.string().cuid("Invalid project ID"),
3333
+ status: z10.enum(DECISION_STATUS_LABELS).optional(),
3334
+ /** Tag name, not id — an agent knows the tag it is working under. */
3335
+ tag: z10.string().min(1).optional(),
3336
+ /** Decisions that this card is blocked by (cuid or slug). */
3337
+ cardId: z10.string().min(1).optional(),
3338
+ query: z10.string().min(1).optional(),
3339
+ limit: z10.number().int().min(1).max(DECISION_LIST_MAX_LIMIT).optional()
3340
+ });
3341
+ var optionInput = z11.object({
3342
+ label: z11.string().min(1).max(DECISION_OPTION_LABEL_MAX),
3343
+ description: z11.string().min(1),
3344
+ kind: z11.enum(DECISION_OPTION_KINDS).optional()
3345
+ });
3346
+ var optionsInput = z11.array(optionInput).min(DECISION_OPTIONS_MIN).max(DECISION_OPTIONS_MAX);
3347
+ var deadlineHours = z11.number().min(DECISION_DEADLINE_MIN_HOURS).max(DECISION_DEADLINE_MAX_HOURS).optional();
3348
+ var CreateProjectDecisionRequestSchema = z11.object({
3349
+ projectId: z11.string(),
3350
+ question: z11.string().min(1).max(200),
3351
+ summary: z11.string().max(CARD_DESCRIPTION_MAX).optional(),
3352
+ context: z11.string().min(1),
3353
+ options: optionsInput,
3354
+ defaultOption: z11.number().int().min(1).max(DECISION_OPTIONS_MAX),
3355
+ deadlineHours,
3356
+ impactedCards: z11.array(z11.string().min(1)).max(50).optional(),
3357
+ /**
3358
+ * Pod surface only: also block the card this session is working on. The
3359
+ * session's task id is resolved SERVER-side from `sessionId` — a
3360
+ * client-supplied card id would let a pod block any card in the project.
3361
+ */
3362
+ includeCurrentCard: z11.boolean().optional(),
3363
+ sessionId: z11.string().optional(),
3364
+ tagNames: z11.array(z11.string().min(1)).max(10).optional(),
3365
+ raisedByPr: z11.number().int().positive().optional(),
3366
+ /** Slug or id of the card that raised the question. A link back, not a block. */
3367
+ raisedByCard: z11.string().min(1).optional(),
3368
+ /** Absolute deadline (ISO 8601). Wins over `deadlineHours` when both are sent. */
3369
+ deadlineAt: z11.string().datetime({ offset: true }).optional(),
3370
+ requestingUserId: z11.string().optional()
3371
+ });
3372
+ var ListProjectDecisionsRequestSchema = z11.object({
3373
+ projectId: z11.string(),
3374
+ status: z11.enum(DECISION_STATUS_LABELS).optional(),
3375
+ tag: z11.string().min(1).optional(),
3376
+ card: z11.string().min(1).optional(),
3377
+ query: z11.string().min(1).optional(),
3378
+ limit: z11.number().int().min(1).max(DECISION_LIST_MAX_LIMIT).optional(),
3379
+ requestingUserId: z11.string().optional()
3380
+ });
3381
+ var GetProjectDecisionRequestSchema = z11.object({
3382
+ projectId: z11.string(),
3383
+ decision: z11.string().min(1),
3384
+ requestingUserId: z11.string().optional()
3385
+ });
3386
+ var VoteProjectDecisionRequestSchema = z11.object({
3387
+ projectId: z11.string(),
3388
+ decision: z11.string().min(1),
3389
+ /** An option id, or its 1-based position. */
3390
+ option: z11.string().min(1),
3391
+ reason: z11.string().max(CARD_DESCRIPTION_MAX).optional(),
3392
+ requestingUserId: z11.string().optional()
3393
+ });
3394
+ var ResolveProjectDecisionRequestSchema = z11.object({
3395
+ projectId: z11.string(),
3396
+ decision: z11.string().min(1),
3397
+ option: z11.string().min(1),
3398
+ resolution: z11.string().min(1).max(DECISION_RESOLUTION_MAX),
3399
+ notes: z11.string().optional(),
3400
+ requestingUserId: z11.string().optional()
3401
+ });
3402
+ var UpdateProjectDecisionRequestSchema = z11.object({
3403
+ projectId: z11.string(),
3404
+ decision: z11.string().min(1),
3405
+ question: z11.string().min(1).max(200).optional(),
3406
+ summary: z11.string().max(CARD_DESCRIPTION_MAX).optional(),
3407
+ context: z11.string().min(1).optional(),
3408
+ /** Accepted only while nobody has voted. */
3409
+ options: optionsInput.optional(),
3410
+ defaultOption: z11.number().int().min(1).max(DECISION_OPTIONS_MAX).optional(),
3411
+ tagNames: z11.array(z11.string().min(1)).max(10).optional(),
3412
+ deadlineHours,
3413
+ /** Absolute deadline (ISO 8601). Wins over `deadlineHours` when both are sent. */
3414
+ deadlineAt: z11.string().datetime({ offset: true }).optional(),
3415
+ addImpactedCards: z11.array(z11.string().min(1)).max(50).optional(),
3416
+ removeImpactedCards: z11.array(z11.string().min(1)).max(50).optional(),
3417
+ status: z11.enum(["Cancelled", "Open"]).optional(),
3418
+ requestingUserId: z11.string().optional()
3419
+ });
3238
3420
  var MEETING_CHECKLIST_TITLE_MAX = 300;
3239
3421
  var MEETING_TRANSCRIPT_MAX_CHARS = 2e6;
3240
3422
  var MEETING_TITLE_MAX = 200;
3241
3423
  var MEETING_OCCURRED_AT_MIN_YEAR = 2e3;
3242
3424
  var MEETING_OCCURRED_AT_MAX_FUTURE_MS = 48 * 60 * 60 * 1e3;
3243
3425
  var OCCURRED_AT_RANGE_MESSAGE = `occurredAt must be a real date: no earlier than ${MEETING_OCCURRED_AT_MIN_YEAR}, and no more than 48 hours in the future.`;
3244
- var MeetingOccurredAtSchema = z10.string().datetime().refine((value) => {
3426
+ var MeetingOccurredAtSchema = z12.string().datetime().refine((value) => {
3245
3427
  const ms = Date.parse(value);
3246
3428
  if (Number.isNaN(ms)) return false;
3247
3429
  if (ms > Date.now() + MEETING_OCCURRED_AT_MAX_FUTURE_MS) return false;
3248
3430
  return new Date(ms).getUTCFullYear() >= MEETING_OCCURRED_AT_MIN_YEAR;
3249
3431
  }, OCCURRED_AT_RANGE_MESSAGE);
3250
- var CreateMeetingFromTranscriptRequestSchema = z10.object({
3251
- projectId: z10.string().cuid(),
3252
- rawText: z10.string().min(1).max(MEETING_TRANSCRIPT_MAX_CHARS),
3253
- title: z10.string().min(1).max(MEETING_TITLE_MAX).optional(),
3432
+ var CreateMeetingFromTranscriptRequestSchema = z12.object({
3433
+ projectId: z12.string().cuid(),
3434
+ rawText: z12.string().min(1).max(MEETING_TRANSCRIPT_MAX_CHARS),
3435
+ title: z12.string().min(1).max(MEETING_TITLE_MAX).optional(),
3254
3436
  /** ISO 8601. Defaults to now when the source carries no date. */
3255
3437
  occurredAt: MeetingOccurredAtSchema.optional(),
3256
3438
  /** Override auto-detection. Rarely needed; detection handles the three formats. */
3257
- format: z10.enum(["text", "vtt", "srt"]).optional(),
3258
- source: z10.enum(["manual", "slack"]).optional()
3439
+ format: z12.enum(["text", "vtt", "srt"]).optional(),
3440
+ source: z12.enum(["manual", "slack"]).optional()
3259
3441
  });
3260
- var GetMeetingRequestSchema = z10.object({
3261
- projectId: z10.string().cuid(),
3262
- meetingId: z10.string().cuid()
3442
+ var GetMeetingRequestSchema = z12.object({
3443
+ projectId: z12.string().cuid(),
3444
+ meetingId: z12.string().cuid()
3263
3445
  });
3264
- var UpdateMeetingRequestSchema = z10.object({
3265
- projectId: z10.string().cuid(),
3266
- meetingId: z10.string().cuid(),
3267
- title: z10.string().min(1).max(MEETING_TITLE_MAX).optional(),
3446
+ var UpdateMeetingRequestSchema = z12.object({
3447
+ projectId: z12.string().cuid(),
3448
+ meetingId: z12.string().cuid(),
3449
+ title: z12.string().min(1).max(MEETING_TITLE_MAX).optional(),
3268
3450
  occurredAt: MeetingOccurredAtSchema.optional()
3269
3451
  });
3270
- var RegenerateMeetingSummaryRequestSchema = z10.object({
3271
- projectId: z10.string().cuid(),
3272
- meetingId: z10.string().cuid()
3452
+ var RegenerateMeetingSummaryRequestSchema = z12.object({
3453
+ projectId: z12.string().cuid(),
3454
+ meetingId: z12.string().cuid()
3273
3455
  });
3274
- var DeleteMeetingRequestSchema = z10.object({
3275
- projectId: z10.string().cuid(),
3276
- meetingId: z10.string().cuid()
3456
+ var DeleteMeetingRequestSchema = z12.object({
3457
+ projectId: z12.string().cuid(),
3458
+ meetingId: z12.string().cuid()
3277
3459
  });
3278
- var checklistTitle = z10.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX);
3279
- var ListMeetingChecklistRequestSchema = z10.object({
3280
- projectId: z10.string().cuid(),
3281
- meetingId: z10.string().cuid()
3460
+ var checklistTitle = z12.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX);
3461
+ var ListMeetingChecklistRequestSchema = z12.object({
3462
+ projectId: z12.string().cuid(),
3463
+ meetingId: z12.string().cuid()
3282
3464
  });
3283
- var AddMeetingChecklistItemsRequestSchema = z10.object({
3284
- projectId: z10.string().cuid(),
3285
- meetingId: z10.string().cuid(),
3286
- items: z10.array(z10.object({ title: checklistTitle })).min(1).max(50)
3465
+ var AddMeetingChecklistItemsRequestSchema = z12.object({
3466
+ projectId: z12.string().cuid(),
3467
+ meetingId: z12.string().cuid(),
3468
+ items: z12.array(z12.object({ title: checklistTitle })).min(1).max(50)
3287
3469
  });
3288
- var UpdateMeetingChecklistItemRequestSchema = z10.object({
3289
- projectId: z10.string().cuid(),
3290
- meetingId: z10.string().cuid(),
3291
- itemId: z10.string().cuid(),
3470
+ var UpdateMeetingChecklistItemRequestSchema = z12.object({
3471
+ projectId: z12.string().cuid(),
3472
+ meetingId: z12.string().cuid(),
3473
+ itemId: z12.string().cuid(),
3292
3474
  title: checklistTitle.optional(),
3293
- ordinal: z10.number().int().min(0).optional(),
3475
+ ordinal: z12.number().int().min(0).optional(),
3294
3476
  /** Explicit null clears the link; undefined leaves it alone. */
3295
- linkedTaskId: z10.string().cuid().nullable().optional()
3477
+ linkedTaskId: z12.string().cuid().nullable().optional()
3296
3478
  }).refine(
3297
3479
  (v) => v.title !== void 0 || v.ordinal !== void 0 || v.linkedTaskId !== void 0,
3298
3480
  "Pass at least one of title, ordinal, or linkedTaskId."
3299
3481
  );
3300
- var DeleteMeetingChecklistItemRequestSchema = z10.object({
3301
- projectId: z10.string().cuid(),
3302
- meetingId: z10.string().cuid(),
3303
- itemId: z10.string().cuid()
3304
- });
3305
- var SetMeetingChecklistItemCheckedRequestSchema = z10.object({
3306
- projectId: z10.string().cuid(),
3307
- meetingId: z10.string().cuid(),
3308
- itemId: z10.string().cuid(),
3309
- checked: z10.boolean(),
3482
+ var DeleteMeetingChecklistItemRequestSchema = z12.object({
3483
+ projectId: z12.string().cuid(),
3484
+ meetingId: z12.string().cuid(),
3485
+ itemId: z12.string().cuid()
3486
+ });
3487
+ var SetMeetingChecklistItemCheckedRequestSchema = z12.object({
3488
+ projectId: z12.string().cuid(),
3489
+ meetingId: z12.string().cuid(),
3490
+ itemId: z12.string().cuid(),
3491
+ checked: z12.boolean(),
3310
3492
  /** Attach the card in the same call that ticks the item. */
3311
- linkedTaskId: z10.string().cuid().nullable().optional()
3493
+ linkedTaskId: z12.string().cuid().nullable().optional()
3312
3494
  });
3313
- var ListMeetingsRequestSchema = z10.object({
3314
- projectId: z10.string().cuid(),
3315
- limit: z10.number().int().min(1).max(50).optional(),
3316
- search: z10.string().max(200).optional()
3495
+ var ListMeetingsRequestSchema = z12.object({
3496
+ projectId: z12.string().cuid(),
3497
+ limit: z12.number().int().min(1).max(50).optional(),
3498
+ search: z12.string().max(200).optional()
3317
3499
  });
3318
- var ReadMeetingTranscriptRequestSchema = z10.object({
3319
- projectId: z10.string().cuid(),
3320
- meetingId: z10.string().cuid(),
3321
- offset: z10.number().int().min(0).optional(),
3322
- limit: z10.number().int().min(1).max(500).optional()
3500
+ var ReadMeetingTranscriptRequestSchema = z12.object({
3501
+ projectId: z12.string().cuid(),
3502
+ meetingId: z12.string().cuid(),
3503
+ offset: z12.number().int().min(0).optional(),
3504
+ limit: z12.number().int().min(1).max(500).optional()
3323
3505
  });
3324
3506
  var MEETING_SUMMARY_MAX_CHARS = 5e4;
3325
- var AddProjectMeetingChecklistItemsRequestSchema = z10.object({
3326
- projectId: z10.string().cuid(),
3327
- meetingId: z10.string().cuid(),
3328
- items: z10.array(z10.object({ title: z10.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX) })).min(1).max(50),
3329
- requestingUserId: z10.string().optional()
3330
- });
3331
- var CheckProjectMeetingChecklistItemRequestSchema = z10.object({
3332
- projectId: z10.string().cuid(),
3333
- meetingId: z10.string().cuid(),
3334
- title: z10.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX),
3335
- checked: z10.boolean(),
3507
+ var AddProjectMeetingChecklistItemsRequestSchema = z12.object({
3508
+ projectId: z12.string().cuid(),
3509
+ meetingId: z12.string().cuid(),
3510
+ items: z12.array(z12.object({ title: z12.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX) })).min(1).max(50),
3511
+ requestingUserId: z12.string().optional()
3512
+ });
3513
+ var CheckProjectMeetingChecklistItemRequestSchema = z12.object({
3514
+ projectId: z12.string().cuid(),
3515
+ meetingId: z12.string().cuid(),
3516
+ title: z12.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX),
3517
+ checked: z12.boolean(),
3336
3518
  /** Card id or slug. Resolved server-side and required to be in the project. */
3337
- linkedTask: z10.string().min(1).optional(),
3338
- requestingUserId: z10.string().optional()
3339
- });
3340
- var EditProjectMeetingChecklistItemRequestSchema = z10.object({
3341
- projectId: z10.string().cuid(),
3342
- meetingId: z10.string().cuid(),
3343
- title: z10.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX),
3344
- newTitle: z10.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX),
3345
- requestingUserId: z10.string().optional()
3346
- });
3347
- var RemoveProjectMeetingChecklistItemRequestSchema = z10.object({
3348
- projectId: z10.string().cuid(),
3349
- meetingId: z10.string().cuid(),
3350
- title: z10.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX),
3351
- requestingUserId: z10.string().optional()
3352
- });
3353
- var CreateProjectMeetingRequestSchema = z10.object({
3354
- projectId: z10.string().cuid(),
3355
- rawText: z10.string().min(1).max(MEETING_TRANSCRIPT_MAX_CHARS),
3356
- title: z10.string().min(1).max(MEETING_TITLE_MAX).optional(),
3519
+ linkedTask: z12.string().min(1).optional(),
3520
+ requestingUserId: z12.string().optional()
3521
+ });
3522
+ var EditProjectMeetingChecklistItemRequestSchema = z12.object({
3523
+ projectId: z12.string().cuid(),
3524
+ meetingId: z12.string().cuid(),
3525
+ title: z12.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX),
3526
+ newTitle: z12.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX),
3527
+ requestingUserId: z12.string().optional()
3528
+ });
3529
+ var RemoveProjectMeetingChecklistItemRequestSchema = z12.object({
3530
+ projectId: z12.string().cuid(),
3531
+ meetingId: z12.string().cuid(),
3532
+ title: z12.string().min(1).max(MEETING_CHECKLIST_TITLE_MAX),
3533
+ requestingUserId: z12.string().optional()
3534
+ });
3535
+ var CreateProjectMeetingRequestSchema = z12.object({
3536
+ projectId: z12.string().cuid(),
3537
+ rawText: z12.string().min(1).max(MEETING_TRANSCRIPT_MAX_CHARS),
3538
+ title: z12.string().min(1).max(MEETING_TITLE_MAX).optional(),
3357
3539
  occurredAt: MeetingOccurredAtSchema.optional(),
3358
- requestingUserId: z10.string().optional()
3540
+ requestingUserId: z12.string().optional()
3359
3541
  });
3360
- var UpdateProjectMeetingRequestSchema = z10.object({
3361
- projectId: z10.string().cuid(),
3362
- meetingId: z10.string().cuid(),
3363
- title: z10.string().min(1).max(MEETING_TITLE_MAX).optional(),
3542
+ var UpdateProjectMeetingRequestSchema = z12.object({
3543
+ projectId: z12.string().cuid(),
3544
+ meetingId: z12.string().cuid(),
3545
+ title: z12.string().min(1).max(MEETING_TITLE_MAX).optional(),
3364
3546
  occurredAt: MeetingOccurredAtSchema.optional(),
3365
- summary: z10.string().min(1).max(MEETING_SUMMARY_MAX_CHARS).optional(),
3366
- requestingUserId: z10.string().optional()
3547
+ summary: z12.string().min(1).max(MEETING_SUMMARY_MAX_CHARS).optional(),
3548
+ requestingUserId: z12.string().optional()
3367
3549
  }).refine(
3368
3550
  (v) => v.title !== void 0 || v.occurredAt !== void 0 || v.summary !== void 0,
3369
3551
  "Pass at least one of title, occurredAt, or summary."
@@ -3738,13 +3920,17 @@ var CARD_TYPE_SURFACE = {
3738
3920
  task: "board",
3739
3921
  chat: "board",
3740
3922
  incident: "report",
3741
- suggestion: "report"
3923
+ suggestion: "report",
3924
+ // Decisions get their own surface: they are neither built on the board nor
3925
+ // triaged in the report feeds. Cards → Decisions is their only feed.
3926
+ decision: "decision"
3742
3927
  };
3743
3928
  var surfaceTypes = (surface) => Object.keys(CARD_TYPE_SURFACE).filter(
3744
3929
  (type) => CARD_TYPE_SURFACE[type] === surface
3745
3930
  );
3746
3931
  var BOARD_CARD_TYPES = surfaceTypes("board");
3747
3932
  var REPORT_CARD_TYPES = surfaceTypes("report");
3933
+ var DECISION_CARD_TYPES = surfaceTypes("decision");
3748
3934
 
3749
3935
  // src/runner/git-run.ts
3750
3936
  import { execFile } from "child_process";
package/dist/cli.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  WorkspaceCommandSupervisor,
8
8
  startWorkspaceCommandsAfterConnect,
9
9
  stopWorkspaceCommands
10
- } from "./chunk-WNSX5ZEQ.js";
10
+ } from "./chunk-IWWBG5FI.js";
11
11
  import {
12
12
  PtyHarness,
13
13
  SessionRunner,
@@ -25,13 +25,13 @@ import {
25
25
  runUsageProbe,
26
26
  sampleKeyUsage,
27
27
  usesNativeUsageReporting
28
- } from "./chunk-RW6V7KCE.js";
28
+ } from "./chunk-HW6SHIL7.js";
29
29
  import "./chunk-37J5MMQT.js";
30
30
  import {
31
31
  inheritedEnv,
32
32
  resolvePtySpawn,
33
33
  sessionTempBase
34
- } from "./chunk-W5INK3NE.js";
34
+ } from "./chunk-WCJ6HRVU.js";
35
35
  import {
36
36
  AgentConnection,
37
37
  CodespacePortVisibility,
@@ -44,7 +44,7 @@ import {
44
44
  createServiceLogger,
45
45
  fetchBootstrap,
46
46
  loadConveyorConfig
47
- } from "./chunk-OMD77OIJ.js";
47
+ } from "./chunk-YNI2HFZE.js";
48
48
  import "./chunk-Q4FQOJ7D.js";
49
49
  import "./chunk-W4LZ7R6Z.js";
50
50
  import "./chunk-372R6E4C.js";
@@ -1205,7 +1205,7 @@ function wireSpawnChildren(mode, connection, supervisors, logger7) {
1205
1205
 
1206
1206
  // src/cli.ts
1207
1207
  if (process.argv[2] === "boot") {
1208
- const { runBoot } = await import("./boot-Z3EBJ7GX.js");
1208
+ const { runBoot } = await import("./boot-65PTSADA.js");
1209
1209
  process.exit(await runBoot(process.argv.slice(3)));
1210
1210
  }
1211
1211
  if (isLegacyEntrypointLaunch(process.env)) {
@@ -1307,7 +1307,7 @@ process.on("unhandledRejection", (reason) => {
1307
1307
  process.exit(1);
1308
1308
  });
1309
1309
  if (process.env.CONVEYOR_MODE === "workbench") {
1310
- const { startWorkbenchServer } = await import("./server-L5CQ5EJB.js");
1310
+ const { startWorkbenchServer } = await import("./server-E6IYHSMN.js");
1311
1311
  const { oomWatchdogOptionsFromEnv } = await import("./oom-watchdog-PAC5OJJG.js");
1312
1312
  const { DEFAULT_WORKBENCH_PORT } = await import("./protocol-QBCYO4GI.js");
1313
1313
  const port = Number(process.env.CONVEYOR_WORKBENCH_PORT) || DEFAULT_WORKBENCH_PORT;
@@ -1458,7 +1458,7 @@ if (!RUNNER_MODES.includes(CONVEYOR_MODE)) {
1458
1458
  process.exit(1);
1459
1459
  }
1460
1460
  if (CONVEYOR_MODE === "serving") {
1461
- const { runServingSession } = await import("./serve-boot-4O5NJ77J.js");
1461
+ const { runServingSession } = await import("./serve-boot-THPACDVI.js");
1462
1462
  exitContext.runnerMode = "serving";
1463
1463
  exitContext.sessionId = process.env.CONVEYOR_SESSION_ID ?? exitContext.sessionId;
1464
1464
  const outcome = await runServingSession({
package/dist/index.d.ts CHANGED
@@ -732,6 +732,11 @@ declare class SessionRunner {
732
732
  * it reports pending, heartbeats go out non-idle so the workspace activity
733
733
  * clock keeps being bumped and the reconciler can't sleep the pod mid-gate. */
734
734
  private readonly backgroundWork;
735
+ /** An armed `ScheduleWakeup` (the dynamic `/loop` mode): the turn ended, but
736
+ * the agent asked to be re-invoked at a deadline. Same liveness contract as
737
+ * `backgroundWork` — while it reports pending, heartbeats go out non-idle so
738
+ * the reconciler cannot sleep the pod before the wakeup fires. */
739
+ private readonly scheduledWakeup;
735
740
  /** Boot supervisor handle, set post-construction once it's known (it is
736
741
  * started alongside connect(), before the runner itself exists in some
737
742
  * call sites) — notified when the core loop goes live so it can release
@@ -782,6 +787,21 @@ declare class SessionRunner {
782
787
  * live build costs work.
783
788
  */
784
789
  private deferShutdownForLiveChild;
790
+ /**
791
+ * Suppress an idle or dormant shutdown while a `ScheduleWakeup` is armed.
792
+ *
793
+ * Both timers matter. The idle timer (30 min) kills a loop that paces itself
794
+ * slower than that, and the dormant timer (60 min after a `completed` event)
795
+ * kills a one-hour arm — the agent declares completion at the end of every
796
+ * tick, so a dynamic loop sits dormant by construction.
797
+ *
798
+ * The bound is the WAKEUP'S OWN deadline, not `BACKGROUND_WORK_MAX_MS`: the
799
+ * tool clamps `delaySeconds` to one hour, which already exceeds that 45-min
800
+ * cap, so reusing it would shut the pod down before the longest legal arm
801
+ * fired. Once the deadline passes the tracker expires it and this returns
802
+ * false, so a lost timer cannot pin a pod.
803
+ */
804
+ private deferShutdownForScheduledWakeup;
785
805
  /** Epoch ms of the first idle-shutdown deferral for background work in the
786
806
  * current idle episode; null when nothing has deferred. Reset when a turn
787
807
  * runs, so each idle episode gets its own bounded hold. */
@@ -1101,8 +1121,8 @@ declare class SessionRunner {
1101
1121
  /** Mirror the resolved status into the loop-lag buffer so the starvation-proof
1102
1122
  * heartbeat worker reports it too. Returns what it wrote. */
1103
1123
  private refreshLoopStatus;
1104
- /** One `tool_use` from the turn stream — registers a background launch when
1105
- * the tool starts work that outlives the turn. */
1124
+ /** One `tool_use` from the turn stream — registers work that outlives the
1125
+ * turn: a background launch, or an armed `ScheduleWakeup`. */
1106
1126
  private noteToolUseForBackgroundWork;
1107
1127
  private setState;
1108
1128
  /**
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  SessionRunner,
3
3
  unshallowRepo
4
- } from "./chunk-RW6V7KCE.js";
4
+ } from "./chunk-HW6SHIL7.js";
5
5
  import "./chunk-37J5MMQT.js";
6
- import "./chunk-W5INK3NE.js";
6
+ import "./chunk-WCJ6HRVU.js";
7
7
  import {
8
8
  AgentConnection,
9
9
  GIT_TIMEOUT_MS,
@@ -17,7 +17,7 @@ import {
17
17
  stageAndCommit,
18
18
  updateRemoteToken,
19
19
  workspacePathExists
20
- } from "./chunk-OMD77OIJ.js";
20
+ } from "./chunk-YNI2HFZE.js";
21
21
  import "./chunk-Q4FQOJ7D.js";
22
22
  import {
23
23
  runAuthTokenCommand,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  WorkspaceCommandSupervisor
3
- } from "./chunk-WNSX5ZEQ.js";
3
+ } from "./chunk-IWWBG5FI.js";
4
4
  import {
5
5
  AgentConnection,
6
6
  CodespacePortVisibility,
@@ -11,7 +11,7 @@ import {
11
11
  createServiceLogger,
12
12
  ensureOnTaskBranch,
13
13
  loadConveyorConfig
14
- } from "./chunk-OMD77OIJ.js";
14
+ } from "./chunk-YNI2HFZE.js";
15
15
  import "./chunk-Q4FQOJ7D.js";
16
16
  import "./chunk-W4LZ7R6Z.js";
17
17
  import "./chunk-IA45XHOA.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  startWorkbenchServer
3
- } from "./chunk-EIHZRSYI.js";
4
- import "./chunk-W5INK3NE.js";
3
+ } from "./chunk-EITUTXXJ.js";
4
+ import "./chunk-WCJ6HRVU.js";
5
5
  import "./chunk-W4LZ7R6Z.js";
6
6
  import "./chunk-372R6E4C.js";
7
7
  import "./chunk-SQM2BQ7H.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rallycry/conveyor-agent",
3
- "version": "11.0.22",
3
+ "version": "11.0.24",
4
4
  "description": "Conveyor Agent Runner v10 - PTY harness for the task chat (SDK harness for audit/project-chat). Agent-as-User architecture with BaseService patterns. Works locally too.",
5
5
  "keywords": [
6
6
  "agent",