@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/assistant-protocol.d.ts +7 -2
- package/dist/decision-push-relay.d.ts +20 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +423 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +386 -11
- package/dist/index.mjs.map +1 -1
- package/dist/mission-items.d.ts +202 -0
- package/dist/protocol/daemon-server.d.ts +27 -2
- package/dist/protocol/dashboard-server.d.ts +2 -2
- package/dist/turn-ipc-mission.d.ts +59 -1
- package/dist/worker-protocol.d.ts +1 -1
- package/package.json +1 -1
- package/src/assistant-protocol.ts +29 -2
- package/src/decision-push-relay.ts +23 -0
- package/src/index.ts +2 -0
- package/src/mission-items.ts +421 -0
- package/src/protocol/daemon-server.ts +26 -0
- package/src/turn-ipc-mission.ts +108 -9
- package/src/worker-protocol.ts +4 -0
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"
|
|
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
|
});
|