@adhdev/mesh-shared 1.0.82-rc.34 → 1.0.82-rc.35

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/index.js CHANGED
@@ -38,12 +38,15 @@ __export(index_exports, {
38
38
  CANCEL_REASONS: () => CANCEL_REASONS,
39
39
  CANONICAL_MESH_TOOL_COUNT: () => CANONICAL_MESH_TOOL_COUNT,
40
40
  CANONICAL_MESH_TOOL_NAMES: () => CANONICAL_MESH_TOOL_NAMES,
41
+ CARRY_OVER_MISSION_GOAL: () => CARRY_OVER_MISSION_GOAL,
42
+ CARRY_OVER_MISSION_TITLE: () => CARRY_OVER_MISSION_TITLE,
41
43
  CLAUDE_TUI_REVIEW_PAGE_NOT_FOCUSED_PREFIX: () => CLAUDE_TUI_REVIEW_PAGE_NOT_FOCUSED_PREFIX,
42
44
  CLAUDE_TUI_REVIEW_UNCONFIRMED_PREFIX: () => CLAUDE_TUI_REVIEW_UNCONFIRMED_PREFIX,
43
45
  CLI_SLOT_RECIPES: () => CLI_SLOT_RECIPES,
44
46
  COMMIT_STRENGTHS: () => COMMIT_STRENGTHS,
45
47
  CONSUME_PROFILES: () => CONSUME_PROFILES,
46
48
  COORDINATOR_ACK_OUTCOMES: () => COORDINATOR_ACK_OUTCOMES,
49
+ COORDINATOR_SETTABLE_ITEM_STATES: () => COORDINATOR_SETTABLE_ITEM_STATES,
47
50
  DAEMON_METADATA_DOC_SPEC: () => DAEMON_METADATA_DOC_SPEC,
48
51
  DAEMON_P2P_SIGNAL_TYPES: () => DAEMON_P2P_SIGNAL_TYPES,
49
52
  DAEMON_STATUS_EVENT_NAMES: () => DAEMON_STATUS_EVENT_NAMES,
@@ -56,6 +59,11 @@ __export(index_exports, {
56
59
  DASHBOARD_TO_DAEMON_P2P_TYPES: () => DASHBOARD_TO_DAEMON_P2P_TYPES,
57
60
  DASHBOARD_TO_USER_SESSION_TYPES: () => DASHBOARD_TO_USER_SESSION_TYPES,
58
61
  DASHBOARD_WIRE_VERSION: () => DASHBOARD_WIRE_VERSION,
62
+ DECISION_PUSH_OPTIONS_MAX: () => DECISION_PUSH_OPTIONS_MAX,
63
+ DECISION_PUSH_OPTION_LABEL_MAX: () => DECISION_PUSH_OPTION_LABEL_MAX,
64
+ DECISION_PUSH_QUESTION_MAX: () => DECISION_PUSH_QUESTION_MAX,
65
+ DECISION_PUSH_RELAY_COMMAND: () => DECISION_PUSH_RELAY_COMMAND,
66
+ DECISION_PUSH_RELAY_SOURCE: () => DECISION_PUSH_RELAY_SOURCE,
59
67
  DEFAULT_DIFFICULTY_BRAINS: () => DEFAULT_DIFFICULTY_BRAINS,
60
68
  DELIVERY_OUTCOMES: () => DELIVERY_OUTCOMES,
61
69
  DELIVERY_VIAS: () => DELIVERY_VIAS,
@@ -67,6 +75,7 @@ __export(index_exports, {
67
75
  LAUNCH_DEFAULT_ERROR_CODES: () => LAUNCH_DEFAULT_ERROR_CODES,
68
76
  LAUNCH_DEFAULT_ROLES: () => LAUNCH_DEFAULT_ROLES,
69
77
  LAUNCH_DEFAULT_SOURCES: () => LAUNCH_DEFAULT_SOURCES,
78
+ LEGACY_CARRY_OVER_MISSION_TITLE: () => LEGACY_CARRY_OVER_MISSION_TITLE,
70
79
  LIVENESS_RESULTS: () => LIVENESS_RESULTS,
71
80
  MAX_MESH_RECORD_STRING: () => MAX_MESH_RECORD_STRING,
72
81
  MAX_OWNED_PATHS: () => MAX_OWNED_PATHS,
@@ -92,6 +101,14 @@ __export(index_exports, {
92
101
  MESH_TOPIC_ENTRY_KINDS: () => MESH_TOPIC_ENTRY_KINDS,
93
102
  MESH_TOPIC_PROTOCOL_VERSION: () => MESH_TOPIC_PROTOCOL_VERSION,
94
103
  MISSION_BRIEF_RENDER_MAX_CHARS: () => MISSION_BRIEF_RENDER_MAX_CHARS,
104
+ MISSION_DECISION_ON_DUE: () => MISSION_DECISION_ON_DUE,
105
+ MISSION_DECISION_OPTION_IDS: () => MISSION_DECISION_OPTION_IDS,
106
+ MISSION_DECISION_URGENCIES: () => MISSION_DECISION_URGENCIES,
107
+ MISSION_ITEM_KINDS: () => MISSION_ITEM_KINDS,
108
+ MISSION_ITEM_STATES: () => MISSION_ITEM_STATES,
109
+ MISSION_LIMITS: () => MISSION_LIMITS,
110
+ MISSION_OUTCOMES: () => MISSION_OUTCOMES,
111
+ MISSION_REF_KINDS: () => MISSION_REF_KINDS,
95
112
  MODEL_AXIS_SOURCES: () => MODEL_AXIS_SOURCES,
96
113
  MODEL_SELECTION_HISTORY_LIMIT: () => MODEL_SELECTION_HISTORY_LIMIT,
97
114
  MeshChunkAssembler: () => MeshChunkAssembler,
@@ -105,6 +122,9 @@ __export(index_exports, {
105
122
  OPERATOR_STATUS_REASON_VALUES: () => OPERATOR_STATUS_REASON_VALUES,
106
123
  OPERATOR_STATUS_VALUES: () => OPERATOR_STATUS_VALUES,
107
124
  OUTBOUND_MESSAGE_ORIGINS: () => OUTBOUND_MESSAGE_ORIGINS,
125
+ OWNER_ABANDON_CONFIRM_KEY_PREFIX: () => OWNER_ABANDON_CONFIRM_KEY_PREFIX,
126
+ OWNER_ABANDON_CONFIRM_OPTIONS: () => OWNER_ABANDON_CONFIRM_OPTIONS,
127
+ OWNER_ABANDON_CONFIRM_QUESTION: () => OWNER_ABANDON_CONFIRM_QUESTION,
108
128
  P2P_SIGNAL_TYPES: () => P2P_SIGNAL_TYPES,
109
129
  PROVIDER_FAILURES: () => PROVIDER_FAILURES,
110
130
  QUOTA_BACKFILL_HORIZON_MS: () => QUOTA_BACKFILL_HORIZON_MS,
@@ -156,6 +176,8 @@ __export(index_exports, {
156
176
  VERSION_UPDATE_REASONS: () => VERSION_UPDATE_REASONS,
157
177
  VIEWER_TO_SHARED_SESSION_TYPES: () => VIEWER_TO_SHARED_SESSION_TYPES,
158
178
  WORKER_BRANCH_STATES: () => WORKER_BRANCH_STATES,
179
+ WORKER_COMMITS_MAX: () => WORKER_COMMITS_MAX,
180
+ WORKER_DECISIONS_NEEDED_MAX: () => WORKER_DECISIONS_NEEDED_MAX,
159
181
  WORKER_PROTOCOL_FOOTER_MARKER: () => WORKER_PROTOCOL_FOOTER_MARKER,
160
182
  WORKER_REPORT_OUTCOMES: () => WORKER_REPORT_OUTCOMES,
161
183
  WORKER_REPORT_SUMMARY_MAX_CHARS: () => WORKER_REPORT_SUMMARY_MAX_CHARS,
@@ -163,6 +185,7 @@ __export(index_exports, {
163
185
  appendWorkerProtocolFooter: () => appendWorkerProtocolFooter,
164
186
  argsCarryStatusProbeMarker: () => argsCarryStatusProbeMarker,
165
187
  assessQuotaFreshness: () => assessQuotaFreshness,
188
+ boundEventPayload: () => boundEventPayload,
166
189
  buildSlotProposal: () => buildSlotProposal,
167
190
  canonicalDaemonId: () => canonicalDaemonId,
168
191
  classifySessionStatus: () => classifySessionStatus,
@@ -232,6 +255,7 @@ __export(index_exports, {
232
255
  decodeUserSessionToDashboard: () => decodeUserSessionToDashboard,
233
256
  decodeViewerToSharedSession: () => decodeViewerToSharedSession,
234
257
  defaultProviderPriorityFromNodeFacts: () => defaultProviderPriorityFromNodeFacts,
258
+ deriveItemDedupeKey: () => deriveItemDedupeKey,
235
259
  deriveProviderPriorityFromSlots: () => deriveProviderPriorityFromSlots,
236
260
  deriveSlotsFromLegacy: () => deriveSlotsFromLegacy,
237
261
  describeModelSelection: () => describeModelSelection,
@@ -243,6 +267,7 @@ __export(index_exports, {
243
267
  findOwnershipConflicts: () => findOwnershipConflicts,
244
268
  foldKeyedDoc: () => foldKeyedDoc,
245
269
  followedRemoteProjectKey: () => followedRemoteProjectKey,
270
+ followerOpPermitted: () => followerOpPermitted,
246
271
  formatQuotaAccount: () => formatQuotaAccount,
247
272
  hasGitStatusEvidence: () => hasGitStatusEvidence,
248
273
  hasWorkerProtocolFooter: () => hasWorkerProtocolFooter,
@@ -252,6 +277,8 @@ __export(index_exports, {
252
277
  isAssistantTool: () => isAssistantTool,
253
278
  isBlockedStatus: () => isBlockedStatus,
254
279
  isBusyStatus: () => isBusyStatus,
280
+ isCarryOverMissionRecord: () => isCarryOverMissionRecord,
281
+ isCarryOverMissionTitle: () => isCarryOverMissionTitle,
255
282
  isChunkType: () => isChunkType,
256
283
  isCommitStrength: () => isCommitStrength,
257
284
  isDaemonDirectCommandType: () => isDaemonDirectCommandType,
@@ -284,6 +311,7 @@ __export(index_exports, {
284
311
  isMeshTerminalTaskStatus: () => isMeshTerminalTaskStatus,
285
312
  isMeshTopicEntry: () => isMeshTopicEntry,
286
313
  isMessageId: () => isMessageId,
314
+ isMissionOutcome: () => isMissionOutcome,
287
315
  isMissionUpsertResponse: () => isMissionUpsertResponse,
288
316
  isModelAxisSource: () => isModelAxisSource,
289
317
  isNativeMarkerRef: () => isNativeMarkerRef,
@@ -334,16 +362,24 @@ __export(index_exports, {
334
362
  minutesUntilQuotaCheck: () => minutesUntilQuotaCheck,
335
363
  normalizeAuthOkLimits: () => normalizeAuthOkLimits,
336
364
  normalizeBrainSlot: () => normalizeBrainSlot,
365
+ normalizeDecisionInput: () => normalizeDecisionInput,
337
366
  normalizeDifficultyBrainMap: () => normalizeDifficultyBrainMap,
367
+ normalizeForDedupe: () => normalizeForDedupe,
338
368
  normalizeGitStatus: () => normalizeGitStatus,
339
369
  normalizeMeshNodeFacts: () => normalizeMeshNodeFacts,
340
370
  normalizeMeshNodeId: () => normalizeMeshNodeId,
341
371
  normalizeMeshSessionRecord: () => normalizeMeshSessionRecord,
342
372
  normalizeMeshWorkspaceForCompare: () => normalizeMeshWorkspaceForCompare,
343
373
  normalizeMissionBrief: () => normalizeMissionBrief,
374
+ normalizeMissionItemInput: () => normalizeMissionItemInput,
375
+ normalizeMissionItemUpdate: () => normalizeMissionItemUpdate,
376
+ normalizeMissionRefs: () => normalizeMissionRefs,
377
+ normalizeMissionSummary: () => normalizeMissionSummary,
344
378
  normalizeNodeCapabilitySlot: () => normalizeNodeCapabilitySlot,
345
379
  normalizeNodeCapabilitySlots: () => normalizeNodeCapabilitySlots,
380
+ normalizeOutcomeReason: () => normalizeOutcomeReason,
346
381
  normalizeOwnedPaths: () => normalizeOwnedPaths,
382
+ normalizeReportCommits: () => normalizeReportCommits,
347
383
  normalizeSessionStatus: () => normalizeSessionStatus,
348
384
  normalizeThinkingLevel: () => normalizeThinkingLevel,
349
385
  orderProvidersByBuiltinPreference: () => orderProvidersByBuiltinPreference,
@@ -383,6 +419,7 @@ __export(index_exports, {
383
419
  summarizeGitShape: () => summarizeGitShape,
384
420
  supportsQuota: () => supportsQuota,
385
421
  touchedFilesOutsideOwnership: () => touchedFilesOutsideOwnership,
422
+ truncateMissionText: () => truncateMissionText,
386
423
  unwrapPastedContent: () => unwrapPastedContent,
387
424
  withStatusProbeMarker: () => withStatusProbeMarker
388
425
  });
@@ -1499,9 +1536,15 @@ var DAEMON_STATUS_EVENT_NAMES = [
1499
1536
  "agent:waiting_choice",
1500
1537
  "agent:generating_completed",
1501
1538
  "agent:stopped",
1502
- "monitor:no_progress"
1539
+ "monitor:no_progress",
1540
+ // An owner decision (structured missions) needs the owner. Server-bound for the push only;
1541
+ // the dashboard learns about decisions over P2P (`mission_decisions_list`).
1542
+ "agent:decision_needed"
1503
1543
  ];
1504
1544
  var isDaemonStatusEventName = makeTypeGuard(DAEMON_STATUS_EVENT_NAMES);
1545
+ var DECISION_PUSH_QUESTION_MAX = 80;
1546
+ var DECISION_PUSH_OPTION_LABEL_MAX = 24;
1547
+ var DECISION_PUSH_OPTIONS_MAX = 3;
1505
1548
  var RELEASE_CHANNELS = ["stable", "preview"];
1506
1549
  var NPM_UPDATE_TAGS = ["latest", "next"];
1507
1550
  var VERSION_UPDATE_REASONS = ["force_update_below", "major_minor_mismatch", "patch_mismatch", "daemon_ahead"];
@@ -2075,6 +2118,10 @@ var WORKER_TOOLS = [
2075
2118
  "driver_list",
2076
2119
  "driver_describe",
2077
2120
  "driver_invoke",
2121
+ "driver_scaffold",
2122
+ "driver_validate",
2123
+ "driver_export",
2124
+ "driver_install",
2078
2125
  "artifact_register",
2079
2126
  "artifact_list",
2080
2127
  "artifact_read",
@@ -2185,7 +2232,9 @@ var ASSISTANT_TOOLS = [
2185
2232
  "driver_list",
2186
2233
  "driver_describe",
2187
2234
  "artifact_list",
2188
- "artifact_read"
2235
+ "artifact_read",
2236
+ "decision_answer",
2237
+ "decision_request"
2189
2238
  ];
2190
2239
  var ASSISTANT_TOOL_SET = new Set(ASSISTANT_TOOLS);
2191
2240
  function isAssistantTool(value) {
@@ -2215,6 +2264,10 @@ var ASSISTANT_VERB = {
2215
2264
  launchDefaultsSet: "assistant_launch_defaults_set",
2216
2265
  artifactList: "assistant_artifact_list",
2217
2266
  artifactRead: "assistant_artifact_read",
2267
+ /** Owner-decision inbox (structured-missions design 2026-10-28 §6.3): the owner's words recorded as answers. */
2268
+ decisionAnswer: "assistant_decision_answer",
2269
+ /** Register a plain-text question a coordinator put to the owner as a decision item (§5.2). */
2270
+ decisionRequest: "assistant_decision_request",
2218
2271
  // assistant-side daemon verbs without a tool of the same name
2219
2272
  launch: "launch_assistant",
2220
2273
  pendingRelays: "assistant_pending_relays",
@@ -2246,9 +2299,11 @@ var ASSISTANT_TOOL_VERBS = {
2246
2299
  launch_defaults: ASSISTANT_VERB.launchDefaults,
2247
2300
  launch_defaults_set: ASSISTANT_VERB.launchDefaultsSet,
2248
2301
  artifact_list: ASSISTANT_VERB.artifactList,
2249
- artifact_read: ASSISTANT_VERB.artifactRead
2302
+ artifact_read: ASSISTANT_VERB.artifactRead,
2303
+ decision_answer: ASSISTANT_VERB.decisionAnswer,
2304
+ decision_request: ASSISTANT_VERB.decisionRequest
2250
2305
  };
2251
- var ASSISTANT_WRITE_TOOLS = ["project_watch", "assistant_action", "memory", "skill_manage", "project_note", "project_send", "project_add", "project_attach_remote", "launch_defaults_set"];
2306
+ var ASSISTANT_WRITE_TOOLS = ["project_watch", "assistant_action", "memory", "skill_manage", "project_note", "project_send", "project_add", "project_attach_remote", "launch_defaults_set", "decision_answer", "decision_request"];
2252
2307
  var ASSISTANT_OWNER_VERBS = [
2253
2308
  ASSISTANT_VERB.executionSettings,
2254
2309
  ASSISTANT_VERB.stagedResolve,
@@ -2269,11 +2324,22 @@ var ASSISTANT_REMOTE_PROJECT_COMMAND = "assistant_remote_project";
2269
2324
  var ASSISTANT_REMOTE_PROJECT_CATALOG_COMMAND = "assistant_remote_project_catalog";
2270
2325
  var ASSISTANT_REMOTE_PROJECT_ACCESS_COMMAND = "assistant_remote_project_access";
2271
2326
  var ASSISTANT_REMOTE_FOLLOW_COMMAND = "assistant_remote_follow";
2272
- var ASSISTANT_FOLLOWER_ALLOWED_OPS = ["status", "read", "poll", "report", "send", "artifact_list", "artifact_read"];
2327
+ var ASSISTANT_FOLLOWER_ALLOWED_OPS = ["status", "read", "poll", "report", "send", "artifact_list", "artifact_read", "decision_list", "decision_answer", "decision_request"];
2273
2328
  var ASSISTANT_FOLLOWER_ALLOWED_OP_SET = new Set(ASSISTANT_FOLLOWER_ALLOWED_OPS);
2274
2329
  function isAssistantFollowerAllowedOp(value) {
2275
2330
  return typeof value === "string" && ASSISTANT_FOLLOWER_ALLOWED_OP_SET.has(value);
2276
2331
  }
2332
+ var DECISION_OP_IMPLIED_BY = {
2333
+ decision_list: "status",
2334
+ decision_answer: "send",
2335
+ decision_request: "send"
2336
+ };
2337
+ function followerOpPermitted(op, allowedOps) {
2338
+ if (!isAssistantFollowerAllowedOp(op)) return false;
2339
+ if (allowedOps.includes(op)) return true;
2340
+ const implied = DECISION_OP_IMPLIED_BY[op];
2341
+ return implied !== void 0 && allowedOps.includes(implied);
2342
+ }
2277
2343
  function followedRemoteProjectKey(hostDaemonId, meshId) {
2278
2344
  const canonHost = canonicalDaemonId(hostDaemonId) ?? hostDaemonId.trim();
2279
2345
  return `${canonHost}::${meshId.trim()}`;
@@ -3172,8 +3238,23 @@ function isMissionBriefWire(value) {
3172
3238
  }
3173
3239
  return true;
3174
3240
  }
3241
+ var STRUCTURED_MISSION_KEYS = ["summary", "outcome", "outcomeReason", "version", "carryOver", "openItems"];
3242
+ function isOpenItemCountsWire(value) {
3243
+ if (!isRecord(value) || !hasOnlyKeys2(value, ["remaining", "live_check", "decision", "evidence"])) return false;
3244
+ return ["remaining", "live_check", "decision", "evidence"].every((k) => isNonNegativeInt(value[k]));
3245
+ }
3246
+ function isStructuredMissionFields(value) {
3247
+ for (const k of ["summary", "outcome", "outcomeReason"]) {
3248
+ if (value[k] !== void 0 && typeof value[k] !== "string") return false;
3249
+ }
3250
+ if (value.version !== void 0 && !isNonNegativeInt(value.version)) return false;
3251
+ if (value.carryOver !== void 0 && typeof value.carryOver !== "boolean") return false;
3252
+ if (value.openItems !== void 0 && !isOpenItemCountsWire(value.openItems)) return false;
3253
+ return true;
3254
+ }
3175
3255
  function isMeshMissionRecordWire(value) {
3176
- if (!isRecord(value) || !hasOnlyKeys2(value, ["id", "meshId", "title", "goal", "status", "brief"])) return false;
3256
+ if (!isRecord(value) || !hasOnlyKeys2(value, ["id", "meshId", "title", "goal", "status", "brief", ...STRUCTURED_MISSION_KEYS])) return false;
3257
+ if (!isStructuredMissionFields(value)) return false;
3177
3258
  if (!isEvidenceIdentifier(value.id) || !isEvidenceIdentifier(value.meshId)) return false;
3178
3259
  if (typeof value.title !== "string" || typeof value.goal !== "string") return false;
3179
3260
  if (!isMeshMissionStatusValue(value.status)) return false;
@@ -3181,11 +3262,22 @@ function isMeshMissionRecordWire(value) {
3181
3262
  return true;
3182
3263
  }
3183
3264
  function isMissionUpsertRequest(value) {
3184
- if (!isRecord(value) || !hasOnlyKeys2(value, ["v", "meshId", "id", "title", "goal", "status", "brief"])) return false;
3265
+ if (!isRecord(value) || !hasOnlyKeys2(value, ["v", "meshId", "id", "title", "goal", "status", "brief", "structured", "summary", "outcome", "outcomeReason", "carryOverTo", "toCarryOver", "itemsAdd", "itemsUpdate"])) return false;
3185
3266
  if (value.v !== TURN_IPC_PROTOCOL_VERSION) return false;
3186
3267
  if (!isEvidenceIdentifier(value.meshId)) return false;
3187
3268
  if (value.id !== void 0 && !isEvidenceIdentifier(value.id)) return false;
3188
- if (typeof value.title !== "string" || value.title.trim().length === 0) return false;
3269
+ if (typeof value.title !== "string") return false;
3270
+ if (value.title.trim().length === 0 && value.toCarryOver !== true && value.id === void 0) return false;
3271
+ if (value.structured !== void 0 && typeof value.structured !== "boolean") return false;
3272
+ if (value.toCarryOver !== void 0 && typeof value.toCarryOver !== "boolean") return false;
3273
+ for (const k of ["summary", "outcome", "outcomeReason"]) {
3274
+ if (value[k] !== void 0 && typeof value[k] !== "string") return false;
3275
+ }
3276
+ if (value.carryOverTo !== void 0 && !isEvidenceIdentifier(value.carryOverTo)) return false;
3277
+ for (const k of ["itemsAdd", "itemsUpdate"]) {
3278
+ const list = value[k];
3279
+ if (list !== void 0 && (!Array.isArray(list) || list.length > 500 || !list.every(isRecord))) return false;
3280
+ }
3189
3281
  if (value.goal !== void 0 && typeof value.goal !== "string") return false;
3190
3282
  if (value.status !== void 0 && !isMeshMissionStatusValue(value.status)) return false;
3191
3283
  if (value.brief !== void 0 && value.brief !== null && !isMissionBriefWire(value.brief)) return false;
@@ -3195,7 +3287,7 @@ function decodeMissionUpsertRequest(value) {
3195
3287
  return isMissionUpsertRequest(value) ? value : null;
3196
3288
  }
3197
3289
  function isMissionUpsertResponse(value) {
3198
- return isRecord(value) && hasOnlyKeys2(value, ["mission"]) && isMeshMissionRecordWire(value.mission);
3290
+ return isRecord(value) && hasOnlyKeys2(value, ["mission", "result"]) && isMeshMissionRecordWire(value.mission) && (value.result === void 0 || isRecord(value.result));
3199
3291
  }
3200
3292
  function decodeMissionUpsertResponse(value) {
3201
3293
  return isMissionUpsertResponse(value) ? value : null;
@@ -3221,7 +3313,10 @@ function decodeMissionQueryResponse(value) {
3221
3313
  return isMissionQueryResponse(value) ? value : null;
3222
3314
  }
3223
3315
  function isMissionListQueryRequest(value) {
3224
- if (!isRecord(value) || !hasOnlyKeys2(value, ["v", "meshId", "statuses", "verbose", "withStats", "limit", "historyIdLimit", "meshStatusView"])) return false;
3316
+ if (!isRecord(value) || !hasOnlyKeys2(value, ["v", "meshId", "statuses", "verbose", "withStats", "limit", "historyIdLimit", "meshStatusView", "structured", "items", "history"])) return false;
3317
+ for (const k of ["structured", "items", "history"]) {
3318
+ if (value[k] !== void 0 && typeof value[k] !== "boolean") return false;
3319
+ }
3225
3320
  if (value.meshStatusView !== void 0 && value.meshStatusView !== "compact" && value.meshStatusView !== "verbose") return false;
3226
3321
  if (value.v !== TURN_IPC_PROTOCOL_VERSION) return false;
3227
3322
  if (!isEvidenceIdentifier(value.meshId)) return false;
@@ -3263,7 +3358,7 @@ function isMissionListSummaryWire(value) {
3263
3358
  const hasGoal = "goal" in value;
3264
3359
  const hasPreview = "goalPreview" in value && "goalTruncated" in value;
3265
3360
  if (hasGoal === hasPreview) return false;
3266
- const baseKeys = ["id", "meshId", "title", "status", "tasks", "stats", "brief", "createdAt", "updatedAt", "closeCandidateEmittedAt"];
3361
+ const baseKeys = ["id", "meshId", "title", "status", "tasks", "stats", "brief", "createdAt", "updatedAt", "closeCandidateEmittedAt", ...STRUCTURED_MISSION_KEYS, "items", "history"];
3267
3362
  const allowed = hasGoal ? [...baseKeys, "goal"] : [...baseKeys, "goalPreview", "goalTruncated"];
3268
3363
  if (!hasOnlyKeys2(value, allowed)) return false;
3269
3364
  if (!isEvidenceIdentifier(value.id) || !isEvidenceIdentifier(value.meshId)) return false;
@@ -3277,6 +3372,10 @@ function isMissionListSummaryWire(value) {
3277
3372
  if (value.createdAt !== void 0 && typeof value.createdAt !== "string") return false;
3278
3373
  if (value.updatedAt !== void 0 && typeof value.updatedAt !== "string") return false;
3279
3374
  if (value.closeCandidateEmittedAt !== void 0 && value.closeCandidateEmittedAt !== null && typeof value.closeCandidateEmittedAt !== "string") return false;
3375
+ if (!isStructuredMissionFields(value)) return false;
3376
+ for (const k of ["items", "history"]) {
3377
+ if (value[k] !== void 0 && (!Array.isArray(value[k]) || !value[k].every(isRecord))) return false;
3378
+ }
3280
3379
  return true;
3281
3380
  }
3282
3381
  function isMeshMissionHistoryFoldWire(value) {
@@ -3799,6 +3898,282 @@ function touchedFilesOutsideOwnership(touched, owned) {
3799
3898
  return { undeclaredTouched, unusedDeclarations };
3800
3899
  }
3801
3900
 
3901
+ // src/mission-items.ts
3902
+ var MISSION_ITEM_KINDS = ["remaining", "live_check", "decision", "evidence"];
3903
+ var MISSION_ITEM_STATES = ["open", "done", "dropped", "moved", "answered", "expired", "withdrawn", "superseded"];
3904
+ var COORDINATOR_SETTABLE_ITEM_STATES = {
3905
+ remaining: ["open", "done", "dropped"],
3906
+ live_check: ["open", "done", "dropped"],
3907
+ evidence: ["open", "done", "dropped"],
3908
+ decision: ["open", "withdrawn", "superseded"]
3909
+ };
3910
+ var MISSION_OUTCOMES = ["merged", "verified_live", "superseded", "not_needed", "owner_abandoned", "unspecified"];
3911
+ function isMissionOutcome(value) {
3912
+ return typeof value === "string" && MISSION_OUTCOMES.includes(value);
3913
+ }
3914
+ var MISSION_REF_KINDS = ["commit", "branch", "pr", "task", "artifact", "mission", "url"];
3915
+ var MISSION_LIMITS = {
3916
+ summary: 300,
3917
+ outcomeReason: 500,
3918
+ itemText: 300,
3919
+ machine: 80,
3920
+ refs: 8,
3921
+ refValue: 300,
3922
+ refRepo: 120,
3923
+ refNote: 200,
3924
+ dedupeKey: 400,
3925
+ question: 300,
3926
+ context: 600,
3927
+ options: 5,
3928
+ optionLabel: 60,
3929
+ optionDetail: 200,
3930
+ /** Open items per mission before the oldest `remaining` fold into a "N more" summary item. */
3931
+ openItemsPerMission: 200,
3932
+ /** One event payload (serialized). */
3933
+ eventPayloadBytes: 16 * 1024,
3934
+ /** items_add / items_update entries honoured per call (extra entries are reported, not applied). */
3935
+ itemsPerCall: 50
3936
+ };
3937
+ var MISSION_DECISION_OPTION_IDS = ["a", "b", "c", "d", "e"];
3938
+ var MISSION_DECISION_URGENCIES = ["normal", "blocking"];
3939
+ var MISSION_DECISION_ON_DUE = ["remind", "apply_recommended"];
3940
+ function truncateMissionText(value, max) {
3941
+ if (value.length <= max) return value;
3942
+ return `${value.slice(0, max - 1).trimEnd()}\u2026`;
3943
+ }
3944
+ function str(value) {
3945
+ return typeof value === "string" ? value.trim() : "";
3946
+ }
3947
+ function collapse(value) {
3948
+ return value.replace(/\s+/g, " ").trim();
3949
+ }
3950
+ function normalizeMissionSummary(value) {
3951
+ if (typeof value !== "string") return null;
3952
+ const text = collapse(value);
3953
+ return { value: truncateMissionText(text, MISSION_LIMITS.summary), truncated: text.length > MISSION_LIMITS.summary };
3954
+ }
3955
+ function normalizeOutcomeReason(value) {
3956
+ if (typeof value !== "string") return null;
3957
+ const text = value.trim();
3958
+ return { value: truncateMissionText(text, MISSION_LIMITS.outcomeReason), truncated: text.length > MISSION_LIMITS.outcomeReason };
3959
+ }
3960
+ function normalizeMissionRefs(value) {
3961
+ if (!Array.isArray(value)) return { refs: [], truncated: false };
3962
+ const refs = [];
3963
+ let truncated = false;
3964
+ for (const raw of value) {
3965
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) continue;
3966
+ const r = raw;
3967
+ const kind = str(r.kind);
3968
+ const refValue = str(r.value);
3969
+ if (!MISSION_REF_KINDS.includes(kind) || !refValue) continue;
3970
+ if (refs.length >= MISSION_LIMITS.refs) {
3971
+ truncated = true;
3972
+ break;
3973
+ }
3974
+ const repo = str(r.repo);
3975
+ const note = str(r.note);
3976
+ refs.push({
3977
+ kind,
3978
+ ...repo ? { repo: truncateMissionText(repo, MISSION_LIMITS.refRepo) } : {},
3979
+ value: truncateMissionText(refValue, MISSION_LIMITS.refValue),
3980
+ ...note ? { note: truncateMissionText(note, MISSION_LIMITS.refNote) } : {}
3981
+ });
3982
+ }
3983
+ return { refs, truncated };
3984
+ }
3985
+ function normalizeOptions(value, truncated) {
3986
+ if (!Array.isArray(value)) return [];
3987
+ const out = [];
3988
+ for (const raw of value) {
3989
+ if (typeof raw === "string" && raw.trim()) {
3990
+ if (out.length >= MISSION_LIMITS.options) {
3991
+ truncated.push("options");
3992
+ break;
3993
+ }
3994
+ out.push({ id: MISSION_DECISION_OPTION_IDS[out.length], label: truncateMissionText(raw.trim(), MISSION_LIMITS.optionLabel) });
3995
+ continue;
3996
+ }
3997
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) continue;
3998
+ const o = raw;
3999
+ const label = collapse(str(o.label));
4000
+ if (!label) continue;
4001
+ if (out.length >= MISSION_LIMITS.options) {
4002
+ truncated.push("options");
4003
+ break;
4004
+ }
4005
+ const detail = str(o.detail);
4006
+ out.push({
4007
+ id: MISSION_DECISION_OPTION_IDS[out.length],
4008
+ label: truncateMissionText(label, MISSION_LIMITS.optionLabel),
4009
+ ...detail ? { detail: truncateMissionText(detail, MISSION_LIMITS.optionDetail) } : {}
4010
+ });
4011
+ }
4012
+ return out;
4013
+ }
4014
+ function normalizeDueAt(value) {
4015
+ if (typeof value !== "string" || !value.trim()) return void 0;
4016
+ const ms2 = Date.parse(value);
4017
+ return Number.isNaN(ms2) ? void 0 : new Date(ms2).toISOString();
4018
+ }
4019
+ function normalizeDecisionInput(raw, truncated) {
4020
+ const questionSource = collapse(str(raw.question) || str(raw.text));
4021
+ if (!questionSource) return null;
4022
+ if (questionSource.length > MISSION_LIMITS.question) truncated.push("question");
4023
+ const question = truncateMissionText(questionSource, MISSION_LIMITS.question);
4024
+ const contextSource = str(raw.context);
4025
+ if (contextSource.length > MISSION_LIMITS.context) truncated.push("context");
4026
+ const options = normalizeOptions(raw.options, truncated);
4027
+ const recommendedRaw = str(raw.recommended);
4028
+ const recommended = recommendedRaw && options.some((o) => o.id === recommendedRaw) ? recommendedRaw : options.find((o) => recommendedRaw && o.label.toLowerCase() === recommendedRaw.toLowerCase())?.id;
4029
+ const dueAt = normalizeDueAt(raw.dueAt ?? raw.due_at);
4030
+ const onDueRaw = str(raw.onDue ?? raw.on_due);
4031
+ const urgencyRaw = str(raw.urgency);
4032
+ const allowFreeTextRaw = raw.allowFreeText ?? raw.allow_free_text;
4033
+ return {
4034
+ question,
4035
+ ...contextSource ? { context: truncateMissionText(contextSource, MISSION_LIMITS.context) } : {},
4036
+ options,
4037
+ ...recommended ? { recommended } : {},
4038
+ allowFreeText: typeof allowFreeTextRaw === "boolean" ? allowFreeTextRaw : true,
4039
+ ...dueAt ? { dueAt } : {},
4040
+ // apply_recommended without a recommended option has nothing to apply — fall back to remind.
4041
+ onDue: onDueRaw === "apply_recommended" && recommended ? "apply_recommended" : "remind",
4042
+ urgency: urgencyRaw === "blocking" ? "blocking" : "normal"
4043
+ };
4044
+ }
4045
+ function normalizeForDedupe(text) {
4046
+ return collapse(text).toLowerCase().replace(/[\s.!?。]+$/u, "");
4047
+ }
4048
+ function deriveItemDedupeKey(kind, parts) {
4049
+ const explicit = str(parts.explicit);
4050
+ if (explicit) return truncateMissionText(`k:${explicit}`, MISSION_LIMITS.dedupeKey);
4051
+ if (kind === "decision") return truncateMissionText(`decision:${normalizeForDedupe(parts.question ?? parts.text ?? "")}`, MISSION_LIMITS.dedupeKey);
4052
+ if (kind === "evidence") {
4053
+ const ref2 = parts.refs?.[0];
4054
+ if (ref2) return truncateMissionText(`evidence:${ref2.kind}:${ref2.repo ?? ""}:${ref2.value}`, MISSION_LIMITS.dedupeKey);
4055
+ }
4056
+ const machine = parts.machine ? `@${normalizeForDedupe(parts.machine)}` : "";
4057
+ return truncateMissionText(`${kind}${machine}:${normalizeForDedupe(parts.text ?? "")}`, MISSION_LIMITS.dedupeKey);
4058
+ }
4059
+ function normalizeMissionItemInput(raw) {
4060
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) return { error: "item must be an object" };
4061
+ const r = raw;
4062
+ const kind = str(r.kind) || "remaining";
4063
+ if (!MISSION_ITEM_KINDS.includes(kind)) {
4064
+ return { error: `invalid kind '${kind}' (valid: ${MISSION_ITEM_KINDS.join(", ")})` };
4065
+ }
4066
+ const truncated = [];
4067
+ const { refs, truncated: refsTruncated } = normalizeMissionRefs(r.refs);
4068
+ if (refsTruncated) truncated.push("refs");
4069
+ const machineRaw = collapse(str(r.machine));
4070
+ const machine = machineRaw ? truncateMissionText(machineRaw, MISSION_LIMITS.machine) : void 0;
4071
+ const explicitKey = str(r.dedupe_key ?? r.dedupeKey);
4072
+ if (kind === "decision") {
4073
+ const decisionRaw = r.decision && typeof r.decision === "object" && !Array.isArray(r.decision) ? r.decision : r;
4074
+ const decision = normalizeDecisionInput({ ...decisionRaw, question: decisionRaw.question ?? r.question ?? r.text }, truncated);
4075
+ if (!decision) return { error: "decision item needs a question" };
4076
+ return {
4077
+ item: {
4078
+ kind,
4079
+ text: decision.question,
4080
+ ...machine ? { machine } : {},
4081
+ refs,
4082
+ decision,
4083
+ dedupeKey: deriveItemDedupeKey("decision", { question: decision.question, explicit: explicitKey }),
4084
+ truncated
4085
+ }
4086
+ };
4087
+ }
4088
+ const textSource = collapse(str(r.text));
4089
+ if (!textSource && !(kind === "evidence" && refs.length > 0)) return { error: `${kind} item needs text` };
4090
+ if (textSource.length > MISSION_LIMITS.itemText) truncated.push("text");
4091
+ const text = truncateMissionText(textSource || `${refs[0].kind}: ${refs[0].value}`, MISSION_LIMITS.itemText);
4092
+ return {
4093
+ item: {
4094
+ kind,
4095
+ text,
4096
+ ...machine ? { machine } : {},
4097
+ refs,
4098
+ dedupeKey: deriveItemDedupeKey(kind, { text, machine, refs, explicit: explicitKey }),
4099
+ truncated
4100
+ }
4101
+ };
4102
+ }
4103
+ function normalizeMissionItemUpdate(raw) {
4104
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) return { error: "update must be an object" };
4105
+ const r = raw;
4106
+ const id2 = str(r.id ?? r.item_id ?? r.itemId);
4107
+ if (!id2) return { error: "update needs an item id" };
4108
+ const truncated = [];
4109
+ const update = { id: id2 };
4110
+ if (r.state !== void 0) {
4111
+ const state = str(r.state);
4112
+ if (!MISSION_ITEM_STATES.includes(state)) return { error: `invalid state '${state}'` };
4113
+ update.state = state;
4114
+ }
4115
+ if (typeof r.text === "string") {
4116
+ const text = collapse(r.text);
4117
+ if (text.length > MISSION_LIMITS.itemText) truncated.push("text");
4118
+ if (text) update.text = truncateMissionText(text, MISSION_LIMITS.itemText);
4119
+ }
4120
+ if (r.machine === null) update.machine = null;
4121
+ else if (typeof r.machine === "string") {
4122
+ const machine = collapse(r.machine);
4123
+ update.machine = machine ? truncateMissionText(machine, MISSION_LIMITS.machine) : null;
4124
+ }
4125
+ if (r.refs !== void 0) {
4126
+ const { refs, truncated: t } = normalizeMissionRefs(r.refs);
4127
+ if (t) truncated.push("refs");
4128
+ update.refs = refs;
4129
+ }
4130
+ return { update, truncated };
4131
+ }
4132
+ function boundEventPayload(payload) {
4133
+ let json = JSON.stringify(payload);
4134
+ if (json.length <= MISSION_LIMITS.eventPayloadBytes) return json;
4135
+ const shrunk = {};
4136
+ for (const [k, v] of Object.entries(payload)) {
4137
+ shrunk[k] = typeof v === "string" && v.length > 4e3 ? `${v.slice(0, 4e3)}\u2026` : v;
4138
+ }
4139
+ shrunk.payloadTruncated = true;
4140
+ json = JSON.stringify(shrunk);
4141
+ if (json.length <= MISSION_LIMITS.eventPayloadBytes) return json;
4142
+ return JSON.stringify({ payloadTruncated: true, keys: Object.keys(payload).slice(0, 20) });
4143
+ }
4144
+ var CARRY_OVER_MISSION_TITLE = "Carry-over \u2014 open items from closed missions";
4145
+ var LEGACY_CARRY_OVER_MISSION_TITLE = "\uC774\uC6D4 \u2014 \uB2EB\uD78C \uBBF8\uC158\uC5D0\uC11C \uB118\uC5B4\uC628 \uD56D\uBAA9";
4146
+ var CARRY_OVER_MISSION_GOAL = "Open items carried over from closed missions, and decisions requested without a mission. Managed automatically \u2014 do not close.";
4147
+ function isCarryOverMissionRecord(m) {
4148
+ return !!m && (m.isCarryOver === true || isCarryOverMissionTitle(m.title));
4149
+ }
4150
+ function isCarryOverMissionTitle(title) {
4151
+ if (typeof title !== "string") return false;
4152
+ const t = title.trim();
4153
+ return t === CARRY_OVER_MISSION_TITLE || t === LEGACY_CARRY_OVER_MISSION_TITLE;
4154
+ }
4155
+ var OWNER_ABANDON_CONFIRM_KEY_PREFIX = "owner-abandon-confirm:";
4156
+ var OWNER_ABANDON_CONFIRM_QUESTION = "The coordinator closed this as 'owner abandoned' \u2014 correct?";
4157
+ var OWNER_ABANDON_CONFIRM_OPTIONS = ["Correct", "Reopen"];
4158
+ var WORKER_DECISIONS_NEEDED_MAX = 3;
4159
+ var WORKER_COMMITS_MAX = 20;
4160
+ var SHA_RE = /^[0-9a-f]{7,64}$/i;
4161
+ function normalizeReportCommits(value) {
4162
+ if (!Array.isArray(value)) return null;
4163
+ const out = [];
4164
+ for (const v of value) {
4165
+ if (typeof v !== "string") return null;
4166
+ const sha = v.trim();
4167
+ if (!SHA_RE.test(sha)) return null;
4168
+ if (!out.includes(sha.toLowerCase())) out.push(sha.toLowerCase());
4169
+ }
4170
+ return out;
4171
+ }
4172
+
4173
+ // src/decision-push-relay.ts
4174
+ var DECISION_PUSH_RELAY_COMMAND = "mission_decision_push_relay_answer";
4175
+ var DECISION_PUSH_RELAY_SOURCE = "push_relay";
4176
+
3802
4177
  // src/keyed-doc-delta.ts
3803
4178
  function sig(value) {
3804
4179
  if (value === void 0) return void 0;
@@ -4261,12 +4636,15 @@ var RelayReprobeScheduler = class {
4261
4636
  CANCEL_REASONS,
4262
4637
  CANONICAL_MESH_TOOL_COUNT,
4263
4638
  CANONICAL_MESH_TOOL_NAMES,
4639
+ CARRY_OVER_MISSION_GOAL,
4640
+ CARRY_OVER_MISSION_TITLE,
4264
4641
  CLAUDE_TUI_REVIEW_PAGE_NOT_FOCUSED_PREFIX,
4265
4642
  CLAUDE_TUI_REVIEW_UNCONFIRMED_PREFIX,
4266
4643
  CLI_SLOT_RECIPES,
4267
4644
  COMMIT_STRENGTHS,
4268
4645
  CONSUME_PROFILES,
4269
4646
  COORDINATOR_ACK_OUTCOMES,
4647
+ COORDINATOR_SETTABLE_ITEM_STATES,
4270
4648
  DAEMON_METADATA_DOC_SPEC,
4271
4649
  DAEMON_P2P_SIGNAL_TYPES,
4272
4650
  DAEMON_STATUS_EVENT_NAMES,
@@ -4279,6 +4657,11 @@ var RelayReprobeScheduler = class {
4279
4657
  DASHBOARD_TO_DAEMON_P2P_TYPES,
4280
4658
  DASHBOARD_TO_USER_SESSION_TYPES,
4281
4659
  DASHBOARD_WIRE_VERSION,
4660
+ DECISION_PUSH_OPTIONS_MAX,
4661
+ DECISION_PUSH_OPTION_LABEL_MAX,
4662
+ DECISION_PUSH_QUESTION_MAX,
4663
+ DECISION_PUSH_RELAY_COMMAND,
4664
+ DECISION_PUSH_RELAY_SOURCE,
4282
4665
  DEFAULT_DIFFICULTY_BRAINS,
4283
4666
  DELIVERY_OUTCOMES,
4284
4667
  DELIVERY_VIAS,
@@ -4290,6 +4673,7 @@ var RelayReprobeScheduler = class {
4290
4673
  LAUNCH_DEFAULT_ERROR_CODES,
4291
4674
  LAUNCH_DEFAULT_ROLES,
4292
4675
  LAUNCH_DEFAULT_SOURCES,
4676
+ LEGACY_CARRY_OVER_MISSION_TITLE,
4293
4677
  LIVENESS_RESULTS,
4294
4678
  MAX_MESH_RECORD_STRING,
4295
4679
  MAX_OWNED_PATHS,
@@ -4315,6 +4699,14 @@ var RelayReprobeScheduler = class {
4315
4699
  MESH_TOPIC_ENTRY_KINDS,
4316
4700
  MESH_TOPIC_PROTOCOL_VERSION,
4317
4701
  MISSION_BRIEF_RENDER_MAX_CHARS,
4702
+ MISSION_DECISION_ON_DUE,
4703
+ MISSION_DECISION_OPTION_IDS,
4704
+ MISSION_DECISION_URGENCIES,
4705
+ MISSION_ITEM_KINDS,
4706
+ MISSION_ITEM_STATES,
4707
+ MISSION_LIMITS,
4708
+ MISSION_OUTCOMES,
4709
+ MISSION_REF_KINDS,
4318
4710
  MODEL_AXIS_SOURCES,
4319
4711
  MODEL_SELECTION_HISTORY_LIMIT,
4320
4712
  MeshChunkAssembler,
@@ -4328,6 +4720,9 @@ var RelayReprobeScheduler = class {
4328
4720
  OPERATOR_STATUS_REASON_VALUES,
4329
4721
  OPERATOR_STATUS_VALUES,
4330
4722
  OUTBOUND_MESSAGE_ORIGINS,
4723
+ OWNER_ABANDON_CONFIRM_KEY_PREFIX,
4724
+ OWNER_ABANDON_CONFIRM_OPTIONS,
4725
+ OWNER_ABANDON_CONFIRM_QUESTION,
4331
4726
  P2P_SIGNAL_TYPES,
4332
4727
  PROVIDER_FAILURES,
4333
4728
  QUOTA_BACKFILL_HORIZON_MS,
@@ -4379,6 +4774,8 @@ var RelayReprobeScheduler = class {
4379
4774
  VERSION_UPDATE_REASONS,
4380
4775
  VIEWER_TO_SHARED_SESSION_TYPES,
4381
4776
  WORKER_BRANCH_STATES,
4777
+ WORKER_COMMITS_MAX,
4778
+ WORKER_DECISIONS_NEEDED_MAX,
4382
4779
  WORKER_PROTOCOL_FOOTER_MARKER,
4383
4780
  WORKER_REPORT_OUTCOMES,
4384
4781
  WORKER_REPORT_SUMMARY_MAX_CHARS,
@@ -4386,6 +4783,7 @@ var RelayReprobeScheduler = class {
4386
4783
  appendWorkerProtocolFooter,
4387
4784
  argsCarryStatusProbeMarker,
4388
4785
  assessQuotaFreshness,
4786
+ boundEventPayload,
4389
4787
  buildSlotProposal,
4390
4788
  canonicalDaemonId,
4391
4789
  classifySessionStatus,
@@ -4455,6 +4853,7 @@ var RelayReprobeScheduler = class {
4455
4853
  decodeUserSessionToDashboard,
4456
4854
  decodeViewerToSharedSession,
4457
4855
  defaultProviderPriorityFromNodeFacts,
4856
+ deriveItemDedupeKey,
4458
4857
  deriveProviderPriorityFromSlots,
4459
4858
  deriveSlotsFromLegacy,
4460
4859
  describeModelSelection,
@@ -4466,6 +4865,7 @@ var RelayReprobeScheduler = class {
4466
4865
  findOwnershipConflicts,
4467
4866
  foldKeyedDoc,
4468
4867
  followedRemoteProjectKey,
4868
+ followerOpPermitted,
4469
4869
  formatQuotaAccount,
4470
4870
  hasGitStatusEvidence,
4471
4871
  hasWorkerProtocolFooter,
@@ -4475,6 +4875,8 @@ var RelayReprobeScheduler = class {
4475
4875
  isAssistantTool,
4476
4876
  isBlockedStatus,
4477
4877
  isBusyStatus,
4878
+ isCarryOverMissionRecord,
4879
+ isCarryOverMissionTitle,
4478
4880
  isChunkType,
4479
4881
  isCommitStrength,
4480
4882
  isDaemonDirectCommandType,
@@ -4507,6 +4909,7 @@ var RelayReprobeScheduler = class {
4507
4909
  isMeshTerminalTaskStatus,
4508
4910
  isMeshTopicEntry,
4509
4911
  isMessageId,
4912
+ isMissionOutcome,
4510
4913
  isMissionUpsertResponse,
4511
4914
  isModelAxisSource,
4512
4915
  isNativeMarkerRef,
@@ -4557,16 +4960,24 @@ var RelayReprobeScheduler = class {
4557
4960
  minutesUntilQuotaCheck,
4558
4961
  normalizeAuthOkLimits,
4559
4962
  normalizeBrainSlot,
4963
+ normalizeDecisionInput,
4560
4964
  normalizeDifficultyBrainMap,
4965
+ normalizeForDedupe,
4561
4966
  normalizeGitStatus,
4562
4967
  normalizeMeshNodeFacts,
4563
4968
  normalizeMeshNodeId,
4564
4969
  normalizeMeshSessionRecord,
4565
4970
  normalizeMeshWorkspaceForCompare,
4566
4971
  normalizeMissionBrief,
4972
+ normalizeMissionItemInput,
4973
+ normalizeMissionItemUpdate,
4974
+ normalizeMissionRefs,
4975
+ normalizeMissionSummary,
4567
4976
  normalizeNodeCapabilitySlot,
4568
4977
  normalizeNodeCapabilitySlots,
4978
+ normalizeOutcomeReason,
4569
4979
  normalizeOwnedPaths,
4980
+ normalizeReportCommits,
4570
4981
  normalizeSessionStatus,
4571
4982
  normalizeThinkingLevel,
4572
4983
  orderProvidersByBuiltinPreference,
@@ -4606,6 +5017,7 @@ var RelayReprobeScheduler = class {
4606
5017
  summarizeGitShape,
4607
5018
  supportsQuota,
4608
5019
  touchedFilesOutsideOwnership,
5020
+ truncateMissionText,
4609
5021
  unwrapPastedContent,
4610
5022
  withStatusProbeMarker
4611
5023
  });