@scotthamilton77/sidekick 0.1.8 → 0.1.10

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/bin.js CHANGED
@@ -1030,7 +1030,7 @@ var require_events = __commonJS({
1030
1030
  "../types/dist/events.js"(exports2) {
1031
1031
  "use strict";
1032
1032
  Object.defineProperty(exports2, "__esModule", { value: true });
1033
- exports2.HOOK_NAMES = void 0;
1033
+ exports2.UI_EVENT_VISIBILITY = exports2.UI_EVENT_TYPES = exports2.HOOK_NAMES = void 0;
1034
1034
  exports2.isHookEvent = isHookEvent;
1035
1035
  exports2.isTranscriptEvent = isTranscriptEvent;
1036
1036
  exports2.isSessionStartEvent = isSessionStartEvent;
@@ -1092,6 +1092,92 @@ var require_events = __commonJS({
1092
1092
  function isTranscriptLoggingEvent(event) {
1093
1093
  return event.source === "transcript";
1094
1094
  }
1095
+ exports2.UI_EVENT_TYPES = [
1096
+ // Reminder events
1097
+ "reminder:staged",
1098
+ "reminder:unstaged",
1099
+ "reminder:consumed",
1100
+ "reminder:cleared",
1101
+ "reminder:not-staged",
1102
+ // Decision events
1103
+ "decision:recorded",
1104
+ // Session summary events
1105
+ "session-summary:start",
1106
+ "session-summary:finish",
1107
+ // Session state change events
1108
+ "session-title:changed",
1109
+ "intent:changed",
1110
+ // Snarky message events
1111
+ "snarky-message:start",
1112
+ "snarky-message:finish",
1113
+ // Resume message events
1114
+ "resume-message:start",
1115
+ "resume-message:finish",
1116
+ // Persona events
1117
+ "persona:selected",
1118
+ "persona:changed",
1119
+ // Statusline events
1120
+ "statusline:rendered",
1121
+ // Hook lifecycle events
1122
+ "hook:received",
1123
+ "hook:completed",
1124
+ // Daemon event processing
1125
+ "event:received",
1126
+ "event:processed",
1127
+ // Daemon lifecycle events
1128
+ "daemon:starting",
1129
+ "daemon:started",
1130
+ "ipc:started",
1131
+ "config:watcher-started",
1132
+ "session:eviction-started",
1133
+ // Skipped operation events
1134
+ "session-summary:skipped",
1135
+ "resume-message:skipped",
1136
+ // Error events
1137
+ "statusline:error",
1138
+ // Transcript events
1139
+ "transcript:emitted",
1140
+ "transcript:pre-compact",
1141
+ // General error
1142
+ "error:occurred"
1143
+ ];
1144
+ exports2.UI_EVENT_VISIBILITY = {
1145
+ // Timeline events (user-visible state changes)
1146
+ "reminder:staged": "timeline",
1147
+ "reminder:unstaged": "timeline",
1148
+ "reminder:consumed": "timeline",
1149
+ "reminder:cleared": "timeline",
1150
+ "reminder:not-staged": "log",
1151
+ "decision:recorded": "timeline",
1152
+ "session-summary:start": "timeline",
1153
+ "session-summary:finish": "timeline",
1154
+ "session-title:changed": "timeline",
1155
+ "intent:changed": "timeline",
1156
+ "snarky-message:start": "timeline",
1157
+ "snarky-message:finish": "timeline",
1158
+ "resume-message:start": "timeline",
1159
+ "resume-message:finish": "timeline",
1160
+ "persona:selected": "timeline",
1161
+ "persona:changed": "timeline",
1162
+ "statusline:rendered": "timeline",
1163
+ // Both (timeline + log viewer)
1164
+ "hook:received": "both",
1165
+ "hook:completed": "both",
1166
+ "statusline:error": "both",
1167
+ "error:occurred": "both",
1168
+ // Log-only (internal machinery)
1169
+ "event:received": "log",
1170
+ "event:processed": "log",
1171
+ "daemon:starting": "log",
1172
+ "daemon:started": "log",
1173
+ "ipc:started": "log",
1174
+ "config:watcher-started": "log",
1175
+ "session:eviction-started": "log",
1176
+ "session-summary:skipped": "log",
1177
+ "resume-message:skipped": "log",
1178
+ "transcript:emitted": "log",
1179
+ "transcript:pre-compact": "log"
1180
+ };
1095
1181
  }
1096
1182
  });
1097
1183
 
@@ -17228,6 +17314,7 @@ var require_state = __commonJS({
17228
17314
  exports2.createDefaultLLMMetrics = createDefaultLLMMetrics;
17229
17315
  var zod_1 = require_zod();
17230
17316
  var events_js_1 = require_events();
17317
+ var staging_js_1 = require_staging();
17231
17318
  exports2.SessionSummaryStateSchema = zod_1.z.object({
17232
17319
  /** Session identifier */
17233
17320
  session_id: zod_1.z.string(),
@@ -17389,16 +17476,7 @@ var require_state = __commonJS({
17389
17476
  lastMatchedScope: zod_1.z.enum(["project", "package", "file"]).nullable().optional()
17390
17477
  });
17391
17478
  exports2.VerificationToolsStateSchema = zod_1.z.record(zod_1.z.string(), exports2.VerificationToolStatusSchema);
17392
- exports2.CachedReminderSchema = zod_1.z.object({
17393
- name: zod_1.z.string(),
17394
- blocking: zod_1.z.boolean(),
17395
- priority: zod_1.z.number(),
17396
- persistent: zod_1.z.boolean(),
17397
- throttle: zod_1.z.boolean().optional(),
17398
- userMessage: zod_1.z.string().optional(),
17399
- additionalContext: zod_1.z.string().optional(),
17400
- reason: zod_1.z.string().optional()
17401
- });
17479
+ exports2.CachedReminderSchema = staging_js_1.StagedReminderSchema.omit({ stagedAt: true });
17402
17480
  exports2.ReminderThrottleEntrySchema = zod_1.z.object({
17403
17481
  /** Number of conversation messages since the reminder was last staged */
17404
17482
  messagesSinceLastStaging: zod_1.z.number().int().nonnegative(),
@@ -17979,6 +18057,24 @@ var require_setup_status = __commonJS({
17979
18057
  }
17980
18058
  });
17981
18059
 
18060
+ // ../types/dist/state.js
18061
+ var require_state2 = __commonJS({
18062
+ "../types/dist/state.js"(exports2) {
18063
+ "use strict";
18064
+ Object.defineProperty(exports2, "__esModule", { value: true });
18065
+ exports2.ProjectRegistryEntrySchema = void 0;
18066
+ var zod_1 = require_zod();
18067
+ exports2.ProjectRegistryEntrySchema = zod_1.z.object({
18068
+ /** Absolute filesystem path to the project root */
18069
+ path: zod_1.z.string(),
18070
+ /** Human-readable project name (derived from directory name) */
18071
+ displayName: zod_1.z.string(),
18072
+ /** ISO 8601 timestamp of last daemon activity */
18073
+ lastActive: zod_1.z.iso.datetime()
18074
+ });
18075
+ }
18076
+ });
18077
+
17982
18078
  // ../types/dist/index.js
17983
18079
  var require_dist = __commonJS({
17984
18080
  "../types/dist/index.js"(exports2) {
@@ -18010,6 +18106,7 @@ var require_dist = __commonJS({
18010
18106
  __exportStar(require_tasks(), exports2);
18011
18107
  __exportStar(require_hook_input(), exports2);
18012
18108
  __exportStar(require_setup_status(), exports2);
18109
+ __exportStar(require_state2(), exports2);
18013
18110
  }
18014
18111
  });
18015
18112
 
@@ -27755,9 +27852,13 @@ var require_config2 = __commonJS({
27755
27852
  state: v4_1.z.string(),
27756
27853
  assets: v4_1.z.string().optional()
27757
27854
  }).strict();
27855
+ var ProjectsSchema = v4_1.z.object({
27856
+ retentionDays: v4_1.z.number().min(1)
27857
+ }).strict();
27758
27858
  var DaemonSchema = v4_1.z.object({
27759
27859
  idleTimeoutMs: v4_1.z.number().min(0),
27760
- shutdownTimeoutMs: v4_1.z.number().min(0)
27860
+ shutdownTimeoutMs: v4_1.z.number().min(0),
27861
+ projects: ProjectsSchema.default({ retentionDays: 30 })
27761
27862
  }).strict();
27762
27863
  var IpcSchema = v4_1.z.object({
27763
27864
  connectTimeoutMs: v4_1.z.number().min(0),
@@ -45661,7 +45762,7 @@ var require_structured_logging = __commonJS({
45661
45762
  */
45662
45763
  hookReceived(context, metadata) {
45663
45764
  return {
45664
- type: "HookReceived",
45765
+ type: "hook:received",
45665
45766
  time: Date.now(),
45666
45767
  source: "cli",
45667
45768
  context: {
@@ -45671,7 +45772,9 @@ var require_structured_logging = __commonJS({
45671
45772
  hook: context.hook
45672
45773
  },
45673
45774
  payload: {
45674
- metadata
45775
+ hook: context.hook,
45776
+ cwd: metadata.cwd,
45777
+ mode: metadata.mode
45675
45778
  }
45676
45779
  };
45677
45780
  },
@@ -45680,7 +45783,7 @@ var require_structured_logging = __commonJS({
45680
45783
  */
45681
45784
  hookCompleted(context, metadata, state) {
45682
45785
  return {
45683
- type: "HookCompleted",
45786
+ type: "hook:completed",
45684
45787
  time: Date.now(),
45685
45788
  source: "cli",
45686
45789
  context: {
@@ -45690,8 +45793,10 @@ var require_structured_logging = __commonJS({
45690
45793
  hook: context.hook
45691
45794
  },
45692
45795
  payload: {
45693
- state,
45694
- metadata
45796
+ hook: context.hook,
45797
+ durationMs: metadata.durationMs,
45798
+ reminderReturned: state?.reminderReturned,
45799
+ responseType: state?.responseType
45695
45800
  }
45696
45801
  };
45697
45802
  },
@@ -45701,7 +45806,7 @@ var require_structured_logging = __commonJS({
45701
45806
  */
45702
45807
  eventReceived(context, metadata) {
45703
45808
  return {
45704
- type: "EventReceived",
45809
+ type: "event:received",
45705
45810
  time: Date.now(),
45706
45811
  source: "daemon",
45707
45812
  context: {
@@ -45712,7 +45817,9 @@ var require_structured_logging = __commonJS({
45712
45817
  taskId: context.taskId
45713
45818
  },
45714
45819
  payload: {
45715
- metadata
45820
+ eventKind: metadata.eventKind,
45821
+ ...metadata.eventType !== void 0 && { eventType: metadata.eventType },
45822
+ ...metadata.hook !== void 0 && { hook: metadata.hook }
45716
45823
  }
45717
45824
  };
45718
45825
  },
@@ -45722,7 +45829,7 @@ var require_structured_logging = __commonJS({
45722
45829
  */
45723
45830
  eventProcessed(context, state, metadata) {
45724
45831
  return {
45725
- type: "EventProcessed",
45832
+ type: "event:processed",
45726
45833
  time: Date.now(),
45727
45834
  source: "daemon",
45728
45835
  context: {
@@ -45733,17 +45840,19 @@ var require_structured_logging = __commonJS({
45733
45840
  taskId: context.taskId
45734
45841
  },
45735
45842
  payload: {
45736
- state,
45737
- metadata
45843
+ handlerId: state.handlerId,
45844
+ success: state.success,
45845
+ durationMs: metadata.durationMs,
45846
+ error: metadata.error
45738
45847
  }
45739
45848
  };
45740
45849
  },
45741
45850
  /**
45742
45851
  * Create a ReminderStaged event (logged when Daemon stages a reminder file).
45743
45852
  */
45744
- reminderStaged(context, state, metadata) {
45853
+ reminderStaged(context, state, _metadata) {
45745
45854
  return {
45746
- type: "ReminderStaged",
45855
+ type: "reminder:staged",
45747
45856
  time: Date.now(),
45748
45857
  source: "daemon",
45749
45858
  context: {
@@ -45754,8 +45863,14 @@ var require_structured_logging = __commonJS({
45754
45863
  taskId: context.taskId
45755
45864
  },
45756
45865
  payload: {
45757
- state,
45758
- metadata
45866
+ reminderName: state.reminderName,
45867
+ hookName: state.hookName,
45868
+ blocking: state.blocking,
45869
+ priority: state.priority,
45870
+ persistent: state.persistent,
45871
+ ...state.reason !== void 0 && { reason: state.reason },
45872
+ ...state.triggeredBy !== void 0 && { triggeredBy: state.triggeredBy },
45873
+ ...state.thresholdState !== void 0 && { thresholdState: state.thresholdState }
45759
45874
  }
45760
45875
  };
45761
45876
  },
@@ -45765,14 +45880,15 @@ var require_structured_logging = __commonJS({
45765
45880
  */
45766
45881
  daemonStarting(metadata) {
45767
45882
  return {
45768
- type: "DaemonStarting",
45883
+ type: "daemon:starting",
45769
45884
  time: Date.now(),
45770
45885
  source: "daemon",
45771
45886
  context: {
45772
45887
  sessionId: ""
45773
45888
  },
45774
45889
  payload: {
45775
- metadata
45890
+ projectDir: metadata.projectDir,
45891
+ pid: metadata.pid
45776
45892
  }
45777
45893
  };
45778
45894
  },
@@ -45781,14 +45897,14 @@ var require_structured_logging = __commonJS({
45781
45897
  */
45782
45898
  daemonStarted(metadata) {
45783
45899
  return {
45784
- type: "DaemonStarted",
45900
+ type: "daemon:started",
45785
45901
  time: Date.now(),
45786
45902
  source: "daemon",
45787
45903
  context: {
45788
45904
  sessionId: ""
45789
45905
  },
45790
45906
  payload: {
45791
- metadata
45907
+ startupDurationMs: metadata.startupDurationMs
45792
45908
  }
45793
45909
  };
45794
45910
  },
@@ -45797,14 +45913,14 @@ var require_structured_logging = __commonJS({
45797
45913
  */
45798
45914
  ipcServerStarted(metadata) {
45799
45915
  return {
45800
- type: "IpcServerStarted",
45916
+ type: "ipc:started",
45801
45917
  time: Date.now(),
45802
45918
  source: "daemon",
45803
45919
  context: {
45804
45920
  sessionId: ""
45805
45921
  },
45806
45922
  payload: {
45807
- metadata
45923
+ socketPath: metadata.socketPath
45808
45924
  }
45809
45925
  };
45810
45926
  },
@@ -45813,14 +45929,15 @@ var require_structured_logging = __commonJS({
45813
45929
  */
45814
45930
  configWatcherStarted(metadata) {
45815
45931
  return {
45816
- type: "ConfigWatcherStarted",
45932
+ type: "config:watcher-started",
45817
45933
  time: Date.now(),
45818
45934
  source: "daemon",
45819
45935
  context: {
45820
45936
  sessionId: ""
45821
45937
  },
45822
45938
  payload: {
45823
- metadata
45939
+ projectDir: metadata.projectDir,
45940
+ watchedFiles: metadata.watchedFiles
45824
45941
  }
45825
45942
  };
45826
45943
  },
@@ -45829,14 +45946,14 @@ var require_structured_logging = __commonJS({
45829
45946
  */
45830
45947
  sessionEvictionStarted(metadata) {
45831
45948
  return {
45832
- type: "SessionEvictionStarted",
45949
+ type: "session:eviction-started",
45833
45950
  time: Date.now(),
45834
45951
  source: "daemon",
45835
45952
  context: {
45836
45953
  sessionId: ""
45837
45954
  },
45838
45955
  payload: {
45839
- metadata
45956
+ intervalMs: metadata.intervalMs
45840
45957
  }
45841
45958
  };
45842
45959
  },
@@ -45847,7 +45964,7 @@ var require_structured_logging = __commonJS({
45847
45964
  */
45848
45965
  statuslineRendered(context, state, metadata) {
45849
45966
  return {
45850
- type: "StatuslineRendered",
45967
+ type: "statusline:rendered",
45851
45968
  time: Date.now(),
45852
45969
  source: "cli",
45853
45970
  context: {
@@ -45858,8 +45975,11 @@ var require_structured_logging = __commonJS({
45858
45975
  taskId: context.taskId
45859
45976
  },
45860
45977
  payload: {
45861
- state,
45862
- metadata
45978
+ displayMode: state.displayMode,
45979
+ staleData: state.staleData,
45980
+ model: metadata.model,
45981
+ tokens: metadata.tokens,
45982
+ durationMs: metadata.durationMs
45863
45983
  }
45864
45984
  };
45865
45985
  },
@@ -45869,7 +45989,7 @@ var require_structured_logging = __commonJS({
45869
45989
  */
45870
45990
  statuslineError(context, reason, metadata) {
45871
45991
  return {
45872
- type: "StatuslineError",
45992
+ type: "statusline:error",
45873
45993
  time: Date.now(),
45874
45994
  source: "cli",
45875
45995
  context: {
@@ -45881,7 +46001,9 @@ var require_structured_logging = __commonJS({
45881
46001
  },
45882
46002
  payload: {
45883
46003
  reason,
45884
- metadata
46004
+ file: metadata.file,
46005
+ fallbackUsed: metadata.fallbackUsed,
46006
+ error: metadata.error
45885
46007
  }
45886
46008
  };
45887
46009
  },
@@ -45892,7 +46014,7 @@ var require_structured_logging = __commonJS({
45892
46014
  */
45893
46015
  resumeGenerating(context, metadata) {
45894
46016
  return {
45895
- type: "ResumeGenerating",
46017
+ type: "resume-message:start",
45896
46018
  time: Date.now(),
45897
46019
  source: "daemon",
45898
46020
  context: {
@@ -45903,8 +46025,8 @@ var require_structured_logging = __commonJS({
45903
46025
  taskId: context.taskId
45904
46026
  },
45905
46027
  payload: {
45906
- metadata,
45907
- reason: "pivot_detected"
46028
+ title_confidence: metadata.title_confidence,
46029
+ intent_confidence: metadata.intent_confidence
45908
46030
  }
45909
46031
  };
45910
46032
  },
@@ -45914,7 +46036,7 @@ var require_structured_logging = __commonJS({
45914
46036
  */
45915
46037
  resumeUpdated(context, state) {
45916
46038
  return {
45917
- type: "ResumeUpdated",
46039
+ type: "resume-message:finish",
45918
46040
  time: Date.now(),
45919
46041
  source: "daemon",
45920
46042
  context: {
@@ -45925,8 +46047,8 @@ var require_structured_logging = __commonJS({
45925
46047
  taskId: context.taskId
45926
46048
  },
45927
46049
  payload: {
45928
- state,
45929
- reason: "generation_complete"
46050
+ snarky_comment: state.snarky_comment,
46051
+ timestamp: state.timestamp
45930
46052
  }
45931
46053
  };
45932
46054
  },
@@ -45936,7 +46058,7 @@ var require_structured_logging = __commonJS({
45936
46058
  */
45937
46059
  resumeSkipped(context, metadata, reason) {
45938
46060
  return {
45939
- type: "ResumeSkipped",
46061
+ type: "resume-message:skipped",
45940
46062
  time: Date.now(),
45941
46063
  source: "daemon",
45942
46064
  context: {
@@ -45947,11 +46069,50 @@ var require_structured_logging = __commonJS({
45947
46069
  taskId: context.taskId
45948
46070
  },
45949
46071
  payload: {
45950
- metadata,
46072
+ title_confidence: metadata.title_confidence,
46073
+ intent_confidence: metadata.intent_confidence,
46074
+ min_confidence: metadata.min_confidence,
45951
46075
  reason
45952
46076
  }
45953
46077
  };
45954
46078
  },
46079
+ // --- Persona Events ---
46080
+ /**
46081
+ * Create a PersonaSelected event (logged when a persona is selected for a session).
46082
+ */
46083
+ personaSelected(context, payload) {
46084
+ return {
46085
+ type: "persona:selected",
46086
+ time: Date.now(),
46087
+ source: "daemon",
46088
+ context: {
46089
+ sessionId: context.sessionId,
46090
+ correlationId: context.correlationId,
46091
+ traceId: context.traceId,
46092
+ hook: context.hook,
46093
+ taskId: context.taskId
46094
+ },
46095
+ payload
46096
+ };
46097
+ },
46098
+ /**
46099
+ * Create a PersonaChanged event (logged when persona changes mid-session).
46100
+ */
46101
+ personaChanged(context, payload) {
46102
+ return {
46103
+ type: "persona:changed",
46104
+ time: Date.now(),
46105
+ source: "daemon",
46106
+ context: {
46107
+ sessionId: context.sessionId,
46108
+ correlationId: context.correlationId,
46109
+ traceId: context.traceId,
46110
+ hook: context.hook,
46111
+ taskId: context.taskId
46112
+ },
46113
+ payload
46114
+ };
46115
+ },
45955
46116
  // --- Transcript Events (logged to transcript-events.log) ---
45956
46117
  /**
45957
46118
  * Create a TranscriptEventEmitted event (logged when TranscriptService emits an event).
@@ -45959,7 +46120,7 @@ var require_structured_logging = __commonJS({
45959
46120
  */
45960
46121
  transcriptEventEmitted(context, state, metadata) {
45961
46122
  return {
45962
- type: "TranscriptEventEmitted",
46123
+ type: "transcript:emitted",
45963
46124
  time: Date.now(),
45964
46125
  source: "transcript",
45965
46126
  context: {
@@ -45970,8 +46131,13 @@ var require_structured_logging = __commonJS({
45970
46131
  taskId: context.taskId
45971
46132
  },
45972
46133
  payload: {
45973
- state,
45974
- metadata
46134
+ eventType: state.eventType,
46135
+ lineNumber: state.lineNumber,
46136
+ uuid: state.uuid,
46137
+ toolName: state.toolName,
46138
+ transcriptPath: metadata.transcriptPath,
46139
+ contentPreview: metadata.contentPreview,
46140
+ metrics: metadata.metrics
45975
46141
  }
45976
46142
  };
45977
46143
  },
@@ -45981,7 +46147,7 @@ var require_structured_logging = __commonJS({
45981
46147
  */
45982
46148
  preCompactCaptured(context, state, metadata) {
45983
46149
  return {
45984
- type: "PreCompactCaptured",
46150
+ type: "transcript:pre-compact",
45985
46151
  time: Date.now(),
45986
46152
  source: "transcript",
45987
46153
  context: {
@@ -45992,18 +46158,67 @@ var require_structured_logging = __commonJS({
45992
46158
  taskId: context.taskId
45993
46159
  },
45994
46160
  payload: {
45995
- state,
45996
- metadata,
45997
- reason: "pre_compact_hook"
46161
+ snapshotPath: state.snapshotPath,
46162
+ lineCount: state.lineCount,
46163
+ transcriptPath: metadata.transcriptPath,
46164
+ metrics: metadata.metrics
46165
+ }
46166
+ };
46167
+ },
46168
+ // --- Error Events ---
46169
+ /**
46170
+ * Create a daemon ErrorOccurred event.
46171
+ * @see packages/sidekick-daemon/src/daemon.ts — HookableLogger error hook calls this factory.
46172
+ */
46173
+ daemonErrorOccurred(context, state) {
46174
+ return {
46175
+ type: "error:occurred",
46176
+ time: Date.now(),
46177
+ source: "daemon",
46178
+ context: {
46179
+ sessionId: context.sessionId,
46180
+ correlationId: context.correlationId,
46181
+ traceId: context.traceId,
46182
+ hook: context.hook,
46183
+ taskId: context.taskId
46184
+ },
46185
+ payload: {
46186
+ errorMessage: state.errorMessage,
46187
+ errorStack: state.errorStack
46188
+ }
46189
+ };
46190
+ },
46191
+ /**
46192
+ * Create a CLI ErrorOccurred event.
46193
+ * Available for CLI error hook implementations.
46194
+ */
46195
+ cliErrorOccurred(context, state) {
46196
+ return {
46197
+ type: "error:occurred",
46198
+ time: Date.now(),
46199
+ source: "cli",
46200
+ context: {
46201
+ sessionId: context.sessionId,
46202
+ correlationId: context.correlationId,
46203
+ traceId: context.traceId,
46204
+ hook: context.hook,
46205
+ taskId: context.taskId
46206
+ },
46207
+ payload: {
46208
+ errorMessage: state.errorMessage,
46209
+ errorStack: state.errorStack
45998
46210
  }
45999
46211
  };
46000
46212
  }
46001
46213
  };
46002
46214
  function logEvent(logger, event) {
46003
- logger.info(event.payload.reason ?? `${event.type}`, {
46215
+ const payload = event.payload;
46216
+ const meta = payload != null && typeof payload === "object" ? payload : {};
46217
+ const reason = "reason" in meta ? String(meta.reason) : void 0;
46218
+ logger.info(reason ?? `${event.type}`, {
46004
46219
  type: event.type,
46005
46220
  source: event.source,
46006
- ...event.payload
46221
+ ...meta
46007
46222
  });
46008
46223
  }
46009
46224
  function setupGlobalErrorHandlers(logger) {
@@ -58040,7 +58255,7 @@ var require_staging_service = __commonJS({
58040
58255
  *
58041
58256
  * @throws Error if hookName or reminderName contain path traversal characters
58042
58257
  */
58043
- async stageReminder(sessionId, hookName, reminderName, data) {
58258
+ async stageReminder(sessionId, hookName, reminderName, data, enrichment) {
58044
58259
  (0, staging_paths_js_1.validatePathSegment)(hookName, "hookName");
58045
58260
  (0, staging_paths_js_1.validatePathSegment)(reminderName, "reminderName");
58046
58261
  const hookDir = this.getHookDirPath(sessionId, hookName);
@@ -58069,7 +58284,8 @@ var require_staging_service = __commonJS({
58069
58284
  hookName,
58070
58285
  blocking: data.blocking,
58071
58286
  priority: data.priority,
58072
- persistent: data.persistent
58287
+ persistent: data.persistent,
58288
+ ...enrichment
58073
58289
  }, { stagingPath: reminderPath });
58074
58290
  (0, structured_logging_1.logEvent)(this.options.logger, event);
58075
58291
  }
@@ -58213,8 +58429,8 @@ var require_staging_service = __commonJS({
58213
58429
  // ============================================================================
58214
58430
  // StagingService Interface Implementation (delegates to core)
58215
58431
  // ============================================================================
58216
- async stageReminder(hookName, reminderName, data) {
58217
- return this.core.stageReminder(this.sessionId, hookName, reminderName, data);
58432
+ async stageReminder(hookName, reminderName, data, enrichment) {
58433
+ return this.core.stageReminder(this.sessionId, hookName, reminderName, data, enrichment);
58218
58434
  }
58219
58435
  async readReminder(hookName, reminderName) {
58220
58436
  return this.core.readReminder(this.sessionId, hookName, reminderName);
@@ -61136,7 +61352,7 @@ var require_log_metrics_descriptors = __commonJS({
61136
61352
  });
61137
61353
 
61138
61354
  // ../sidekick-core/dist/state/index.js
61139
- var require_state2 = __commonJS({
61355
+ var require_state3 = __commonJS({
61140
61356
  "../sidekick-core/dist/state/index.js"(exports2) {
61141
61357
  "use strict";
61142
61358
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -61235,7 +61451,7 @@ var require_transcript_service = __commonJS({
61235
61451
  var node_readline_12 = require("node:readline");
61236
61452
  var node_path_1 = require("node:path");
61237
61453
  var structured_logging_js_1 = require_structured_logging();
61238
- var index_js_1 = require_state2();
61454
+ var index_js_1 = require_state3();
61239
61455
  var EXCLUDED_BUILTIN_COMMANDS = /* @__PURE__ */ new Set([
61240
61456
  "/add-dir",
61241
61457
  "/agents",
@@ -63205,6 +63421,120 @@ var require_hookable_logger = __commonJS({
63205
63421
  }
63206
63422
  });
63207
63423
 
63424
+ // ../sidekick-core/dist/project-registry.js
63425
+ var require_project_registry = __commonJS({
63426
+ "../sidekick-core/dist/project-registry.js"(exports2) {
63427
+ "use strict";
63428
+ var __importDefault2 = exports2 && exports2.__importDefault || function(mod) {
63429
+ return mod && mod.__esModule ? mod : { "default": mod };
63430
+ };
63431
+ Object.defineProperty(exports2, "__esModule", { value: true });
63432
+ exports2.ProjectRegistryService = void 0;
63433
+ exports2.encodeProjectDir = encodeProjectDir;
63434
+ var node_fs_1 = require("node:fs");
63435
+ var promises_12 = __importDefault2(require("node:fs/promises"));
63436
+ var node_crypto_1 = require("node:crypto");
63437
+ var node_path_1 = require("node:path");
63438
+ var types_1 = require_dist();
63439
+ function encodeProjectDir(absPath) {
63440
+ return absPath.replace(/\//g, "-");
63441
+ }
63442
+ var REGISTRY_FILE = "registry.json";
63443
+ var ProjectRegistryService = class {
63444
+ registryRoot;
63445
+ constructor(registryRoot) {
63446
+ this.registryRoot = registryRoot;
63447
+ }
63448
+ /**
63449
+ * Register or update a project in the registry.
63450
+ * Creates the directory and writes registry.json with current timestamp.
63451
+ */
63452
+ async register(projectDir) {
63453
+ const encoded = encodeProjectDir(projectDir);
63454
+ const entryDir = (0, node_path_1.join)(this.registryRoot, encoded);
63455
+ const entryFile = (0, node_path_1.join)(entryDir, REGISTRY_FILE);
63456
+ await promises_12.default.mkdir(entryDir, { recursive: true });
63457
+ const entry = {
63458
+ path: projectDir,
63459
+ displayName: (0, node_path_1.basename)(projectDir),
63460
+ lastActive: (/* @__PURE__ */ new Date()).toISOString()
63461
+ };
63462
+ const tmpPath = `${entryFile}.${(0, node_crypto_1.randomBytes)(6).toString("hex")}.tmp`;
63463
+ try {
63464
+ await promises_12.default.writeFile(tmpPath, JSON.stringify(entry, null, 2), "utf-8");
63465
+ await promises_12.default.rename(tmpPath, entryFile);
63466
+ } catch (err) {
63467
+ await promises_12.default.unlink(tmpPath).catch(() => {
63468
+ });
63469
+ throw err;
63470
+ }
63471
+ }
63472
+ /**
63473
+ * List all valid registered projects.
63474
+ * Skips entries with missing/invalid registry.json.
63475
+ */
63476
+ async list() {
63477
+ if (!(0, node_fs_1.existsSync)(this.registryRoot)) {
63478
+ return [];
63479
+ }
63480
+ const entries = [];
63481
+ const dirents = await promises_12.default.readdir(this.registryRoot, { withFileTypes: true });
63482
+ for (const dirent of dirents) {
63483
+ if (!dirent.isDirectory())
63484
+ continue;
63485
+ const entryFile = (0, node_path_1.join)(this.registryRoot, dirent.name, REGISTRY_FILE);
63486
+ try {
63487
+ const raw = await promises_12.default.readFile(entryFile, "utf-8");
63488
+ const parsed = types_1.ProjectRegistryEntrySchema.parse(JSON.parse(raw));
63489
+ entries.push(parsed);
63490
+ } catch {
63491
+ }
63492
+ }
63493
+ return entries;
63494
+ }
63495
+ /**
63496
+ * Prune stale registry entries.
63497
+ * Removes entries where the project path no longer exists
63498
+ * or lastActive is older than retentionDays.
63499
+ */
63500
+ async prune(options) {
63501
+ if (!(0, node_fs_1.existsSync)(this.registryRoot)) {
63502
+ return [];
63503
+ }
63504
+ const pruned = [];
63505
+ const cutoff = Date.now() - options.retentionDays * 24 * 60 * 60 * 1e3;
63506
+ const dirents = await promises_12.default.readdir(this.registryRoot, { withFileTypes: true });
63507
+ for (const dirent of dirents) {
63508
+ if (!dirent.isDirectory())
63509
+ continue;
63510
+ const entryDir = (0, node_path_1.join)(this.registryRoot, dirent.name);
63511
+ const entryFile = (0, node_path_1.join)(entryDir, REGISTRY_FILE);
63512
+ let entry;
63513
+ try {
63514
+ const raw = await promises_12.default.readFile(entryFile, "utf-8");
63515
+ entry = types_1.ProjectRegistryEntrySchema.parse(JSON.parse(raw));
63516
+ } catch {
63517
+ await promises_12.default.rm(entryDir, { recursive: true, force: true });
63518
+ continue;
63519
+ }
63520
+ let reason = null;
63521
+ if (!(0, node_fs_1.existsSync)(entry.path)) {
63522
+ reason = "path-missing";
63523
+ } else if (new Date(entry.lastActive).getTime() < cutoff) {
63524
+ reason = "age-exceeded";
63525
+ }
63526
+ if (reason) {
63527
+ await promises_12.default.rm(entryDir, { recursive: true, force: true });
63528
+ pruned.push({ path: entry.path, reason });
63529
+ }
63530
+ }
63531
+ return pruned;
63532
+ }
63533
+ };
63534
+ exports2.ProjectRegistryService = ProjectRegistryService;
63535
+ }
63536
+ });
63537
+
63208
63538
  // ../sidekick-core/dist/daemon-health.js
63209
63539
  var require_daemon_health = __commonJS({
63210
63540
  "../sidekick-core/dist/daemon-health.js"(exports2) {
@@ -63448,7 +63778,7 @@ var require_dist4 = __commonJS({
63448
63778
  };
63449
63779
  Object.defineProperty(exports2, "__esModule", { value: true });
63450
63780
  exports2.SIDEKICK_SECTION_START = exports2.detectGitignoreStatus = exports2.removeGitignoreSection = exports2.installGitignoreSection = exports2.validateOpenAIKey = exports2.validateOpenRouterKey = exports2.createSetupStatusService = exports2.SetupStatusService = exports2.DaemonClient = exports2.findZombieDaemons = exports2.killZombieDaemons = exports2.killAllDaemons = exports2.logEvent = exports2.LogEvents = exports2.DEFAULT_MAX_FILES = exports2.DEFAULT_ROTATE_SIZE_BYTES = exports2.getComponentLogLevel = exports2.setupGlobalErrorHandlers = exports2.createLoggerFacade = exports2.createLogManager = exports2.createConsoleLogger = exports2.getUserDaemonsDir = exports2.getUserPidPath = exports2.getTokenPath = exports2.getSocketPath = exports2.getProjectHash = exports2.getPidPath = exports2.getLockPath = exports2.IpcService = exports2.IpcServer = exports2.loadPersonaFile = exports2.getDefaultPersonasDir = exports2.discoverPersonas = exports2.createPersonaLoader = exports2.reconstructTranscriptPath = exports2.encodeProjectPath = exports2.isPreCompactEvent = exports2.isStopEvent = exports2.isPostToolUseEvent = exports2.isPreToolUseEvent = exports2.isUserPromptSubmitEvent = exports2.isSessionEndEvent = exports2.isSessionStartEvent = exports2.isTranscriptEvent = exports2.isHookEvent = exports2.MetricsPersistPayloadSchema = exports2.CleanupPayloadSchema = exports2.ResumeGenerationPayloadSchema = exports2.SessionSummaryPayloadSchema = exports2.TaskTypes = void 0;
63451
- exports2.loadUserProfile = exports2.parseGitStatusOutput = exports2.getGitFileStatus = exports2.isInSandbox = exports2.updateDaemonHealth = exports2.readDaemonHealth = exports2.DaemonGlobalLogMetricsDescriptor = exports2.CliLogMetricsDescriptor = exports2.DaemonLogMetricsDescriptor = exports2.CompactionHistoryDescriptor = exports2.TranscriptMetricsDescriptor = exports2.GlobalStateAccessor = exports2.SessionStateAccessor = exports2.globalState = exports2.sessionState = exports2.StateCorruptError = exports2.StateNotFoundError = exports2.StateService = exports2.createHookableLogger = exports2.InstrumentedProfileProviderFactory = exports2.InstrumentedLLMProvider = exports2.ServiceFactoryImpl = exports2.TranscriptServiceImpl = exports2.createDefaultTokenUsage = exports2.createDefaultMetrics = exports2.copyWithTimestampSync = exports2.renameWithTimestampSync = exports2.renameWithTimestamp = exports2.copyWithTimestamp = exports2.getTimestampedPath = exports2.extractToolResultPreview = exports2.extractToolCallPreview = exports2.extractTextFromContent = exports2.extractContentPreview = exports2.HandlerRegistryImpl = exports2.extractConsumedTimestamp = exports2.createConsumedFilePattern = exports2.CONSUMED_FILE_PATTERN = exports2.filterActiveReminderFiles = exports2.validatePathSegment = exports2.isValidPathSegment = exports2.getReminderPath = exports2.getHookDir = exports2.getStagingRoot = exports2.SessionScopedStagingService = exports2.StagingServiceCore = exports2.GITIGNORE_ENTRIES = exports2.SIDEKICK_SECTION_END = void 0;
63781
+ exports2.loadUserProfile = exports2.parseGitStatusOutput = exports2.getGitFileStatus = exports2.isInSandbox = exports2.updateDaemonHealth = exports2.readDaemonHealth = exports2.ProjectRegistryService = exports2.encodeProjectDir = exports2.DaemonGlobalLogMetricsDescriptor = exports2.CliLogMetricsDescriptor = exports2.DaemonLogMetricsDescriptor = exports2.CompactionHistoryDescriptor = exports2.TranscriptMetricsDescriptor = exports2.GlobalStateAccessor = exports2.SessionStateAccessor = exports2.globalState = exports2.sessionState = exports2.StateCorruptError = exports2.StateNotFoundError = exports2.StateService = exports2.createHookableLogger = exports2.InstrumentedProfileProviderFactory = exports2.InstrumentedLLMProvider = exports2.ServiceFactoryImpl = exports2.TranscriptServiceImpl = exports2.createDefaultTokenUsage = exports2.createDefaultMetrics = exports2.copyWithTimestampSync = exports2.renameWithTimestampSync = exports2.renameWithTimestamp = exports2.copyWithTimestamp = exports2.getTimestampedPath = exports2.extractToolResultPreview = exports2.extractToolCallPreview = exports2.extractTextFromContent = exports2.extractContentPreview = exports2.HandlerRegistryImpl = exports2.extractConsumedTimestamp = exports2.createConsumedFilePattern = exports2.CONSUMED_FILE_PATTERN = exports2.filterActiveReminderFiles = exports2.validatePathSegment = exports2.isValidPathSegment = exports2.getReminderPath = exports2.getHookDir = exports2.getStagingRoot = exports2.SessionScopedStagingService = exports2.StagingServiceCore = exports2.GITIGNORE_ENTRIES = exports2.SIDEKICK_SECTION_END = void 0;
63452
63782
  var types_1 = require_dist();
63453
63783
  Object.defineProperty(exports2, "TaskTypes", { enumerable: true, get: function() {
63454
63784
  return types_1.TaskTypes;
@@ -63721,7 +64051,7 @@ var require_dist4 = __commonJS({
63721
64051
  Object.defineProperty(exports2, "createHookableLogger", { enumerable: true, get: function() {
63722
64052
  return hookable_logger_1.createHookableLogger;
63723
64053
  } });
63724
- var index_js_1 = require_state2();
64054
+ var index_js_1 = require_state3();
63725
64055
  Object.defineProperty(exports2, "StateService", { enumerable: true, get: function() {
63726
64056
  return index_js_1.StateService;
63727
64057
  } });
@@ -63758,6 +64088,13 @@ var require_dist4 = __commonJS({
63758
64088
  Object.defineProperty(exports2, "DaemonGlobalLogMetricsDescriptor", { enumerable: true, get: function() {
63759
64089
  return index_js_1.DaemonGlobalLogMetricsDescriptor;
63760
64090
  } });
64091
+ var project_registry_1 = require_project_registry();
64092
+ Object.defineProperty(exports2, "encodeProjectDir", { enumerable: true, get: function() {
64093
+ return project_registry_1.encodeProjectDir;
64094
+ } });
64095
+ Object.defineProperty(exports2, "ProjectRegistryService", { enumerable: true, get: function() {
64096
+ return project_registry_1.ProjectRegistryService;
64097
+ } });
63761
64098
  var daemon_health_1 = require_daemon_health();
63762
64099
  Object.defineProperty(exports2, "readDaemonHealth", { enumerable: true, get: function() {
63763
64100
  return daemon_health_1.readDaemonHealth;
@@ -70982,7 +71319,6 @@ var require_reminder_utils = __commonJS({
70982
71319
  blocking: zod_1.z.boolean(),
70983
71320
  priority: zod_1.z.number(),
70984
71321
  persistent: zod_1.z.boolean(),
70985
- throttle: zod_1.z.boolean().optional(),
70986
71322
  userMessage: zod_1.z.string().optional(),
70987
71323
  additionalContext: zod_1.z.string().optional(),
70988
71324
  reason: zod_1.z.string().optional()
@@ -71033,7 +71369,6 @@ var require_reminder_utils = __commonJS({
71033
71369
  blocking: def.blocking,
71034
71370
  priority: def.priority,
71035
71371
  persistent: def.persistent,
71036
- throttle: def.throttle,
71037
71372
  userMessage: def.userMessage ? interpolateTemplate(def.userMessage, context) : void 0,
71038
71373
  additionalContext: def.additionalContext ? interpolateTemplate(def.additionalContext, context) : void 0,
71039
71374
  reason: def.reason ? interpolateTemplate(def.reason, context) : void 0
@@ -71043,8 +71378,8 @@ var require_reminder_utils = __commonJS({
71043
71378
  return null;
71044
71379
  }
71045
71380
  }
71046
- async function stageReminder(ctx, hookName, reminder) {
71047
- await ctx.staging.stageReminder(hookName, reminder.name, reminder);
71381
+ async function stageReminder(ctx, hookName, reminder, enrichment) {
71382
+ await ctx.staging.stageReminder(hookName, reminder.name, reminder, enrichment);
71048
71383
  ctx.logger.debug("Staged reminder", { hookName, reminderName: reminder.name, priority: reminder.priority });
71049
71384
  }
71050
71385
  async function consumeReminder(ctx, hookName) {
@@ -71358,7 +71693,7 @@ var require_types2 = __commonJS({
71358
71693
  });
71359
71694
 
71360
71695
  // ../feature-reminders/dist/state.js
71361
- var require_state3 = __commonJS({
71696
+ var require_state4 = __commonJS({
71362
71697
  "../feature-reminders/dist/state.js"(exports2) {
71363
71698
  "use strict";
71364
71699
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -71399,7 +71734,7 @@ var require_throttle_utils = __commonJS({
71399
71734
  Object.defineProperty(exports2, "__esModule", { value: true });
71400
71735
  exports2.registerThrottledReminder = registerThrottledReminder;
71401
71736
  exports2.resetThrottleCounters = resetThrottleCounters;
71402
- var state_js_1 = require_state3();
71737
+ var state_js_1 = require_state4();
71403
71738
  async function registerThrottledReminder(ctx, sessionId, reminderId, targetHook, resolvedReminder) {
71404
71739
  const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
71405
71740
  const result = await remindersState.reminderThrottle.read(sessionId);
@@ -71434,7 +71769,7 @@ var require_stage_default_user_prompt = __commonJS({
71434
71769
  var staging_handler_utils_js_1 = require_staging_handler_utils();
71435
71770
  var types_js_1 = require_types2();
71436
71771
  var reminder_utils_js_1 = require_reminder_utils();
71437
- var state_js_1 = require_state3();
71772
+ var state_js_1 = require_state4();
71438
71773
  var throttle_utils_js_1 = require_throttle_utils();
71439
71774
  function registerStageDefaultUserPrompt(context) {
71440
71775
  (0, staging_handler_utils_js_1.createStagingHandler)(context, {
@@ -71590,16 +71925,128 @@ var require_stage_default_user_prompt = __commonJS({
71590
71925
  }
71591
71926
  });
71592
71927
 
71928
+ // ../feature-reminders/dist/events.js
71929
+ var require_events2 = __commonJS({
71930
+ "../feature-reminders/dist/events.js"(exports2) {
71931
+ "use strict";
71932
+ Object.defineProperty(exports2, "__esModule", { value: true });
71933
+ exports2.ReminderEvents = void 0;
71934
+ exports2.ReminderEvents = {
71935
+ /**
71936
+ * Create a ReminderConsumed event (logged when CLI returns a staged reminder).
71937
+ */
71938
+ reminderConsumed(context, state, _metadata) {
71939
+ return {
71940
+ type: "reminder:consumed",
71941
+ time: Date.now(),
71942
+ source: "cli",
71943
+ context: {
71944
+ sessionId: context.sessionId,
71945
+ correlationId: context.correlationId,
71946
+ traceId: context.traceId,
71947
+ hook: context.hook,
71948
+ taskId: context.taskId
71949
+ },
71950
+ payload: {
71951
+ reminderName: state.reminderName,
71952
+ reminderReturned: state.reminderReturned,
71953
+ blocking: state.blocking,
71954
+ priority: state.priority,
71955
+ persistent: state.persistent,
71956
+ ...state.classificationResult !== void 0 && {
71957
+ classificationResult: state.classificationResult
71958
+ }
71959
+ }
71960
+ };
71961
+ },
71962
+ // Note: reminderStaged stays in @sidekick/core (used by staging-service.ts, circular dep)
71963
+ /**
71964
+ * Create a ReminderUnstaged event (logged when a reminder is removed from staging).
71965
+ */
71966
+ reminderUnstaged(context, state) {
71967
+ return {
71968
+ type: "reminder:unstaged",
71969
+ time: Date.now(),
71970
+ source: "daemon",
71971
+ context: {
71972
+ sessionId: context.sessionId,
71973
+ correlationId: context.correlationId,
71974
+ traceId: context.traceId,
71975
+ hook: context.hook,
71976
+ taskId: context.taskId
71977
+ },
71978
+ payload: {
71979
+ reminderName: state.reminderName,
71980
+ hookName: state.hookName,
71981
+ reason: state.reason,
71982
+ ...state.triggeredBy !== void 0 && { triggeredBy: state.triggeredBy },
71983
+ ...state.toolState !== void 0 && { toolState: state.toolState }
71984
+ }
71985
+ };
71986
+ },
71987
+ /**
71988
+ * Create a RemindersCleared event (logged when staging directory is cleaned).
71989
+ */
71990
+ remindersCleared(context, state, reason) {
71991
+ return {
71992
+ type: "reminder:cleared",
71993
+ time: Date.now(),
71994
+ source: "daemon",
71995
+ context: {
71996
+ sessionId: context.sessionId,
71997
+ correlationId: context.correlationId,
71998
+ traceId: context.traceId,
71999
+ hook: context.hook,
72000
+ taskId: context.taskId
72001
+ },
72002
+ payload: {
72003
+ clearedCount: state.clearedCount,
72004
+ hookNames: state.hookNames,
72005
+ reason
72006
+ }
72007
+ };
72008
+ },
72009
+ /**
72010
+ * Create a ReminderNotStaged event (logged when daemon evaluates but decides not to stage).
72011
+ */
72012
+ reminderNotStaged(context, state) {
72013
+ return {
72014
+ type: "reminder:not-staged",
72015
+ time: Date.now(),
72016
+ source: "daemon",
72017
+ context: {
72018
+ sessionId: context.sessionId,
72019
+ correlationId: context.correlationId,
72020
+ traceId: context.traceId,
72021
+ hook: context.hook,
72022
+ taskId: context.taskId
72023
+ },
72024
+ payload: {
72025
+ reminderName: state.reminderName,
72026
+ hookName: state.hookName,
72027
+ reason: state.reason,
72028
+ ...state.threshold !== void 0 && { threshold: state.threshold },
72029
+ ...state.currentValue !== void 0 && { currentValue: state.currentValue },
72030
+ ...state.triggeredBy !== void 0 && { triggeredBy: state.triggeredBy }
72031
+ }
72032
+ };
72033
+ }
72034
+ };
72035
+ }
72036
+ });
72037
+
71593
72038
  // ../feature-reminders/dist/handlers/staging/stage-pause-and-reflect.js
71594
72039
  var require_stage_pause_and_reflect = __commonJS({
71595
72040
  "../feature-reminders/dist/handlers/staging/stage-pause-and-reflect.js"(exports2) {
71596
72041
  "use strict";
71597
72042
  Object.defineProperty(exports2, "__esModule", { value: true });
71598
72043
  exports2.registerStagePauseAndReflect = registerStagePauseAndReflect;
72044
+ var core_1 = require_dist4();
71599
72045
  var types_1 = require_dist();
72046
+ var events_js_1 = require_events2();
71600
72047
  var staging_handler_utils_js_1 = require_staging_handler_utils();
71601
72048
  var types_js_1 = require_types2();
71602
- var state_js_1 = require_state3();
72049
+ var state_js_1 = require_state4();
71603
72050
  function registerStagePauseAndReflect(context) {
71604
72051
  (0, staging_handler_utils_js_1.createStagingHandler)(context, {
71605
72052
  id: "reminders:stage-pause-and-reflect",
@@ -71610,15 +72057,17 @@ var require_stage_pause_and_reflect = __commonJS({
71610
72057
  return void 0;
71611
72058
  const metrics = event.metadata.metrics;
71612
72059
  const sessionId = event.context?.sessionId;
72060
+ if (!sessionId) {
72061
+ ctx.logger.warn("[stage-pause-and-reflect] No sessionId available, skipping");
72062
+ return void 0;
72063
+ }
71613
72064
  const featureConfig = context.config.getFeature("reminders");
71614
72065
  const config = { ...types_js_1.DEFAULT_REMINDERS_SETTINGS, ...featureConfig.settings };
71615
72066
  let prBaseline = null;
71616
- if (sessionId) {
71617
- const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
71618
- const result = await remindersState.prBaseline.read(sessionId);
71619
- if (result.source !== "default") {
71620
- prBaseline = result.data;
71621
- }
72067
+ const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
72068
+ const result = await remindersState.prBaseline.read(sessionId);
72069
+ if (result.source !== "default") {
72070
+ prBaseline = result.data;
71622
72071
  }
71623
72072
  let effectiveBaseline = 0;
71624
72073
  if (prBaseline && prBaseline.turnCount === metrics.turnCount) {
@@ -71630,12 +72079,28 @@ var require_stage_pause_and_reflect = __commonJS({
71630
72079
  effectiveBaseline = Math.max(effectiveBaseline, lastConsumed.stagedAt.toolsThisTurn);
71631
72080
  }
71632
72081
  const shouldReactivate = metrics.turnCount > lastConsumed.stagedAt.turnCount || metrics.toolsThisTurn >= effectiveBaseline + config.pause_and_reflect_threshold;
71633
- if (!shouldReactivate)
72082
+ if (!shouldReactivate) {
72083
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
72084
+ reminderName: "pause-and-reflect",
72085
+ hookName: "PreToolUse",
72086
+ reason: "same_turn",
72087
+ triggeredBy: "tool_result"
72088
+ }));
71634
72089
  return void 0;
72090
+ }
71635
72091
  }
71636
72092
  const toolsSinceBaseline = metrics.toolsThisTurn - effectiveBaseline;
71637
- if (toolsSinceBaseline < config.pause_and_reflect_threshold)
72093
+ if (toolsSinceBaseline < config.pause_and_reflect_threshold) {
72094
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
72095
+ reminderName: "pause-and-reflect",
72096
+ hookName: "PreToolUse",
72097
+ reason: "below_threshold",
72098
+ threshold: config.pause_and_reflect_threshold,
72099
+ currentValue: toolsSinceBaseline,
72100
+ triggeredBy: "tool_result"
72101
+ }));
71638
72102
  return void 0;
72103
+ }
71639
72104
  return {
71640
72105
  reminderId: types_js_1.ReminderIds.PAUSE_AND_REFLECT,
71641
72106
  targetHook: "PreToolUse",
@@ -73217,12 +73682,14 @@ var require_track_verification_tools = __commonJS({
73217
73682
  Object.defineProperty(exports2, "__esModule", { value: true });
73218
73683
  exports2.registerTrackVerificationTools = registerTrackVerificationTools;
73219
73684
  exports2.stageToolsForFiles = stageToolsForFiles;
73685
+ var core_1 = require_dist4();
73686
+ var events_js_1 = require_events2();
73220
73687
  var types_1 = require_dist();
73221
73688
  var picomatch_1 = __importDefault2(require_picomatch2());
73222
73689
  var tool_pattern_matcher_js_1 = require_tool_pattern_matcher();
73223
73690
  var reminder_utils_js_1 = require_reminder_utils();
73224
73691
  var types_js_1 = require_types2();
73225
- var state_js_1 = require_state3();
73692
+ var state_js_1 = require_state4();
73226
73693
  var FILE_EDIT_TOOLS = ["Write", "Edit", "MultiEdit"];
73227
73694
  var TOOL_REMINDER_MAP = {
73228
73695
  build: types_js_1.ReminderIds.VC_BUILD,
@@ -73270,22 +73737,48 @@ var require_track_verification_tools = __commonJS({
73270
73737
  }
73271
73738
  });
73272
73739
  }
73273
- async function stageToolsForFiles(filePaths, daemonCtx, sessionId, verificationTools, toolsState, remindersState) {
73740
+ async function stageToolsForFiles(filePaths, daemonCtx, sessionId, verificationTools, toolsState, remindersState, triggeredBy = "file_edit") {
73274
73741
  const existingReminders = await daemonCtx.staging.listReminders("Stop");
73275
73742
  const stagedNames = new Set(existingReminders.map((r) => r.name));
73276
73743
  let anyStaged = false;
73744
+ const emittedNotStaged = /* @__PURE__ */ new Set();
73277
73745
  for (const filePath of filePaths) {
73278
73746
  for (const [toolName, toolConfig] of Object.entries(verificationTools)) {
73279
- if (!toolConfig.enabled)
73280
- continue;
73281
73747
  const reminderId = TOOL_REMINDER_MAP[toolName];
73282
73748
  if (!reminderId)
73283
73749
  continue;
73284
- if (!picomatch_1.default.isMatch(filePath, toolConfig.clearing_patterns))
73750
+ if (!toolConfig.enabled) {
73751
+ const emitKey = `${reminderId}:feature_disabled`;
73752
+ if (!emittedNotStaged.has(emitKey)) {
73753
+ emittedNotStaged.add(emitKey);
73754
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
73755
+ reminderName: reminderId,
73756
+ hookName: "Stop",
73757
+ reason: "feature_disabled",
73758
+ triggeredBy
73759
+ }));
73760
+ }
73285
73761
  continue;
73762
+ }
73763
+ if (!picomatch_1.default.isMatch(filePath, toolConfig.clearing_patterns)) {
73764
+ const emitKey = `${reminderId}:pattern_mismatch`;
73765
+ if (!emittedNotStaged.has(emitKey)) {
73766
+ emittedNotStaged.add(emitKey);
73767
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
73768
+ reminderName: reminderId,
73769
+ hookName: "Stop",
73770
+ reason: "pattern_mismatch",
73771
+ triggeredBy
73772
+ }));
73773
+ }
73774
+ continue;
73775
+ }
73286
73776
  const current = toolsState[toolName];
73287
73777
  if (!current || current.status === "staged") {
73288
- const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames);
73778
+ const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames, {
73779
+ reason: current ? "re-staged" : "initial",
73780
+ triggeredBy: "file_edit"
73781
+ });
73289
73782
  if (staged) {
73290
73783
  if (!current) {
73291
73784
  toolsState[toolName] = {
@@ -73301,7 +73794,11 @@ var require_track_verification_tools = __commonJS({
73301
73794
  } else {
73302
73795
  const newEdits = current.editsSinceVerified + 1;
73303
73796
  if (newEdits >= toolConfig.clearing_threshold) {
73304
- const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames);
73797
+ const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames, {
73798
+ reason: "threshold_reached",
73799
+ triggeredBy: "file_edit",
73800
+ thresholdState: { current: newEdits, threshold: toolConfig.clearing_threshold }
73801
+ });
73305
73802
  if (staged) {
73306
73803
  toolsState[toolName] = {
73307
73804
  ...current,
@@ -73318,6 +73815,14 @@ var require_track_verification_tools = __commonJS({
73318
73815
  status: "cooldown",
73319
73816
  editsSinceVerified: newEdits
73320
73817
  };
73818
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
73819
+ reminderName: reminderId,
73820
+ hookName: "Stop",
73821
+ reason: "below_threshold",
73822
+ threshold: toolConfig.clearing_threshold,
73823
+ currentValue: newEdits,
73824
+ triggeredBy
73825
+ }));
73321
73826
  }
73322
73827
  }
73323
73828
  }
@@ -73363,6 +73868,16 @@ var require_track_verification_tools = __commonJS({
73363
73868
  lastMatchedScope: match.scope
73364
73869
  };
73365
73870
  await daemonCtx.staging.deleteReminder("Stop", reminderId);
73871
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, {
73872
+ reminderName: reminderId,
73873
+ hookName: "Stop",
73874
+ reason: "tool_verified",
73875
+ triggeredBy: "verification_passed",
73876
+ toolState: {
73877
+ status: toolsState[toolName].status,
73878
+ editsSinceVerified: toolsState[toolName].editsSinceVerified
73879
+ }
73880
+ }));
73366
73881
  anyUnstaged = true;
73367
73882
  daemonCtx.logger.debug("VC tool verified", {
73368
73883
  toolName,
@@ -73377,12 +73892,18 @@ var require_track_verification_tools = __commonJS({
73377
73892
  const hasPerToolReminders = remaining.some((r) => VC_TOOL_NAME_SET.has(r.name));
73378
73893
  if (!hasPerToolReminders) {
73379
73894
  await daemonCtx.staging.deleteReminder("Stop", types_js_1.ReminderIds.VERIFY_COMPLETION);
73895
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, {
73896
+ reminderName: types_js_1.ReminderIds.VERIFY_COMPLETION,
73897
+ hookName: "Stop",
73898
+ reason: "all_tools_verified",
73899
+ triggeredBy: "verification_passed"
73900
+ }));
73380
73901
  daemonCtx.logger.info("All VC tools verified, unstaged wrapper", { sessionId });
73381
73902
  }
73382
73903
  await remindersState.verificationTools.write(sessionId, toolsState);
73383
73904
  }
73384
73905
  }
73385
- async function ensureToolReminderStaged(daemonCtx, reminderId, stagedNames) {
73906
+ async function ensureToolReminderStaged(daemonCtx, reminderId, stagedNames, enrichment) {
73386
73907
  if (stagedNames.has(reminderId))
73387
73908
  return true;
73388
73909
  const reminder = (0, reminder_utils_js_1.resolveReminder)(reminderId, {
@@ -73396,7 +73917,7 @@ var require_track_verification_tools = __commonJS({
73396
73917
  await (0, reminder_utils_js_1.stageReminder)(daemonCtx, "Stop", {
73397
73918
  ...reminder,
73398
73919
  stagedAt: { timestamp: Date.now(), turnCount: 0, toolsThisTurn: 0, toolCount: 0 }
73399
- });
73920
+ }, enrichment);
73400
73921
  return true;
73401
73922
  }
73402
73923
  }
@@ -73412,11 +73933,12 @@ var require_stage_stop_bash_changes = __commonJS({
73412
73933
  Object.defineProperty(exports2, "__esModule", { value: true });
73413
73934
  exports2.registerStageBashChanges = registerStageBashChanges;
73414
73935
  var core_1 = require_dist4();
73936
+ var events_js_1 = require_events2();
73415
73937
  var types_1 = require_dist();
73416
73938
  var picomatch_1 = __importDefault2(require_picomatch2());
73417
73939
  var track_verification_tools_js_1 = require_track_verification_tools();
73418
73940
  var types_js_1 = require_types2();
73419
- var state_js_1 = require_state3();
73941
+ var state_js_1 = require_state4();
73420
73942
  var GIT_STATUS_TIMEOUT_MS = 200;
73421
73943
  var MAX_BASELINES = 50;
73422
73944
  function registerStageBashChanges(context) {
@@ -73481,6 +74003,12 @@ var require_stage_stop_bash_changes = __commonJS({
73481
74003
  if (lastConsumed?.stagedAt) {
73482
74004
  const shouldReactivate = metrics.turnCount > lastConsumed.stagedAt.turnCount;
73483
74005
  if (!shouldReactivate) {
74006
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
74007
+ reminderName: "verify-completion",
74008
+ hookName: "Stop",
74009
+ reason: "same_turn",
74010
+ triggeredBy: "bash_command"
74011
+ }));
73484
74012
  daemonCtx.logger.debug("Bash VC: skipped (already consumed this turn)", {
73485
74013
  currentTurn: metrics.turnCount,
73486
74014
  lastConsumedTurn: lastConsumed.stagedAt.turnCount
@@ -73496,12 +74024,25 @@ var require_stage_stop_bash_changes = __commonJS({
73496
74024
  currentCount: current.length,
73497
74025
  newFileCount: newFiles.length
73498
74026
  });
73499
- if (newFiles.length === 0)
74027
+ if (newFiles.length === 0) {
74028
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
74029
+ reminderName: "verify-completion",
74030
+ hookName: "Stop",
74031
+ reason: "no_changes_detected",
74032
+ triggeredBy: "bash_command"
74033
+ }));
73500
74034
  return;
74035
+ }
73501
74036
  const featureConfig = context.config.getFeature("reminders");
73502
74037
  const config = { ...types_js_1.DEFAULT_REMINDERS_SETTINGS, ...featureConfig.settings };
73503
74038
  const sourceMatches = newFiles.filter((f) => picomatch_1.default.isMatch(f, config.source_code_patterns));
73504
74039
  if (sourceMatches.length === 0) {
74040
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
74041
+ reminderName: "verify-completion",
74042
+ hookName: "Stop",
74043
+ reason: "pattern_mismatch",
74044
+ triggeredBy: "bash_command"
74045
+ }));
73505
74046
  daemonCtx.logger.debug("Bash VC: new files found but no source code matches", { newFiles });
73506
74047
  return;
73507
74048
  }
@@ -73515,7 +74056,7 @@ var require_stage_stop_bash_changes = __commonJS({
73515
74056
  const remindersState = (0, state_js_1.createRemindersState)(daemonCtx.stateService);
73516
74057
  const stateResult = await remindersState.verificationTools.read(sessionId);
73517
74058
  const toolsState = { ...stateResult.data };
73518
- await (0, track_verification_tools_js_1.stageToolsForFiles)(sourceMatches, daemonCtx, sessionId, verificationTools, toolsState, remindersState);
74059
+ await (0, track_verification_tools_js_1.stageToolsForFiles)(sourceMatches, daemonCtx, sessionId, verificationTools, toolsState, remindersState, "bash_command");
73519
74060
  }
73520
74061
  });
73521
74062
  }
@@ -73528,10 +74069,12 @@ var require_unstage_verify_completion = __commonJS({
73528
74069
  "use strict";
73529
74070
  Object.defineProperty(exports2, "__esModule", { value: true });
73530
74071
  exports2.registerUnstageVerifyCompletion = registerUnstageVerifyCompletion;
74072
+ var core_1 = require_dist4();
74073
+ var events_js_1 = require_events2();
73531
74074
  var types_1 = require_dist();
73532
74075
  var types_js_1 = require_types2();
73533
74076
  var reminder_utils_js_1 = require_reminder_utils();
73534
- var state_js_1 = require_state3();
74077
+ var state_js_1 = require_state4();
73535
74078
  function registerUnstageVerifyCompletion(context) {
73536
74079
  if (!(0, types_1.isDaemonContext)(context))
73537
74080
  return;
@@ -73550,6 +74093,7 @@ var require_unstage_verify_completion = __commonJS({
73550
74093
  if (!sessionId) {
73551
74094
  daemonCtx.logger.warn("No sessionId in UserPromptSubmit event");
73552
74095
  await daemonCtx.staging.deleteReminder("Stop", types_js_1.ReminderIds.VERIFY_COMPLETION);
74096
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId: "" }, { reminderName: types_js_1.ReminderIds.VERIFY_COMPLETION, hookName: "Stop", reason: "no_session_id" }));
73553
74097
  return;
73554
74098
  }
73555
74099
  const remindersState = (0, state_js_1.createRemindersState)(daemonCtx.stateService);
@@ -73625,13 +74169,26 @@ var require_unstage_verify_completion = __commonJS({
73625
74169
  await remindersState.vcUnverified.delete(sessionId);
73626
74170
  }
73627
74171
  } else {
74172
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
74173
+ reminderName: "verify-completion",
74174
+ hookName: "Stop",
74175
+ reason: "no_unverified_changes"
74176
+ }));
73628
74177
  daemonCtx.logger.info("VC unstage: no unverified changes, clearing reminder", {
73629
74178
  sessionId,
73630
74179
  hadState: unverifiedState !== null
73631
74180
  });
73632
74181
  }
74182
+ const eventContext = { sessionId };
74183
+ const reason = unverifiedState?.hasUnverifiedChanges ? "cycle_limit_reached" : "no_unverified_changes";
73633
74184
  for (const vcId of types_js_1.ALL_VC_REMINDER_IDS) {
73634
74185
  await daemonCtx.staging.deleteReminder("Stop", vcId);
74186
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
74187
+ reminderName: vcId,
74188
+ hookName: "Stop",
74189
+ reason,
74190
+ triggeredBy: unverifiedState?.hasUnverifiedChanges ? "cycle_limit" : "no_unverified_changes"
74191
+ }));
73635
74192
  }
73636
74193
  daemonCtx.logger.debug("VC unstage: deleted all VC reminders");
73637
74194
  }
@@ -73649,6 +74206,7 @@ var require_stage_persona_reminders = __commonJS({
73649
74206
  exports2.stagePersonaRemindersForSession = stagePersonaRemindersForSession;
73650
74207
  exports2.registerStagePersonaReminders = registerStagePersonaReminders;
73651
74208
  var core_1 = require_dist4();
74209
+ var events_js_1 = require_events2();
73652
74210
  var types_1 = require_dist();
73653
74211
  var reminder_utils_js_1 = require_reminder_utils();
73654
74212
  var types_js_1 = require_types2();
@@ -73669,10 +74227,21 @@ var require_stage_persona_reminders = __commonJS({
73669
74227
  }
73670
74228
  var PERSONA_REMINDER_HOOKS = ["UserPromptSubmit", "SessionStart"];
73671
74229
  async function clearPersonaReminders(ctx, sessionId) {
74230
+ const eventContext = { sessionId };
73672
74231
  for (const hook of PERSONA_REMINDER_HOOKS) {
73673
74232
  await ctx.staging.deleteReminder(hook, types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA);
74233
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
74234
+ reminderName: types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA,
74235
+ hookName: hook,
74236
+ reason: "persona_cleared"
74237
+ }));
73674
74238
  }
73675
74239
  await ctx.staging.deleteReminder("UserPromptSubmit", types_js_1.ReminderIds.PERSONA_CHANGED);
74240
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
74241
+ reminderName: types_js_1.ReminderIds.PERSONA_CHANGED,
74242
+ hookName: "UserPromptSubmit",
74243
+ reason: "persona_cleared"
74244
+ }));
73676
74245
  const lastStaged = await readLastStagedPersona(ctx, sessionId);
73677
74246
  if (lastStaged !== null) {
73678
74247
  await writeLastStagedPersona(ctx, sessionId, null);
@@ -73717,12 +74286,22 @@ var require_stage_persona_reminders = __commonJS({
73717
74286
  }
73718
74287
  async function stagePersonaRemindersForSession(ctx, sessionId, options) {
73719
74288
  if (!isPersonaInjectionEnabled(ctx)) {
74289
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
74290
+ reminderName: "remember-your-persona",
74291
+ hookName: "PreToolUse",
74292
+ reason: "feature_disabled"
74293
+ }));
73720
74294
  await clearPersonaReminders(ctx, sessionId);
73721
74295
  ctx.logger.debug("Persona injection disabled by config, cleaned up reminders", { sessionId });
73722
74296
  return;
73723
74297
  }
73724
74298
  const persona = await loadPersonaForSession(ctx, sessionId);
73725
74299
  if (!persona) {
74300
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
74301
+ reminderName: "remember-your-persona",
74302
+ hookName: "PreToolUse",
74303
+ reason: "no_persona"
74304
+ }));
73726
74305
  await clearPersonaReminders(ctx, sessionId);
73727
74306
  ctx.logger.debug("Persona cleared or disabled, unstaged persona reminders", { sessionId });
73728
74307
  return;
@@ -73751,6 +74330,11 @@ var require_stage_persona_reminders = __commonJS({
73751
74330
  const isGenuineChange = lastStaged !== null && // null = never staged (initialization) → skip
73752
74331
  lastStaged.personaId !== persona.id;
73753
74332
  if (isGenuineChange) {
74333
+ (0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaChanged({ sessionId }, {
74334
+ personaFrom: lastStaged.personaId ?? "none",
74335
+ personaTo: persona.id,
74336
+ reason: "mid_session_change"
74337
+ }));
73754
74338
  const changedReminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.PERSONA_CHANGED, {
73755
74339
  context: templateContext,
73756
74340
  assets: ctx.assets
@@ -73808,6 +74392,7 @@ var require_stage_user_profile_reminders = __commonJS({
73808
74392
  exports2.stageUserProfileRemindersForSession = stageUserProfileRemindersForSession;
73809
74393
  exports2.registerStageUserProfileReminders = registerStageUserProfileReminders;
73810
74394
  var core_1 = require_dist4();
74395
+ var events_js_1 = require_events2();
73811
74396
  var types_1 = require_dist();
73812
74397
  var reminder_utils_js_1 = require_reminder_utils();
73813
74398
  var types_js_1 = require_types2();
@@ -73815,8 +74400,14 @@ var require_stage_user_profile_reminders = __commonJS({
73815
74400
  async function stageUserProfileRemindersForSession(ctx, sessionId) {
73816
74401
  const profile = (0, core_1.loadUserProfile)({ logger: ctx.logger });
73817
74402
  if (!profile) {
74403
+ const eventContext = { sessionId };
73818
74404
  for (const hook of USER_PROFILE_REMINDER_HOOKS) {
73819
74405
  await ctx.staging.deleteReminder(hook, types_js_1.ReminderIds.USER_PROFILE);
74406
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
74407
+ reminderName: types_js_1.ReminderIds.USER_PROFILE,
74408
+ hookName: hook,
74409
+ reason: "no_user_profile"
74410
+ }));
73820
74411
  }
73821
74412
  return;
73822
74413
  }
@@ -73885,60 +74476,6 @@ var require_staging2 = __commonJS({
73885
74476
  }
73886
74477
  });
73887
74478
 
73888
- // ../feature-reminders/dist/events.js
73889
- var require_events2 = __commonJS({
73890
- "../feature-reminders/dist/events.js"(exports2) {
73891
- "use strict";
73892
- Object.defineProperty(exports2, "__esModule", { value: true });
73893
- exports2.ReminderEvents = void 0;
73894
- exports2.ReminderEvents = {
73895
- /**
73896
- * Create a ReminderConsumed event (logged when CLI returns a staged reminder).
73897
- */
73898
- reminderConsumed(context, state, metadata) {
73899
- return {
73900
- type: "ReminderConsumed",
73901
- time: Date.now(),
73902
- source: "cli",
73903
- context: {
73904
- sessionId: context.sessionId,
73905
- correlationId: context.correlationId,
73906
- traceId: context.traceId,
73907
- hook: context.hook,
73908
- taskId: context.taskId
73909
- },
73910
- payload: {
73911
- state,
73912
- metadata
73913
- }
73914
- };
73915
- },
73916
- // Note: reminderStaged stays in @sidekick/core (used by staging-service.ts, circular dep)
73917
- /**
73918
- * Create a RemindersCleared event (logged when staging directory is cleaned).
73919
- */
73920
- remindersCleared(context, state, reason) {
73921
- return {
73922
- type: "RemindersCleared",
73923
- time: Date.now(),
73924
- source: "daemon",
73925
- context: {
73926
- sessionId: context.sessionId,
73927
- correlationId: context.correlationId,
73928
- traceId: context.traceId,
73929
- hook: context.hook,
73930
- taskId: context.taskId
73931
- },
73932
- payload: {
73933
- state,
73934
- reason
73935
- }
73936
- };
73937
- }
73938
- };
73939
- }
73940
- });
73941
-
73942
74479
  // ../feature-reminders/dist/cli-staging-reader.js
73943
74480
  var require_cli_staging_reader = __commonJS({
73944
74481
  "../feature-reminders/dist/cli-staging-reader.js"(exports2) {
@@ -74064,7 +74601,19 @@ var require_consumption_handler_factory = __commonJS({
74064
74601
  reader.renameReminder(hook, reminder.name);
74065
74602
  }
74066
74603
  }
74067
- let response = buildResponse ? await buildResponse({ reminder: primary, reader, cliCtx, sessionId, event, supportsBlocking }) : buildDefaultResponse(primary, supportsBlocking);
74604
+ let enrichment;
74605
+ let response;
74606
+ if (buildResponse) {
74607
+ const result = await buildResponse({ reminder: primary, reader, cliCtx, sessionId, event, supportsBlocking });
74608
+ if ("response" in result && typeof result.response === "object") {
74609
+ response = result.response;
74610
+ enrichment = result.enrichment;
74611
+ } else {
74612
+ response = result;
74613
+ }
74614
+ } else {
74615
+ response = buildDefaultResponse(primary, supportsBlocking);
74616
+ }
74068
74617
  const secondaryContexts = reminders.slice(1).map((r) => r.additionalContext).filter((ctx2) => !!ctx2);
74069
74618
  if (secondaryContexts.length > 0) {
74070
74619
  const existing = response.additionalContext;
@@ -74082,7 +74631,8 @@ var require_consumption_handler_factory = __commonJS({
74082
74631
  reminderReturned: true,
74083
74632
  blocking: response.blocking ?? false,
74084
74633
  priority: primary.priority,
74085
- persistent: primary.persistent
74634
+ persistent: primary.persistent,
74635
+ ...enrichment
74086
74636
  }));
74087
74637
  return { response };
74088
74638
  }
@@ -74184,6 +74734,13 @@ var require_inject_stop = __commonJS({
74184
74734
  shouldBlock: classification.shouldBlock,
74185
74735
  reasoning: classification.reasoning?.slice(0, 200)
74186
74736
  });
74737
+ const classificationEnrichment = {
74738
+ classificationResult: {
74739
+ category: classification.category,
74740
+ confidence: classification.confidence,
74741
+ shouldBlock: classification.shouldBlock
74742
+ }
74743
+ };
74187
74744
  if (classification.shouldBlock) {
74188
74745
  cliCtx.logger.info("VC inject-stop: BLOCKING (claiming completion)", { sessionId });
74189
74746
  try {
@@ -74193,7 +74750,10 @@ var require_inject_stop = __commonJS({
74193
74750
  error: String(clearErr)
74194
74751
  });
74195
74752
  }
74196
- return (0, consumption_handler_factory_js_1.buildDefaultResponse)(reminder, supportsBlocking);
74753
+ return {
74754
+ response: (0, consumption_handler_factory_js_1.buildDefaultResponse)(reminder, supportsBlocking),
74755
+ enrichment: classificationEnrichment
74756
+ };
74197
74757
  } else {
74198
74758
  cliCtx.logger.info("VC inject-stop: NOT BLOCKING", {
74199
74759
  sessionId,
@@ -74219,13 +74779,13 @@ var require_inject_stop = __commonJS({
74219
74779
  });
74220
74780
  }
74221
74781
  if (classification.category === "ASKING_QUESTION" || classification.category === "ANSWERING_QUESTION") {
74222
- return {};
74782
+ return { response: {}, enrichment: classificationEnrichment };
74223
74783
  } else {
74224
74784
  const response = {};
74225
74785
  if (classification.userMessage) {
74226
74786
  response.userMessage = classification.userMessage;
74227
74787
  }
74228
- return response;
74788
+ return { response, enrichment: classificationEnrichment };
74229
74789
  }
74230
74790
  }
74231
74791
  } catch (err) {
@@ -74481,7 +75041,7 @@ var require_reminder_consumed = __commonJS({
74481
75041
  "use strict";
74482
75042
  Object.defineProperty(exports2, "__esModule", { value: true });
74483
75043
  exports2.handleReminderConsumed = handleReminderConsumed;
74484
- var state_js_1 = require_state3();
75044
+ var state_js_1 = require_state4();
74485
75045
  var types_js_1 = require_types2();
74486
75046
  async function handleReminderConsumed(params, ctx) {
74487
75047
  const { sessionId, reminderName, metrics } = params;
@@ -74506,7 +75066,7 @@ var require_vc_unverified = __commonJS({
74506
75066
  Object.defineProperty(exports2, "__esModule", { value: true });
74507
75067
  exports2.handleVCUnverifiedSet = handleVCUnverifiedSet;
74508
75068
  exports2.handleVCUnverifiedClear = handleVCUnverifiedClear;
74509
- var state_js_1 = require_state3();
75069
+ var state_js_1 = require_state4();
74510
75070
  async function handleVCUnverifiedSet(params, ctx) {
74511
75071
  const { sessionId, classification, metrics } = params;
74512
75072
  const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
@@ -74569,7 +75129,9 @@ var require_orchestrator = __commonJS({
74569
75129
  "use strict";
74570
75130
  Object.defineProperty(exports2, "__esModule", { value: true });
74571
75131
  exports2.ReminderOrchestrator = void 0;
74572
- var state_js_1 = require_state3();
75132
+ var core_1 = require_dist4();
75133
+ var events_js_1 = require_events2();
75134
+ var state_js_1 = require_state4();
74573
75135
  var types_js_1 = require_types2();
74574
75136
  var ReminderOrchestrator = class {
74575
75137
  deps;
@@ -74588,8 +75150,15 @@ var require_orchestrator = __commonJS({
74588
75150
  if (reminder.name === types_js_1.ReminderIds.PAUSE_AND_REFLECT) {
74589
75151
  try {
74590
75152
  const staging = this.deps.getStagingService(sessionId);
75153
+ const eventContext = { sessionId };
74591
75154
  for (const vcId of types_js_1.ALL_VC_REMINDER_IDS) {
74592
75155
  await staging.deleteReminder("Stop", vcId);
75156
+ (0, core_1.logEvent)(this.deps.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
75157
+ reminderName: vcId,
75158
+ hookName: "Stop",
75159
+ reason: "pause_and_reflect_cascade",
75160
+ triggeredBy: "cascade_from_pause_and_reflect"
75161
+ }));
74593
75162
  }
74594
75163
  this.deps.logger.debug("Unstaged all VC reminders after P&R staged", { sessionId });
74595
75164
  } catch (err) {
@@ -74625,6 +75194,12 @@ var require_orchestrator = __commonJS({
74625
75194
  try {
74626
75195
  const staging = this.deps.getStagingService(sessionId);
74627
75196
  await staging.deleteReminder("PreToolUse", types_js_1.ReminderIds.PAUSE_AND_REFLECT);
75197
+ (0, core_1.logEvent)(this.deps.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, {
75198
+ reminderName: types_js_1.ReminderIds.PAUSE_AND_REFLECT,
75199
+ hookName: "PreToolUse",
75200
+ reason: "vc_consumed_cascade",
75201
+ triggeredBy: "cascade_from_verify_completion"
75202
+ }));
74628
75203
  this.deps.logger.debug("Unstaged P&R after VC consumed", { sessionId });
74629
75204
  } catch (err) {
74630
75205
  this.deps.logger.warn("Failed to unstage P&R after VC consumed", {
@@ -74750,7 +75325,7 @@ var require_dist5 = __commonJS({
74750
75325
  Object.defineProperty(exports2, "ReminderOrchestrator", { enumerable: true, get: function() {
74751
75326
  return orchestrator_js_1.ReminderOrchestrator;
74752
75327
  } });
74753
- var state_js_1 = require_state3();
75328
+ var state_js_1 = require_state4();
74754
75329
  Object.defineProperty(exports2, "createRemindersState", { enumerable: true, get: function() {
74755
75330
  return state_js_1.createRemindersState;
74756
75331
  } });
@@ -75777,7 +76352,7 @@ var require_truncation = __commonJS({
75777
76352
  });
75778
76353
 
75779
76354
  // ../feature-session-summary/dist/state.js
75780
- var require_state4 = __commonJS({
76355
+ var require_state5 = __commonJS({
75781
76356
  "../feature-session-summary/dist/state.js"(exports2) {
75782
76357
  "use strict";
75783
76358
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -75882,7 +76457,7 @@ var require_persona_selection = __commonJS({
75882
76457
  exports2.selectPersonaForSession = selectPersonaForSession;
75883
76458
  exports2.ensurePersonaForSession = ensurePersonaForSession;
75884
76459
  var core_1 = require_dist4();
75885
- var state_js_1 = require_state4();
76460
+ var state_js_1 = require_state5();
75886
76461
  var types_js_1 = require_types4();
75887
76462
  function parsePersonaList(list) {
75888
76463
  if (!list || !list.trim()) {
@@ -75965,11 +76540,11 @@ var require_persona_selection = __commonJS({
75965
76540
  };
75966
76541
  const summaryState2 = (0, state_js_1.createSessionSummaryState)(ctx.stateService);
75967
76542
  await summaryState2.sessionPersona.write(sessionId, personaState2);
75968
- ctx.logger.info("Using pinned persona for session", {
75969
- sessionId,
76543
+ (0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaSelected({ sessionId }, {
75970
76544
  personaId: pinned.id,
75971
- personaName: pinned.display_name
75972
- });
76545
+ selectionMethod: "pinned",
76546
+ poolSize: 1
76547
+ }));
75973
76548
  return pinned.id;
75974
76549
  }
75975
76550
  ctx.logger.warn("Pinned persona not found, falling back to random selection", {
@@ -75979,13 +76554,18 @@ var require_persona_selection = __commonJS({
75979
76554
  });
75980
76555
  }
75981
76556
  const persistThroughClear = personaConfig.persistThroughClear ?? true;
75982
- ctx.logger.debug("Persona clear handoff check", {
76557
+ ctx.logger.info("[persona-lifecycle] ClearHandoff: checking clear cache", {
76558
+ sessionId,
75983
76559
  persistThroughClear,
75984
76560
  startType: options?.startType,
75985
76561
  hasClearCache: !!ctx.personaClearCache
75986
76562
  });
75987
76563
  if (persistThroughClear && options?.startType === "clear" && ctx.personaClearCache) {
75988
76564
  const cachedPersonaId = ctx.personaClearCache.consume();
76565
+ ctx.logger.info("[persona-lifecycle] ClearHandoff: consumed cache", {
76566
+ sessionId,
76567
+ cachedPersonaId: cachedPersonaId ?? null
76568
+ });
75989
76569
  if (cachedPersonaId) {
75990
76570
  const cachedPersona = allPersonas.get(cachedPersonaId);
75991
76571
  if (cachedPersona) {
@@ -75996,11 +76576,11 @@ var require_persona_selection = __commonJS({
75996
76576
  };
75997
76577
  const summaryState2 = (0, state_js_1.createSessionSummaryState)(ctx.stateService);
75998
76578
  await summaryState2.sessionPersona.write(sessionId, personaState2);
75999
- ctx.logger.info("Preserved persona through clear", {
76000
- sessionId,
76579
+ (0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaSelected({ sessionId }, {
76001
76580
  personaId: cachedPersona.id,
76002
- personaName: cachedPersona.display_name
76003
- });
76581
+ selectionMethod: "handoff",
76582
+ poolSize: 1
76583
+ }));
76004
76584
  return cachedPersona.id;
76005
76585
  } else {
76006
76586
  ctx.logger.warn("Cached persona from clear not found in available personas, falling back to selection", {
@@ -76038,12 +76618,11 @@ var require_persona_selection = __commonJS({
76038
76618
  };
76039
76619
  const summaryState = (0, state_js_1.createSessionSummaryState)(ctx.stateService);
76040
76620
  await summaryState.sessionPersona.write(sessionId, personaState);
76041
- ctx.logger.info("Selected persona for session", {
76042
- sessionId,
76621
+ (0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaSelected({ sessionId }, {
76043
76622
  personaId: selected.id,
76044
- personaName: selected.display_name,
76623
+ selectionMethod: "random",
76045
76624
  poolSize: eligiblePersonas.length
76046
- });
76625
+ }));
76047
76626
  return selected.id;
76048
76627
  }
76049
76628
  async function ensurePersonaForSession(sessionId, ctx) {
@@ -76073,7 +76652,7 @@ var require_create_first_summary = __commonJS({
76073
76652
  Object.defineProperty(exports2, "__esModule", { value: true });
76074
76653
  exports2.createFirstSessionSummary = createFirstSessionSummary;
76075
76654
  var types_1 = require_dist();
76076
- var state_js_1 = require_state4();
76655
+ var state_js_1 = require_state5();
76077
76656
  var persona_selection_js_1 = require_persona_selection();
76078
76657
  var types_js_1 = require_types4();
76079
76658
  async function createFirstSessionSummary(event, ctx) {
@@ -76106,15 +76685,12 @@ var require_events3 = __commonJS({
76106
76685
  "../feature-session-summary/dist/events.js"(exports2) {
76107
76686
  "use strict";
76108
76687
  Object.defineProperty(exports2, "__esModule", { value: true });
76109
- exports2.SessionSummaryEvents = void 0;
76688
+ exports2.DecisionEvents = exports2.SessionSummaryEvents = void 0;
76110
76689
  exports2.SessionSummaryEvents = {
76111
- /**
76112
- * Create a SummaryUpdated event (logged when session summary is recalculated).
76113
- * @see docs/design/FEATURE-SESSION-SUMMARY.md §3.4
76114
- */
76115
- summaryUpdated(context, state, metadata, reason) {
76690
+ /** Emitted when summary generation begins. */
76691
+ summaryStart(context, payload) {
76116
76692
  return {
76117
- type: "SummaryUpdated",
76693
+ type: "session-summary:start",
76118
76694
  time: Date.now(),
76119
76695
  source: "daemon",
76120
76696
  context: {
@@ -76124,11 +76700,87 @@ var require_events3 = __commonJS({
76124
76700
  hook: context.hook,
76125
76701
  taskId: context.taskId
76126
76702
  },
76127
- payload: {
76128
- state,
76129
- metadata,
76130
- reason
76131
- }
76703
+ payload
76704
+ };
76705
+ },
76706
+ /** Emitted when summary generation completes. */
76707
+ summaryFinish(context, payload) {
76708
+ return {
76709
+ type: "session-summary:finish",
76710
+ time: Date.now(),
76711
+ source: "daemon",
76712
+ context: {
76713
+ sessionId: context.sessionId,
76714
+ correlationId: context.correlationId,
76715
+ traceId: context.traceId,
76716
+ hook: context.hook,
76717
+ taskId: context.taskId
76718
+ },
76719
+ payload
76720
+ };
76721
+ },
76722
+ /** Emitted when session title changes. */
76723
+ titleChanged(context, payload) {
76724
+ return {
76725
+ type: "session-title:changed",
76726
+ time: Date.now(),
76727
+ source: "daemon",
76728
+ context: {
76729
+ sessionId: context.sessionId,
76730
+ correlationId: context.correlationId,
76731
+ traceId: context.traceId,
76732
+ hook: context.hook,
76733
+ taskId: context.taskId
76734
+ },
76735
+ payload
76736
+ };
76737
+ },
76738
+ /** Emitted when latest intent changes. */
76739
+ intentChanged(context, payload) {
76740
+ return {
76741
+ type: "intent:changed",
76742
+ time: Date.now(),
76743
+ source: "daemon",
76744
+ context: {
76745
+ sessionId: context.sessionId,
76746
+ correlationId: context.correlationId,
76747
+ traceId: context.traceId,
76748
+ hook: context.hook,
76749
+ taskId: context.taskId
76750
+ },
76751
+ payload
76752
+ };
76753
+ },
76754
+ /** Emitted when snarky message generation begins. */
76755
+ snarkyMessageStart(context, payload) {
76756
+ return {
76757
+ type: "snarky-message:start",
76758
+ time: Date.now(),
76759
+ source: "daemon",
76760
+ context: {
76761
+ sessionId: context.sessionId,
76762
+ correlationId: context.correlationId,
76763
+ traceId: context.traceId,
76764
+ hook: context.hook,
76765
+ taskId: context.taskId
76766
+ },
76767
+ payload
76768
+ };
76769
+ },
76770
+ /** Emitted when snarky message generation completes. */
76771
+ snarkyMessageFinish(context, payload) {
76772
+ return {
76773
+ type: "snarky-message:finish",
76774
+ time: Date.now(),
76775
+ source: "daemon",
76776
+ context: {
76777
+ sessionId: context.sessionId,
76778
+ correlationId: context.correlationId,
76779
+ traceId: context.traceId,
76780
+ hook: context.hook,
76781
+ taskId: context.taskId
76782
+ },
76783
+ payload
76132
76784
  };
76133
76785
  },
76134
76786
  /**
@@ -76137,7 +76789,7 @@ var require_events3 = __commonJS({
76137
76789
  */
76138
76790
  summarySkipped(context, metadata) {
76139
76791
  return {
76140
- type: "SummarySkipped",
76792
+ type: "session-summary:skipped",
76141
76793
  time: Date.now(),
76142
76794
  source: "daemon",
76143
76795
  context: {
@@ -76148,12 +76800,31 @@ var require_events3 = __commonJS({
76148
76800
  taskId: context.taskId
76149
76801
  },
76150
76802
  payload: {
76151
- metadata,
76803
+ countdown: metadata.countdown,
76804
+ countdown_threshold: metadata.countdown_threshold,
76152
76805
  reason: "countdown_active"
76153
76806
  }
76154
76807
  };
76155
76808
  }
76156
76809
  };
76810
+ exports2.DecisionEvents = {
76811
+ /** Emitted when an LLM decision is recorded. */
76812
+ decisionRecorded(context, payload) {
76813
+ return {
76814
+ type: "decision:recorded",
76815
+ time: Date.now(),
76816
+ source: "daemon",
76817
+ context: {
76818
+ sessionId: context.sessionId,
76819
+ correlationId: context.correlationId,
76820
+ traceId: context.traceId,
76821
+ hook: context.hook,
76822
+ taskId: context.taskId
76823
+ },
76824
+ payload
76825
+ };
76826
+ }
76827
+ };
76157
76828
  }
76158
76829
  });
76159
76830
 
@@ -76173,7 +76844,7 @@ var require_persona_utils = __commonJS({
76173
76844
  exports2.mergePersonaConfig = mergePersonaConfig;
76174
76845
  exports2.getEffectiveProfile = getEffectiveProfile;
76175
76846
  var core_1 = require_dist4();
76176
- var state_js_1 = require_state4();
76847
+ var state_js_1 = require_state5();
76177
76848
  var types_js_1 = require_types4();
76178
76849
  var DEFAULT_PERSONA_SITUATION = "You are watching over the shoulder of a software developer as they work.";
76179
76850
  function buildUserProfileContext(profile) {
@@ -76315,7 +76986,7 @@ var require_update_summary = __commonJS({
76315
76986
  var events_js_1 = require_events3();
76316
76987
  var zod_1 = require_zod();
76317
76988
  var types_js_1 = require_types4();
76318
- var state_js_1 = require_state4();
76989
+ var state_js_1 = require_state5();
76319
76990
  var persona_utils_js_1 = require_persona_utils();
76320
76991
  var persona_selection_js_1 = require_persona_selection();
76321
76992
  var PROMPT_FILE = "prompts/session-summary.prompt.txt";
@@ -76368,47 +77039,47 @@ var require_update_summary = __commonJS({
76368
77039
  await (0, persona_selection_js_1.ensurePersonaForSession)(sessionId, ctx);
76369
77040
  const metrics = ctx.transcript.getMetrics();
76370
77041
  if (metrics.turnCount === 0) {
76371
- ctx.logger.info("LLM call: session-summary analysis", {
76372
- sessionId,
77042
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76373
77043
  decision: "skipped",
76374
- reason: "BulkProcessingComplete with no user turns (turnCount=0)"
76375
- });
77044
+ reason: "BulkProcessingComplete with no user turns (turnCount=0)",
77045
+ detail: "session-summary analysis"
77046
+ }));
76376
77047
  return;
76377
77048
  }
76378
- ctx.logger.info("LLM call: session-summary analysis", {
76379
- sessionId,
77049
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76380
77050
  decision: "calling",
76381
- reason: "BulkProcessingComplete - analyzing full transcript"
76382
- });
77051
+ reason: "BulkProcessingComplete - analyzing full transcript",
77052
+ detail: "session-summary analysis"
77053
+ }));
76383
77054
  const countdown2 = await loadCountdownState(summaryState, sessionId);
76384
77055
  void performAnalysis(event, ctx, summaryState, countdown2, "user_prompt_forced");
76385
77056
  return;
76386
77057
  }
76387
77058
  const countdown = await loadCountdownState(summaryState, sessionId);
76388
77059
  if (isUserPrompt) {
76389
- ctx.logger.info("LLM call: session-summary analysis", {
76390
- sessionId,
77060
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76391
77061
  decision: "calling",
76392
- reason: "UserPrompt event forces immediate analysis"
76393
- });
77062
+ reason: "UserPrompt event forces immediate analysis",
77063
+ detail: "session-summary analysis"
77064
+ }));
76394
77065
  void performAnalysis(event, ctx, summaryState, countdown, "user_prompt_forced");
76395
77066
  return;
76396
77067
  }
76397
77068
  if (countdown.countdown > 0) {
76398
- ctx.logger.info("LLM call: session-summary analysis", {
76399
- sessionId,
77069
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76400
77070
  decision: "skipped",
76401
- reason: `countdown not reached (${countdown.countdown} tool results remaining)`
76402
- });
77071
+ reason: `countdown not reached (${countdown.countdown} tool results remaining)`,
77072
+ detail: "session-summary analysis"
77073
+ }));
76403
77074
  countdown.countdown--;
76404
77075
  await saveCountdownState(summaryState, sessionId, countdown);
76405
77076
  return;
76406
77077
  }
76407
- ctx.logger.info("LLM call: session-summary analysis", {
76408
- sessionId,
77078
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76409
77079
  decision: "calling",
76410
- reason: "countdown reached zero after ToolResult"
76411
- });
77080
+ reason: "countdown reached zero after ToolResult",
77081
+ detail: "session-summary analysis"
77082
+ }));
76412
77083
  void performAnalysis(event, ctx, summaryState, countdown, "countdown_reached");
76413
77084
  }
76414
77085
  async function loadCountdownState(summaryState, sessionId) {
@@ -76442,6 +77113,10 @@ var require_update_summary = __commonJS({
76442
77113
  const { sessionId } = event.context;
76443
77114
  try {
76444
77115
  const startTime = Date.now();
77116
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.summaryStart(event.context, {
77117
+ reason,
77118
+ countdown: countdown.countdown
77119
+ }));
76445
77120
  const featureConfig = ctx.config.getFeature("session-summary");
76446
77121
  const config = { ...types_js_1.DEFAULT_SESSION_SUMMARY_CONFIG, ...featureConfig.settings };
76447
77122
  const currentSummary = await loadCurrentSummary(summaryState, sessionId);
@@ -76545,19 +77220,28 @@ var require_update_summary = __commonJS({
76545
77220
  if (sideEffects.length > 0) {
76546
77221
  await Promise.all(sideEffects);
76547
77222
  }
76548
- (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.summaryUpdated(event.context, {
77223
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.summaryFinish(event.context, {
76549
77224
  session_title: updatedSummary.session_title,
76550
77225
  session_title_confidence: updatedSummary.session_title_confidence,
76551
77226
  latest_intent: updatedSummary.latest_intent,
76552
- latest_intent_confidence: updatedSummary.latest_intent_confidence
76553
- }, {
76554
- countdown_reset_to: newCountdown,
76555
- tokens_used: tokensUsed,
77227
+ latest_intent_confidence: updatedSummary.latest_intent_confidence,
76556
77228
  processing_time_ms: updatedSummary.stats?.processing_time_ms ?? 0,
76557
- pivot_detected: updatedSummary.pivot_detected ?? false,
76558
- old_title: currentSummary?.session_title,
76559
- old_intent: currentSummary?.latest_intent
76560
- }, reason));
77229
+ pivot_detected: updatedSummary.pivot_detected ?? false
77230
+ }));
77231
+ if (currentSummary && updatedSummary.session_title !== currentSummary.session_title) {
77232
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.titleChanged(event.context, {
77233
+ previousValue: currentSummary.session_title,
77234
+ newValue: updatedSummary.session_title,
77235
+ confidence: updatedSummary.session_title_confidence
77236
+ }));
77237
+ }
77238
+ if (currentSummary && updatedSummary.latest_intent !== currentSummary.latest_intent) {
77239
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.intentChanged(event.context, {
77240
+ previousValue: currentSummary.latest_intent,
77241
+ newValue: updatedSummary.latest_intent,
77242
+ confidence: updatedSummary.latest_intent_confidence
77243
+ }));
77244
+ }
76561
77245
  ctx.logger.info("Updated session summary", {
76562
77246
  sessionId,
76563
77247
  reason,
@@ -76623,6 +77307,7 @@ var require_update_summary = __commonJS({
76623
77307
  return;
76624
77308
  }
76625
77309
  const provider = ctx.profileFactory.createForProfile(profileResult.profileId, llmConfig.fallbackProfile);
77310
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageStart({ sessionId }, { sessionId }));
76626
77311
  try {
76627
77312
  const response = await provider.complete({
76628
77313
  messages: [{ role: "user", content: prompt }]
@@ -76633,6 +77318,7 @@ var require_update_summary = __commonJS({
76633
77318
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
76634
77319
  };
76635
77320
  await summaryState.snarkyMessage.write(sessionId, snarkyState);
77321
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageFinish({ sessionId }, { generatedMessage: snarkyMessage }));
76636
77322
  ctx.logger.debug("Generated snarky message", {
76637
77323
  sessionId,
76638
77324
  personaId: persona?.id ?? "none",
@@ -76741,8 +77427,10 @@ var require_on_demand_generation = __commonJS({
76741
77427
  exports2.generateSnarkyMessageOnDemand = generateSnarkyMessageOnDemand;
76742
77428
  exports2.generateResumeMessageOnDemand = generateResumeMessageOnDemand;
76743
77429
  var types_js_1 = require_types4();
76744
- var state_js_1 = require_state4();
77430
+ var state_js_1 = require_state5();
76745
77431
  var core_1 = require_dist4();
77432
+ var core_2 = require_dist4();
77433
+ var events_js_1 = require_events3();
76746
77434
  var update_summary_js_1 = require_update_summary();
76747
77435
  var persona_utils_js_1 = require_persona_utils();
76748
77436
  var SNARKY_PROMPT_FILE = "prompts/snarky-message.prompt.txt";
@@ -76819,6 +77507,7 @@ var require_on_demand_generation = __commonJS({
76819
77507
  return { success: false, error: profileResult.errorMessage };
76820
77508
  }
76821
77509
  const provider = ctx.profileFactory.createForProfile(profileResult.profileId, llmConfig.fallbackProfile);
77510
+ (0, core_2.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageStart({ sessionId }, { sessionId }));
76822
77511
  try {
76823
77512
  const response = await provider.complete({
76824
77513
  messages: [{ role: "user", content: prompt }]
@@ -76829,6 +77518,7 @@ var require_on_demand_generation = __commonJS({
76829
77518
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
76830
77519
  };
76831
77520
  await summaryState.snarkyMessage.write(sessionId, snarkyState);
77521
+ (0, core_2.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageFinish({ sessionId }, { generatedMessage: snarkyMessage }));
76832
77522
  ctx.logger.info("Generated snarky message on-demand", {
76833
77523
  sessionId,
76834
77524
  personaId: persona?.id ?? "none"
@@ -77035,7 +77725,7 @@ var require_dist6 = __commonJS({
77035
77725
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
77036
77726
  };
77037
77727
  Object.defineProperty(exports2, "__esModule", { value: true });
77038
- exports2.SessionSummaryEvents = exports2.manifest = void 0;
77728
+ exports2.DecisionEvents = exports2.SessionSummaryEvents = exports2.manifest = void 0;
77039
77729
  exports2.register = register;
77040
77730
  var index_js_1 = require_handlers();
77041
77731
  exports2.manifest = {
@@ -77052,11 +77742,14 @@ var require_dist6 = __commonJS({
77052
77742
  exports2.default = feature;
77053
77743
  __exportStar(require_types4(), exports2);
77054
77744
  __exportStar(require_handlers(), exports2);
77055
- __exportStar(require_state4(), exports2);
77745
+ __exportStar(require_state5(), exports2);
77056
77746
  var events_js_1 = require_events3();
77057
77747
  Object.defineProperty(exports2, "SessionSummaryEvents", { enumerable: true, get: function() {
77058
77748
  return events_js_1.SessionSummaryEvents;
77059
77749
  } });
77750
+ Object.defineProperty(exports2, "DecisionEvents", { enumerable: true, get: function() {
77751
+ return events_js_1.DecisionEvents;
77752
+ } });
77060
77753
  }
77061
77754
  });
77062
77755
 
@@ -79135,6 +79828,20 @@ var require_persona2 = __commonJS({
79135
79828
  stdout.write(output + "\n");
79136
79829
  return { exitCode, output };
79137
79830
  }
79831
+ function validatePersonaExists(personaId, opts) {
79832
+ const personas = (0, core_1.discoverPersonas)({
79833
+ defaultPersonasDir: (0, core_1.getDefaultPersonasDir)(),
79834
+ projectRoot: opts.projectRoot,
79835
+ logger: opts.logger
79836
+ });
79837
+ if (!personas.has(personaId)) {
79838
+ const availableIds = Array.from(personas.keys()).join(", ");
79839
+ const errorMsg = `Persona "${personaId}" not found. Available: ${availableIds}`;
79840
+ opts.logger.error("Persona not found", { personaId, available: availableIds });
79841
+ return { result: writeJsonResponse(opts.stdout, { success: false, error: errorMsg }, 1) };
79842
+ }
79843
+ return { personas };
79844
+ }
79138
79845
  function handlePersonaList(projectRoot, logger, stdout, options) {
79139
79846
  const format3 = options.format ?? "json";
79140
79847
  const tableWidth = options.width ?? 100;
@@ -79191,17 +79898,10 @@ var require_persona2 = __commonJS({
79191
79898
  return { exitCode: 1, output: error };
79192
79899
  }
79193
79900
  logger.info("Setting persona", { personaId, sessionId });
79194
- const personas = (0, core_1.discoverPersonas)({
79195
- defaultPersonasDir: (0, core_1.getDefaultPersonasDir)(),
79196
- projectRoot,
79197
- logger
79198
- });
79199
- if (!personas.has(personaId)) {
79200
- const availableIds = Array.from(personas.keys()).join(", ");
79201
- const errorMsg = `Persona "${personaId}" not found. Available: ${availableIds}`;
79202
- logger.error("Persona not found", { personaId, available: availableIds });
79203
- return writeJsonResponse(stdout, { success: false, error: errorMsg }, 1);
79204
- }
79901
+ const validation = validatePersonaExists(personaId, { projectRoot, logger, stdout });
79902
+ if (validation.result)
79903
+ return validation.result;
79904
+ const personas = validation.personas;
79205
79905
  const stateService = new core_1.StateService(projectRoot, { cache: false, logger });
79206
79906
  const personaAccessor = new core_1.SessionStateAccessor(stateService, SessionPersonaDescriptor);
79207
79907
  try {
@@ -79213,10 +79913,16 @@ var require_persona2 = __commonJS({
79213
79913
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
79214
79914
  };
79215
79915
  await personaAccessor.write(sessionId, newState);
79916
+ const personaFilePath = stateService.sessionStatePath(sessionId, "session-persona.json");
79216
79917
  if (previousPersonaId) {
79217
- logger.info("Persona changed", { from: previousPersonaId, to: personaId });
79918
+ logger.info("[persona-lifecycle] PersonaSet: persona changed", {
79919
+ sessionId,
79920
+ from: previousPersonaId,
79921
+ to: personaId,
79922
+ filePath: personaFilePath
79923
+ });
79218
79924
  } else {
79219
- logger.info("Persona set", { personaId });
79925
+ logger.info("[persona-lifecycle] PersonaSet: persona set", { sessionId, personaId, filePath: personaFilePath });
79220
79926
  }
79221
79927
  return writeJsonResponse(stdout, { success: true, personaId, previousPersonaId }, 0);
79222
79928
  } catch (err) {
@@ -79299,17 +80005,9 @@ var require_persona2 = __commonJS({
79299
80005
  function handlePersonaPin(personaId, projectRoot, logger, stdout, options) {
79300
80006
  const scope = options.scope ?? "project";
79301
80007
  logger.info("Pinning persona", { personaId, scope });
79302
- const personas = (0, core_1.discoverPersonas)({
79303
- defaultPersonasDir: (0, core_1.getDefaultPersonasDir)(),
79304
- projectRoot,
79305
- logger
79306
- });
79307
- if (!personas.has(personaId)) {
79308
- const availableIds = Array.from(personas.keys()).join(", ");
79309
- const errorMsg = `Persona "${personaId}" not found. Available: ${availableIds}`;
79310
- logger.error("Persona not found", { personaId, available: availableIds });
79311
- return writeJsonResponse(stdout, { success: false, error: errorMsg }, 1);
79312
- }
80008
+ const validation = validatePersonaExists(personaId, { projectRoot, logger, stdout });
80009
+ if (validation.result)
80010
+ return validation.result;
79313
80011
  try {
79314
80012
  const result = (0, core_1.configSet)("features.session-summary.settings.personas.pinnedPersona", personaId, {
79315
80013
  scope,
@@ -79354,7 +80052,7 @@ var require_persona2 = __commonJS({
79354
80052
  return writeJsonResponse(stdout, { success: false, error: errorMsg }, 1);
79355
80053
  }
79356
80054
  }
79357
- function showPersonaHelp(stdout) {
80055
+ function showPersonaHelp(stdout, exitCode = 0) {
79358
80056
  stdout.write(`Usage: sidekick persona <subcommand> [options]
79359
80057
 
79360
80058
  Subcommands:
@@ -79383,7 +80081,7 @@ Examples:
79383
80081
  sidekick persona clear --session-id=abc123
79384
80082
  sidekick persona test skippy --session-id=abc123 --type=snarky
79385
80083
  `);
79386
- return { exitCode: 0, output: "" };
80084
+ return { exitCode, output: "" };
79387
80085
  }
79388
80086
  async function handlePersonaCommand(subcommand, args, projectRoot, logger, stdout, options) {
79389
80087
  const personaId = args[0];
@@ -79424,12 +80122,12 @@ Examples:
79424
80122
  return showPersonaHelp(stdout);
79425
80123
  case void 0:
79426
80124
  stdout.write("Error: persona command requires a subcommand\n\n");
79427
- return showPersonaHelp(stdout);
80125
+ return showPersonaHelp(stdout, 1);
79428
80126
  default:
79429
80127
  stdout.write(`Error: Unknown persona subcommand: ${subcommand}
79430
80128
 
79431
80129
  `);
79432
- return showPersonaHelp(stdout);
80130
+ return showPersonaHelp(stdout, 1);
79433
80131
  }
79434
80132
  }
79435
80133
  }
@@ -83041,7 +83739,7 @@ var require_cli = __commonJS({
83041
83739
  var promises_12 = require("node:fs/promises");
83042
83740
  var node_stream_1 = require("node:stream");
83043
83741
  var yargs_parser_1 = __importDefault2(require_build());
83044
- var VERSION = true ? "0.1.8" : "dev";
83742
+ var VERSION = true ? "0.1.10" : "dev";
83045
83743
  var SANDBOX_ERROR_MESSAGE = `Error: Daemon commands cannot run in sandbox mode.
83046
83744
 
83047
83745
  Claude Code's sandbox blocks Unix socket operations required for daemon IPC.
@@ -83537,6 +84235,7 @@ Run 'sidekick --help' for available options.
83537
84235
  if (sessionId) {
83538
84236
  await persistCliLogMetrics(runtime.stateService, sessionId, runtime.getLogCounts(), runtime.logger);
83539
84237
  }
84238
+ await runtime.logger.flush();
83540
84239
  return result;
83541
84240
  }
83542
84241
  }