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

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.
@@ -14,7 +14,7 @@
14
14
  * Assistant-specific tools remain separate from mesh tools. Driver discovery
15
15
  * (list/describe) is shared across all three modes; invoke remains Worker-only.
16
16
  */
17
- export declare const ASSISTANT_TOOLS: readonly ["projects", "environment", "assistant_action", "project_watch", "project_status", "project_send", "project_read", "project_add", "project_attach_remote", "discover_repos", "memory", "skill_view", "skill_manage", "project_note", "launch_defaults", "launch_defaults_set", "driver_list", "driver_describe", "artifact_list", "artifact_read", "decision_answer", "decision_request"];
17
+ export declare const ASSISTANT_TOOLS: readonly ["projects", "environment", "assistant_action", "project_watch", "project_status", "project_send", "project_read", "project_add", "project_attach_remote", "discover_repos", "memory", "memory_search", "skill_view", "skill_manage", "project_note", "launch_defaults", "launch_defaults_set", "driver_list", "driver_describe", "artifact_list", "artifact_read", "decision_answer", "decision_request", "session_control"];
18
18
  export type AssistantTool = typeof ASSISTANT_TOOLS[number];
19
19
  export declare function isAssistantTool(value: unknown): value is AssistantTool;
20
20
  /** Daemon verb names (§4.4 table + the five verbs below it). */
@@ -34,6 +34,8 @@ export declare const ASSISTANT_VERB: {
34
34
  readonly projectAttachRemote: "assistant_project_attach_remote";
35
35
  readonly discoverRepos: "assistant_discover_repos";
36
36
  readonly memory: "assistant_memory";
37
+ /** Pull-only FTS search over the archive tier (memory design 2026-11-01 §3.4). */
38
+ readonly memorySearch: "assistant_memory_search";
37
39
  readonly skillView: "assistant_skill_view";
38
40
  readonly skillManage: "assistant_skill_manage";
39
41
  readonly projectNote: "assistant_project_note";
@@ -45,11 +47,19 @@ export declare const ASSISTANT_VERB: {
45
47
  readonly decisionAnswer: "assistant_decision_answer";
46
48
  /** Register a plain-text question a coordinator put to the owner as a decision item (§5.2). */
47
49
  readonly decisionRequest: "assistant_decision_request";
50
+ /** Stop / restart / switch the provider of a coordinator, worker or the assistant session (handoff design 2026-11-01 §4). */
51
+ readonly sessionControl: "assistant_session_control";
48
52
  readonly launch: "launch_assistant";
49
53
  readonly pendingRelays: "assistant_pending_relays";
50
54
  readonly stagedResolve: "assistant_staged_resolve";
51
55
  readonly storeAdmin: "assistant_store_admin";
52
56
  readonly importSkills: "assistant_import_skills";
57
+ /** Owner skill list (attach/view counts, save proposals, recent skill metrics); reads move no counter. */
58
+ readonly skillsList: "assistant_skills_list";
59
+ /** Owner: what the assistant remembered recently, with undo handles (memory design §3.2). */
60
+ readonly memoryDigest: "assistant_memory_digest";
61
+ /** Owner: reverse one remembered write or one batch (memory design §3.2). Never an assistant tool. */
62
+ readonly memoryUndo: "assistant_memory_undo";
53
63
  /** Projects the assistant is following (open relay threads) — list / stop following. */
54
64
  readonly threads: "assistant_threads";
55
65
  readonly threadClose: "assistant_thread_close";
package/dist/index.d.ts CHANGED
@@ -41,6 +41,8 @@ export * from './turn-ipc';
41
41
  export * from './path-ownership';
42
42
  export * from './mission-brief';
43
43
  export * from './mission-items';
44
+ export * from './mission-git-state';
45
+ export * from './release';
44
46
  export * from './decision-push-relay';
45
47
  export * from './keyed-doc-delta';
46
48
  export * from './provider-approval';
package/dist/index.js CHANGED
@@ -40,6 +40,7 @@ __export(index_exports, {
40
40
  CANONICAL_MESH_TOOL_NAMES: () => CANONICAL_MESH_TOOL_NAMES,
41
41
  CARRY_OVER_MISSION_GOAL: () => CARRY_OVER_MISSION_GOAL,
42
42
  CARRY_OVER_MISSION_TITLE: () => CARRY_OVER_MISSION_TITLE,
43
+ CHANGELOG_SECTIONS: () => CHANGELOG_SECTIONS,
43
44
  CLAUDE_TUI_REVIEW_PAGE_NOT_FOCUSED_PREFIX: () => CLAUDE_TUI_REVIEW_PAGE_NOT_FOCUSED_PREFIX,
44
45
  CLAUDE_TUI_REVIEW_UNCONFIRMED_PREFIX: () => CLAUDE_TUI_REVIEW_UNCONFIRMED_PREFIX,
45
46
  CLI_SLOT_RECIPES: () => CLI_SLOT_RECIPES,
@@ -90,6 +91,8 @@ __export(index_exports, {
90
91
  MESH_MISSION_STATUSES: () => MESH_MISSION_STATUSES,
91
92
  MESH_P2P_SIGNAL_TYPES: () => MESH_P2P_SIGNAL_TYPES,
92
93
  MESH_RECORD_PAYLOAD_KEYS: () => MESH_RECORD_PAYLOAD_KEYS,
94
+ MESH_RELEASE_CHANNELS: () => MESH_RELEASE_CHANNELS,
95
+ MESH_RELEASE_STATUSES: () => MESH_RELEASE_STATUSES,
93
96
  MESH_SESSION_CLEANUP_MODES: () => MESH_SESSION_CLEANUP_MODES,
94
97
  MESH_STATUS_DOC_SPEC: () => MESH_STATUS_DOC_SPEC,
95
98
  MESH_TASK_DIFFICULTIES: () => MESH_TASK_DIFFICULTIES,
@@ -104,15 +107,20 @@ __export(index_exports, {
104
107
  MISSION_DECISION_ON_DUE: () => MISSION_DECISION_ON_DUE,
105
108
  MISSION_DECISION_OPTION_IDS: () => MISSION_DECISION_OPTION_IDS,
106
109
  MISSION_DECISION_URGENCIES: () => MISSION_DECISION_URGENCIES,
110
+ MISSION_GIT_STATES: () => MISSION_GIT_STATES,
107
111
  MISSION_ITEM_KINDS: () => MISSION_ITEM_KINDS,
108
112
  MISSION_ITEM_STATES: () => MISSION_ITEM_STATES,
109
113
  MISSION_LIMITS: () => MISSION_LIMITS,
110
114
  MISSION_OUTCOMES: () => MISSION_OUTCOMES,
115
+ MISSION_REF_GIT_METHODS: () => MISSION_REF_GIT_METHODS,
116
+ MISSION_REF_GIT_STATUSES: () => MISSION_REF_GIT_STATUSES,
111
117
  MISSION_REF_KINDS: () => MISSION_REF_KINDS,
118
+ MISSION_RELEASE_EVENT_TYPES: () => MISSION_RELEASE_EVENT_TYPES,
112
119
  MODEL_AXIS_SOURCES: () => MODEL_AXIS_SOURCES,
113
120
  MODEL_SELECTION_HISTORY_LIMIT: () => MODEL_SELECTION_HISTORY_LIMIT,
114
121
  MeshChunkAssembler: () => MeshChunkAssembler,
115
122
  NATIVE_TURN_OUTCOMES: () => NATIVE_TURN_OUTCOMES,
123
+ NEEDS_WORDING_MARKER: () => NEEDS_WORDING_MARKER,
116
124
  NOTIFY_KINDS: () => NOTIFY_KINDS,
117
125
  NO_PROGRESS_OBSERVED_STATUSES: () => NO_PROGRESS_OBSERVED_STATUSES,
118
126
  NPM_UPDATE_TAGS: () => NPM_UPDATE_TAGS,
@@ -135,7 +143,11 @@ __export(index_exports, {
135
143
  RELAY_REPROBE_BASE_DELAY_MS: () => RELAY_REPROBE_BASE_DELAY_MS,
136
144
  RELAY_REPROBE_JITTER_RATIO: () => RELAY_REPROBE_JITTER_RATIO,
137
145
  RELAY_REPROBE_MAX_DELAY_MS: () => RELAY_REPROBE_MAX_DELAY_MS,
146
+ RELEASE_ACTORS: () => RELEASE_ACTORS,
138
147
  RELEASE_CHANNELS: () => RELEASE_CHANNELS,
148
+ RELEASE_EVENT_TYPES: () => RELEASE_EVENT_TYPES,
149
+ RELEASE_LIMITS: () => RELEASE_LIMITS,
150
+ RELEASE_MEMBER_STATES: () => RELEASE_MEMBER_STATES,
139
151
  REMOVED_MESH_TOOLS: () => REMOVED_MESH_TOOLS,
140
152
  RETIRED_MESH_TOOLS: () => RETIRED_MESH_TOOLS,
141
153
  RelayReprobeScheduler: () => RelayReprobeScheduler,
@@ -182,12 +194,15 @@ __export(index_exports, {
182
194
  WORKER_REPORT_OUTCOMES: () => WORKER_REPORT_OUTCOMES,
183
195
  WORKER_REPORT_SUMMARY_MAX_CHARS: () => WORKER_REPORT_SUMMARY_MAX_CHARS,
184
196
  WORKER_TOOLS: () => WORKER_TOOLS,
197
+ aggregateMissionGitState: () => aggregateMissionGitState,
185
198
  appendWorkerProtocolFooter: () => appendWorkerProtocolFooter,
186
199
  argsCarryStatusProbeMarker: () => argsCarryStatusProbeMarker,
187
200
  assessQuotaFreshness: () => assessQuotaFreshness,
188
201
  boundEventPayload: () => boundEventPayload,
189
202
  buildSlotProposal: () => buildSlotProposal,
190
203
  canonicalDaemonId: () => canonicalDaemonId,
204
+ changelogMissionMarker: () => changelogMissionMarker,
205
+ classifyChangelogSection: () => classifyChangelogSection,
191
206
  classifySessionStatus: () => classifySessionStatus,
192
207
  compareDashboardWireVersion: () => compareDashboardWireVersion,
193
208
  compareSemver: () => compareSemver,
@@ -304,6 +319,7 @@ __export(index_exports, {
304
319
  isMeshMissionStatusValue: () => isMeshMissionStatusValue,
305
320
  isMeshP2PSignalType: () => isMeshP2PSignalType,
306
321
  isMeshRecordPayload: () => isMeshRecordPayload,
322
+ isMeshReleaseChannel: () => isMeshReleaseChannel,
307
323
  isMeshTaskDifficulty: () => isMeshTaskDifficulty,
308
324
  isMeshTaskMode: () => isMeshTaskMode,
309
325
  isMeshTaskPriority: () => isMeshTaskPriority,
@@ -312,6 +328,7 @@ __export(index_exports, {
312
328
  isMeshTopicEntry: () => isMeshTopicEntry,
313
329
  isMessageId: () => isMessageId,
314
330
  isMissionOutcome: () => isMissionOutcome,
331
+ isMissionRefContained: () => isMissionRefContained,
315
332
  isMissionUpsertResponse: () => isMissionUpsertResponse,
316
333
  isModelAxisSource: () => isModelAxisSource,
317
334
  isNativeMarkerRef: () => isNativeMarkerRef,
@@ -325,6 +342,7 @@ __export(index_exports, {
325
342
  isRawDaemonDoId: () => isRawDaemonDoId,
326
343
  isReadyStatus: () => isReadyStatus,
327
344
  isRecord: () => isRecord,
345
+ isReleaseStatus: () => isReleaseStatus,
328
346
  isSendPolicy: () => isSendPolicy,
329
347
  isSendPolicyMode: () => isSendPolicyMode,
330
348
  isSendRefusal: () => isSendRefusal,
@@ -351,6 +369,7 @@ __export(index_exports, {
351
369
  isWorkingStatus: () => isWorkingStatus,
352
370
  joinRepoPath: () => joinRepoPath,
353
371
  launchModelSelectionValue: () => launchModelSelectionValue,
372
+ lintChangelogText: () => lintChangelogText,
354
373
  machineCoreFromDaemonId: () => machineCoreFromDaemonId,
355
374
  makeTypeGuard: () => makeTypeGuard,
356
375
  measureWorstCaseChunkEnvelopeBytes: () => measureWorstCaseChunkEnvelopeBytes,
@@ -1182,6 +1201,7 @@ var CANONICAL_MESH_TOOL_NAMES = [
1182
1201
  "mesh_enqueue_task",
1183
1202
  "mesh_view_queue",
1184
1203
  "mesh_queue_cancel",
1204
+ "mesh_direct_cancel",
1185
1205
  "mesh_queue_requeue",
1186
1206
  "mesh_queue_revise",
1187
1207
  "mesh_send_task",
@@ -1204,6 +1224,7 @@ var CANONICAL_MESH_TOOL_NAMES = [
1204
1224
  "mesh_attach_remote",
1205
1225
  "mesh_clone_node",
1206
1226
  "mesh_remove_node",
1227
+ "mesh_retry_node_bootstrap",
1207
1228
  "mesh_cleanup_worktree_nodes",
1208
1229
  "mesh_refine_node",
1209
1230
  "mesh_refine_batch",
@@ -1220,6 +1241,12 @@ var CANONICAL_MESH_TOOL_NAMES = [
1220
1241
  "mesh_reconcile_ledger",
1221
1242
  "mesh_mission_upsert",
1222
1243
  "mesh_mission_list",
1244
+ "mesh_mission_git_eval",
1245
+ "mesh_release_upsert",
1246
+ "mesh_release_scope",
1247
+ "mesh_release_list",
1248
+ "mesh_release_record_deploy",
1249
+ "mesh_release_changelog_draft",
1223
1250
  "mesh_review_inbox",
1224
1251
  "mesh_node_slots",
1225
1252
  "driver_list",
@@ -2224,6 +2251,7 @@ var ASSISTANT_TOOLS = [
2224
2251
  "project_attach_remote",
2225
2252
  "discover_repos",
2226
2253
  "memory",
2254
+ "memory_search",
2227
2255
  "skill_view",
2228
2256
  "skill_manage",
2229
2257
  "project_note",
@@ -2234,7 +2262,8 @@ var ASSISTANT_TOOLS = [
2234
2262
  "artifact_list",
2235
2263
  "artifact_read",
2236
2264
  "decision_answer",
2237
- "decision_request"
2265
+ "decision_request",
2266
+ "session_control"
2238
2267
  ];
2239
2268
  var ASSISTANT_TOOL_SET = new Set(ASSISTANT_TOOLS);
2240
2269
  function isAssistantTool(value) {
@@ -2257,6 +2286,8 @@ var ASSISTANT_VERB = {
2257
2286
  projectAttachRemote: "assistant_project_attach_remote",
2258
2287
  discoverRepos: "assistant_discover_repos",
2259
2288
  memory: "assistant_memory",
2289
+ /** Pull-only FTS search over the archive tier (memory design 2026-11-01 §3.4). */
2290
+ memorySearch: "assistant_memory_search",
2260
2291
  skillView: "assistant_skill_view",
2261
2292
  skillManage: "assistant_skill_manage",
2262
2293
  projectNote: "assistant_project_note",
@@ -2268,6 +2299,8 @@ var ASSISTANT_VERB = {
2268
2299
  decisionAnswer: "assistant_decision_answer",
2269
2300
  /** Register a plain-text question a coordinator put to the owner as a decision item (§5.2). */
2270
2301
  decisionRequest: "assistant_decision_request",
2302
+ /** Stop / restart / switch the provider of a coordinator, worker or the assistant session (handoff design 2026-11-01 §4). */
2303
+ sessionControl: "assistant_session_control",
2271
2304
  // assistant-side daemon verbs without a tool of the same name
2272
2305
  launch: "launch_assistant",
2273
2306
  pendingRelays: "assistant_pending_relays",
@@ -2275,6 +2308,12 @@ var ASSISTANT_VERB = {
2275
2308
  stagedResolve: "assistant_staged_resolve",
2276
2309
  storeAdmin: "assistant_store_admin",
2277
2310
  importSkills: "assistant_import_skills",
2311
+ /** Owner skill list (attach/view counts, save proposals, recent skill metrics); reads move no counter. */
2312
+ skillsList: "assistant_skills_list",
2313
+ /** Owner: what the assistant remembered recently, with undo handles (memory design §3.2). */
2314
+ memoryDigest: "assistant_memory_digest",
2315
+ /** Owner: reverse one remembered write or one batch (memory design §3.2). Never an assistant tool. */
2316
+ memoryUndo: "assistant_memory_undo",
2278
2317
  /** Projects the assistant is following (open relay threads) — list / stop following. */
2279
2318
  threads: "assistant_threads",
2280
2319
  threadClose: "assistant_thread_close"
@@ -2293,6 +2332,7 @@ var ASSISTANT_TOOL_VERBS = {
2293
2332
  project_attach_remote: ASSISTANT_VERB.projectAttachRemote,
2294
2333
  discover_repos: ASSISTANT_VERB.discoverRepos,
2295
2334
  memory: ASSISTANT_VERB.memory,
2335
+ memory_search: ASSISTANT_VERB.memorySearch,
2296
2336
  skill_view: ASSISTANT_VERB.skillView,
2297
2337
  skill_manage: ASSISTANT_VERB.skillManage,
2298
2338
  project_note: ASSISTANT_VERB.projectNote,
@@ -2301,18 +2341,23 @@ var ASSISTANT_TOOL_VERBS = {
2301
2341
  artifact_list: ASSISTANT_VERB.artifactList,
2302
2342
  artifact_read: ASSISTANT_VERB.artifactRead,
2303
2343
  decision_answer: ASSISTANT_VERB.decisionAnswer,
2304
- decision_request: ASSISTANT_VERB.decisionRequest
2344
+ decision_request: ASSISTANT_VERB.decisionRequest,
2345
+ session_control: ASSISTANT_VERB.sessionControl
2305
2346
  };
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"];
2347
+ 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", "session_control"];
2307
2348
  var ASSISTANT_OWNER_VERBS = [
2308
2349
  ASSISTANT_VERB.executionSettings,
2309
2350
  ASSISTANT_VERB.stagedResolve,
2310
2351
  ASSISTANT_VERB.storeAdmin,
2311
2352
  ASSISTANT_VERB.importSkills,
2353
+ ASSISTANT_VERB.skillsList,
2354
+ ASSISTANT_VERB.memoryDigest,
2355
+ ASSISTANT_VERB.memoryUndo,
2312
2356
  ASSISTANT_VERB.threadClose
2313
2357
  ];
2314
2358
  var ASSISTANT_REVIEW_TURN_VERBS = [
2315
2359
  ASSISTANT_VERB.memory,
2360
+ ASSISTANT_VERB.memorySearch,
2316
2361
  ASSISTANT_VERB.skillView,
2317
2362
  ASSISTANT_VERB.skillManage,
2318
2363
  ASSISTANT_VERB.projectNote
@@ -2918,6 +2963,7 @@ function parseModelSelection(raw) {
2918
2963
  const current = readString(record2.current);
2919
2964
  const observed = readString(record2.observed);
2920
2965
  const observedAt = readFiniteNumber(record2.observedAt);
2966
+ const fallback = record2.fallback === true;
2921
2967
  return {
2922
2968
  source: isModelAxisSource(record2.source) ? record2.source : "unspecified",
2923
2969
  ...requested ? { requested } : {},
@@ -2926,6 +2972,7 @@ function parseModelSelection(raw) {
2926
2972
  ...current ? { current } : {},
2927
2973
  ...observed ? { observed } : {},
2928
2974
  ...observedAt !== void 0 ? { observedAt } : {},
2975
+ ...fallback ? { fallback } : {},
2929
2976
  history: history.slice(-MODEL_SELECTION_HISTORY_LIMIT)
2930
2977
  };
2931
2978
  }
@@ -3238,13 +3285,13 @@ function isMissionBriefWire(value) {
3238
3285
  }
3239
3286
  return true;
3240
3287
  }
3241
- var STRUCTURED_MISSION_KEYS = ["summary", "outcome", "outcomeReason", "version", "carryOver", "openItems"];
3288
+ var STRUCTURED_MISSION_KEYS = ["summary", "releaseNote", "outcome", "outcomeReason", "version", "carryOver", "openItems"];
3242
3289
  function isOpenItemCountsWire(value) {
3243
3290
  if (!isRecord(value) || !hasOnlyKeys2(value, ["remaining", "live_check", "decision", "evidence"])) return false;
3244
3291
  return ["remaining", "live_check", "decision", "evidence"].every((k) => isNonNegativeInt(value[k]));
3245
3292
  }
3246
3293
  function isStructuredMissionFields(value) {
3247
- for (const k of ["summary", "outcome", "outcomeReason"]) {
3294
+ for (const k of ["summary", "releaseNote", "outcome", "outcomeReason"]) {
3248
3295
  if (value[k] !== void 0 && typeof value[k] !== "string") return false;
3249
3296
  }
3250
3297
  if (value.version !== void 0 && !isNonNegativeInt(value.version)) return false;
@@ -3262,7 +3309,7 @@ function isMeshMissionRecordWire(value) {
3262
3309
  return true;
3263
3310
  }
3264
3311
  function isMissionUpsertRequest(value) {
3265
- if (!isRecord(value) || !hasOnlyKeys2(value, ["v", "meshId", "id", "title", "goal", "status", "brief", "structured", "summary", "outcome", "outcomeReason", "carryOverTo", "toCarryOver", "itemsAdd", "itemsUpdate"])) return false;
3312
+ if (!isRecord(value) || !hasOnlyKeys2(value, ["v", "meshId", "id", "title", "goal", "status", "brief", "structured", "summary", "releaseNote", "outcome", "outcomeReason", "carryOverTo", "toCarryOver", "itemsAdd", "itemsUpdate"])) return false;
3266
3313
  if (value.v !== TURN_IPC_PROTOCOL_VERSION) return false;
3267
3314
  if (!isEvidenceIdentifier(value.meshId)) return false;
3268
3315
  if (value.id !== void 0 && !isEvidenceIdentifier(value.id)) return false;
@@ -3270,7 +3317,7 @@ function isMissionUpsertRequest(value) {
3270
3317
  if (value.title.trim().length === 0 && value.toCarryOver !== true && value.id === void 0) return false;
3271
3318
  if (value.structured !== void 0 && typeof value.structured !== "boolean") return false;
3272
3319
  if (value.toCarryOver !== void 0 && typeof value.toCarryOver !== "boolean") return false;
3273
- for (const k of ["summary", "outcome", "outcomeReason"]) {
3320
+ for (const k of ["summary", "releaseNote", "outcome", "outcomeReason"]) {
3274
3321
  if (value[k] !== void 0 && typeof value[k] !== "string") return false;
3275
3322
  }
3276
3323
  if (value.carryOverTo !== void 0 && !isEvidenceIdentifier(value.carryOverTo)) return false;
@@ -3900,7 +3947,7 @@ function touchedFilesOutsideOwnership(touched, owned) {
3900
3947
 
3901
3948
  // src/mission-items.ts
3902
3949
  var MISSION_ITEM_KINDS = ["remaining", "live_check", "decision", "evidence"];
3903
- var MISSION_ITEM_STATES = ["open", "done", "dropped", "moved", "answered", "expired", "withdrawn", "superseded"];
3950
+ var MISSION_ITEM_STATES = ["open", "done", "failed", "dropped", "moved", "answered", "expired", "withdrawn", "superseded"];
3904
3951
  var COORDINATOR_SETTABLE_ITEM_STATES = {
3905
3952
  remaining: ["open", "done", "dropped"],
3906
3953
  live_check: ["open", "done", "dropped"],
@@ -4170,6 +4217,81 @@ function normalizeReportCommits(value) {
4170
4217
  return out;
4171
4218
  }
4172
4219
 
4220
+ // src/mission-git-state.ts
4221
+ var MISSION_REF_GIT_STATUSES = ["contained_ancestor", "contained_patch_equivalent", "not_contained", "unknown"];
4222
+ var MISSION_REF_GIT_METHODS = ["ancestry", "cherry", "residual_patch"];
4223
+ var MISSION_GIT_STATES = ["no_refs", "landed", "partial", "not_landed", "unknown"];
4224
+ function isMissionRefContained(status) {
4225
+ return status === "contained_ancestor" || status === "contained_patch_equivalent";
4226
+ }
4227
+ function aggregateMissionGitState(statuses) {
4228
+ const total = statuses.length;
4229
+ const contained = statuses.filter(isMissionRefContained).length;
4230
+ const notContained = statuses.filter((s) => s === "not_contained").length;
4231
+ const unknown = statuses.filter((s) => s === "unknown").length;
4232
+ const counts = { total, contained, notContained, unknown };
4233
+ if (total === 0) return { state: "no_refs", partialUnknown: false, counts };
4234
+ if (contained === total) return { state: "landed", partialUnknown: false, counts };
4235
+ if (contained > 0) return { state: "partial", partialUnknown: unknown > 0, counts };
4236
+ if (notContained === total) return { state: "not_landed", partialUnknown: false, counts };
4237
+ return { state: "unknown", partialUnknown: false, counts };
4238
+ }
4239
+
4240
+ // src/release.ts
4241
+ var MESH_RELEASE_CHANNELS = ["preview", "stable"];
4242
+ function isMeshReleaseChannel(value) {
4243
+ return typeof value === "string" && MESH_RELEASE_CHANNELS.includes(value);
4244
+ }
4245
+ var MESH_RELEASE_STATUSES = ["planned", "frozen", "deployed", "verified", "superseded", "cancelled"];
4246
+ function isReleaseStatus(value) {
4247
+ return typeof value === "string" && MESH_RELEASE_STATUSES.includes(value);
4248
+ }
4249
+ var RELEASE_MEMBER_STATES = ["member", "moved_out", "removed"];
4250
+ var RELEASE_ACTORS = ["coordinator", "owner", "assistant", "script"];
4251
+ var RELEASE_EVENT_TYPES = [
4252
+ "created",
4253
+ "status_changed",
4254
+ "scope_added",
4255
+ "scope_moved",
4256
+ "scope_removed",
4257
+ "deploy_recorded",
4258
+ "changelog_drafted",
4259
+ "changelog_applied"
4260
+ ];
4261
+ var MISSION_RELEASE_EVENT_TYPES = ["release_attached", "release_moved", "release_detached"];
4262
+ var RELEASE_LIMITS = {
4263
+ name: 80,
4264
+ note: 500,
4265
+ /** `mesh_missions.release_note`: one user/operator-visible sentence. */
4266
+ releaseNote: 400,
4267
+ missionsPerCall: 100,
4268
+ changelogEntries: 300
4269
+ };
4270
+ var CHANGELOG_SECTIONS = ["Added", "Fixed", "Changed"];
4271
+ var NEEDS_WORDING_MARKER = "[needs user-facing wording]";
4272
+ function changelogMissionMarker(missionId) {
4273
+ return `<!-- m:${missionId.slice(0, 8)} -->`;
4274
+ }
4275
+ function classifyChangelogSection(text, hint) {
4276
+ const m = /^\s*\[(added|fixed|changed)\]\s*/i.exec(text);
4277
+ if (m) {
4278
+ const key = m[1].toLowerCase();
4279
+ return { section: key === "added" ? "Added" : key === "fixed" ? "Fixed" : "Changed", text: text.slice(m[0].length).trim() };
4280
+ }
4281
+ const probe = `${hint ?? ""} ${text}`.toLowerCase();
4282
+ if (/\b(fix|fixes|fixed|bug|regression|crash|error)\b|오류|결함|버그|수정/.test(probe)) return { section: "Fixed", text };
4283
+ if (/\b(add|adds|added|new|introduc\w*|support\w*)\b|신규|추가/.test(probe)) return { section: "Added", text };
4284
+ return { section: "Changed", text };
4285
+ }
4286
+ function lintChangelogText(text) {
4287
+ const out = [];
4288
+ if (/\bwave[\s-]*\d+/i.test(text) || /웨이브\s*\d+/.test(text)) out.push("mentions an internal wave number");
4289
+ if (/\brc[.\s-]?\d+\b/i.test(text)) out.push("mentions an internal rc number");
4290
+ if (/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i.test(text) || /\bmi_[0-9a-f]{12}\b/.test(text) || /\brel_[0-9a-f]{12}\b/.test(text)) out.push("contains an internal id");
4291
+ if (/\bmission\b/i.test(text)) out.push('mentions "mission" (internal vocabulary)');
4292
+ return out;
4293
+ }
4294
+
4173
4295
  // src/decision-push-relay.ts
4174
4296
  var DECISION_PUSH_RELAY_COMMAND = "mission_decision_push_relay_answer";
4175
4297
  var DECISION_PUSH_RELAY_SOURCE = "push_relay";
@@ -4638,6 +4760,7 @@ var RelayReprobeScheduler = class {
4638
4760
  CANONICAL_MESH_TOOL_NAMES,
4639
4761
  CARRY_OVER_MISSION_GOAL,
4640
4762
  CARRY_OVER_MISSION_TITLE,
4763
+ CHANGELOG_SECTIONS,
4641
4764
  CLAUDE_TUI_REVIEW_PAGE_NOT_FOCUSED_PREFIX,
4642
4765
  CLAUDE_TUI_REVIEW_UNCONFIRMED_PREFIX,
4643
4766
  CLI_SLOT_RECIPES,
@@ -4688,6 +4811,8 @@ var RelayReprobeScheduler = class {
4688
4811
  MESH_MISSION_STATUSES,
4689
4812
  MESH_P2P_SIGNAL_TYPES,
4690
4813
  MESH_RECORD_PAYLOAD_KEYS,
4814
+ MESH_RELEASE_CHANNELS,
4815
+ MESH_RELEASE_STATUSES,
4691
4816
  MESH_SESSION_CLEANUP_MODES,
4692
4817
  MESH_STATUS_DOC_SPEC,
4693
4818
  MESH_TASK_DIFFICULTIES,
@@ -4702,15 +4827,20 @@ var RelayReprobeScheduler = class {
4702
4827
  MISSION_DECISION_ON_DUE,
4703
4828
  MISSION_DECISION_OPTION_IDS,
4704
4829
  MISSION_DECISION_URGENCIES,
4830
+ MISSION_GIT_STATES,
4705
4831
  MISSION_ITEM_KINDS,
4706
4832
  MISSION_ITEM_STATES,
4707
4833
  MISSION_LIMITS,
4708
4834
  MISSION_OUTCOMES,
4835
+ MISSION_REF_GIT_METHODS,
4836
+ MISSION_REF_GIT_STATUSES,
4709
4837
  MISSION_REF_KINDS,
4838
+ MISSION_RELEASE_EVENT_TYPES,
4710
4839
  MODEL_AXIS_SOURCES,
4711
4840
  MODEL_SELECTION_HISTORY_LIMIT,
4712
4841
  MeshChunkAssembler,
4713
4842
  NATIVE_TURN_OUTCOMES,
4843
+ NEEDS_WORDING_MARKER,
4714
4844
  NOTIFY_KINDS,
4715
4845
  NO_PROGRESS_OBSERVED_STATUSES,
4716
4846
  NPM_UPDATE_TAGS,
@@ -4733,7 +4863,11 @@ var RelayReprobeScheduler = class {
4733
4863
  RELAY_REPROBE_BASE_DELAY_MS,
4734
4864
  RELAY_REPROBE_JITTER_RATIO,
4735
4865
  RELAY_REPROBE_MAX_DELAY_MS,
4866
+ RELEASE_ACTORS,
4736
4867
  RELEASE_CHANNELS,
4868
+ RELEASE_EVENT_TYPES,
4869
+ RELEASE_LIMITS,
4870
+ RELEASE_MEMBER_STATES,
4737
4871
  REMOVED_MESH_TOOLS,
4738
4872
  RETIRED_MESH_TOOLS,
4739
4873
  RelayReprobeScheduler,
@@ -4780,12 +4914,15 @@ var RelayReprobeScheduler = class {
4780
4914
  WORKER_REPORT_OUTCOMES,
4781
4915
  WORKER_REPORT_SUMMARY_MAX_CHARS,
4782
4916
  WORKER_TOOLS,
4917
+ aggregateMissionGitState,
4783
4918
  appendWorkerProtocolFooter,
4784
4919
  argsCarryStatusProbeMarker,
4785
4920
  assessQuotaFreshness,
4786
4921
  boundEventPayload,
4787
4922
  buildSlotProposal,
4788
4923
  canonicalDaemonId,
4924
+ changelogMissionMarker,
4925
+ classifyChangelogSection,
4789
4926
  classifySessionStatus,
4790
4927
  compareDashboardWireVersion,
4791
4928
  compareSemver,
@@ -4902,6 +5039,7 @@ var RelayReprobeScheduler = class {
4902
5039
  isMeshMissionStatusValue,
4903
5040
  isMeshP2PSignalType,
4904
5041
  isMeshRecordPayload,
5042
+ isMeshReleaseChannel,
4905
5043
  isMeshTaskDifficulty,
4906
5044
  isMeshTaskMode,
4907
5045
  isMeshTaskPriority,
@@ -4910,6 +5048,7 @@ var RelayReprobeScheduler = class {
4910
5048
  isMeshTopicEntry,
4911
5049
  isMessageId,
4912
5050
  isMissionOutcome,
5051
+ isMissionRefContained,
4913
5052
  isMissionUpsertResponse,
4914
5053
  isModelAxisSource,
4915
5054
  isNativeMarkerRef,
@@ -4923,6 +5062,7 @@ var RelayReprobeScheduler = class {
4923
5062
  isRawDaemonDoId,
4924
5063
  isReadyStatus,
4925
5064
  isRecord,
5065
+ isReleaseStatus,
4926
5066
  isSendPolicy,
4927
5067
  isSendPolicyMode,
4928
5068
  isSendRefusal,
@@ -4949,6 +5089,7 @@ var RelayReprobeScheduler = class {
4949
5089
  isWorkingStatus,
4950
5090
  joinRepoPath,
4951
5091
  launchModelSelectionValue,
5092
+ lintChangelogText,
4952
5093
  machineCoreFromDaemonId,
4953
5094
  makeTypeGuard,
4954
5095
  measureWorstCaseChunkEnvelopeBytes,