@scotthamilton77/sidekick 0.1.7 → 0.1.9

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,90 @@ 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
+ // Decision events
1102
+ "decision:recorded",
1103
+ // Session summary events
1104
+ "session-summary:start",
1105
+ "session-summary:finish",
1106
+ // Session state change events
1107
+ "session-title:changed",
1108
+ "intent:changed",
1109
+ // Snarky message events
1110
+ "snarky-message:start",
1111
+ "snarky-message:finish",
1112
+ // Resume message events
1113
+ "resume-message:start",
1114
+ "resume-message:finish",
1115
+ // Persona events
1116
+ "persona:selected",
1117
+ "persona:changed",
1118
+ // Statusline events
1119
+ "statusline:rendered",
1120
+ // Hook lifecycle events
1121
+ "hook:received",
1122
+ "hook:completed",
1123
+ // Daemon event processing
1124
+ "event:received",
1125
+ "event:processed",
1126
+ // Daemon lifecycle events
1127
+ "daemon:starting",
1128
+ "daemon:started",
1129
+ "ipc:started",
1130
+ "config:watcher-started",
1131
+ "session:eviction-started",
1132
+ // Skipped operation events
1133
+ "session-summary:skipped",
1134
+ "resume-message:skipped",
1135
+ // Error events
1136
+ "statusline:error",
1137
+ // Transcript events
1138
+ "transcript:emitted",
1139
+ "transcript:pre-compact",
1140
+ // General error
1141
+ "error:occurred"
1142
+ ];
1143
+ exports2.UI_EVENT_VISIBILITY = {
1144
+ // Timeline events (user-visible state changes)
1145
+ "reminder:staged": "timeline",
1146
+ "reminder:unstaged": "timeline",
1147
+ "reminder:consumed": "timeline",
1148
+ "reminder:cleared": "timeline",
1149
+ "decision:recorded": "timeline",
1150
+ "session-summary:start": "timeline",
1151
+ "session-summary:finish": "timeline",
1152
+ "session-title:changed": "timeline",
1153
+ "intent:changed": "timeline",
1154
+ "snarky-message:start": "timeline",
1155
+ "snarky-message:finish": "timeline",
1156
+ "resume-message:start": "timeline",
1157
+ "resume-message:finish": "timeline",
1158
+ "persona:selected": "timeline",
1159
+ "persona:changed": "timeline",
1160
+ "statusline:rendered": "timeline",
1161
+ // Both (timeline + log viewer)
1162
+ "hook:received": "both",
1163
+ "hook:completed": "both",
1164
+ "statusline:error": "both",
1165
+ "error:occurred": "both",
1166
+ // Log-only (internal machinery)
1167
+ "event:received": "log",
1168
+ "event:processed": "log",
1169
+ "daemon:starting": "log",
1170
+ "daemon:started": "log",
1171
+ "ipc:started": "log",
1172
+ "config:watcher-started": "log",
1173
+ "session:eviction-started": "log",
1174
+ "session-summary:skipped": "log",
1175
+ "resume-message:skipped": "log",
1176
+ "transcript:emitted": "log",
1177
+ "transcript:pre-compact": "log"
1178
+ };
1095
1179
  }
1096
1180
  });
1097
1181
 
@@ -17228,6 +17312,7 @@ var require_state = __commonJS({
17228
17312
  exports2.createDefaultLLMMetrics = createDefaultLLMMetrics;
17229
17313
  var zod_1 = require_zod();
17230
17314
  var events_js_1 = require_events();
17315
+ var staging_js_1 = require_staging();
17231
17316
  exports2.SessionSummaryStateSchema = zod_1.z.object({
17232
17317
  /** Session identifier */
17233
17318
  session_id: zod_1.z.string(),
@@ -17389,16 +17474,7 @@ var require_state = __commonJS({
17389
17474
  lastMatchedScope: zod_1.z.enum(["project", "package", "file"]).nullable().optional()
17390
17475
  });
17391
17476
  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
- });
17477
+ exports2.CachedReminderSchema = staging_js_1.StagedReminderSchema.omit({ stagedAt: true });
17402
17478
  exports2.ReminderThrottleEntrySchema = zod_1.z.object({
17403
17479
  /** Number of conversation messages since the reminder was last staged */
17404
17480
  messagesSinceLastStaging: zod_1.z.number().int().nonnegative(),
@@ -17979,6 +18055,24 @@ var require_setup_status = __commonJS({
17979
18055
  }
17980
18056
  });
17981
18057
 
18058
+ // ../types/dist/state.js
18059
+ var require_state2 = __commonJS({
18060
+ "../types/dist/state.js"(exports2) {
18061
+ "use strict";
18062
+ Object.defineProperty(exports2, "__esModule", { value: true });
18063
+ exports2.ProjectRegistryEntrySchema = void 0;
18064
+ var zod_1 = require_zod();
18065
+ exports2.ProjectRegistryEntrySchema = zod_1.z.object({
18066
+ /** Absolute filesystem path to the project root */
18067
+ path: zod_1.z.string(),
18068
+ /** Human-readable project name (derived from directory name) */
18069
+ displayName: zod_1.z.string(),
18070
+ /** ISO 8601 timestamp of last daemon activity */
18071
+ lastActive: zod_1.z.iso.datetime()
18072
+ });
18073
+ }
18074
+ });
18075
+
17982
18076
  // ../types/dist/index.js
17983
18077
  var require_dist = __commonJS({
17984
18078
  "../types/dist/index.js"(exports2) {
@@ -18010,6 +18104,7 @@ var require_dist = __commonJS({
18010
18104
  __exportStar(require_tasks(), exports2);
18011
18105
  __exportStar(require_hook_input(), exports2);
18012
18106
  __exportStar(require_setup_status(), exports2);
18107
+ __exportStar(require_state2(), exports2);
18013
18108
  }
18014
18109
  });
18015
18110
 
@@ -27755,9 +27850,13 @@ var require_config2 = __commonJS({
27755
27850
  state: v4_1.z.string(),
27756
27851
  assets: v4_1.z.string().optional()
27757
27852
  }).strict();
27853
+ var ProjectsSchema = v4_1.z.object({
27854
+ retentionDays: v4_1.z.number().min(1)
27855
+ }).strict();
27758
27856
  var DaemonSchema = v4_1.z.object({
27759
27857
  idleTimeoutMs: v4_1.z.number().min(0),
27760
- shutdownTimeoutMs: v4_1.z.number().min(0)
27858
+ shutdownTimeoutMs: v4_1.z.number().min(0),
27859
+ projects: ProjectsSchema.default({ retentionDays: 30 })
27761
27860
  }).strict();
27762
27861
  var IpcSchema = v4_1.z.object({
27763
27862
  connectTimeoutMs: v4_1.z.number().min(0),
@@ -45661,7 +45760,7 @@ var require_structured_logging = __commonJS({
45661
45760
  */
45662
45761
  hookReceived(context, metadata) {
45663
45762
  return {
45664
- type: "HookReceived",
45763
+ type: "hook:received",
45665
45764
  time: Date.now(),
45666
45765
  source: "cli",
45667
45766
  context: {
@@ -45671,7 +45770,9 @@ var require_structured_logging = __commonJS({
45671
45770
  hook: context.hook
45672
45771
  },
45673
45772
  payload: {
45674
- metadata
45773
+ hook: context.hook,
45774
+ cwd: metadata.cwd,
45775
+ mode: metadata.mode
45675
45776
  }
45676
45777
  };
45677
45778
  },
@@ -45680,7 +45781,7 @@ var require_structured_logging = __commonJS({
45680
45781
  */
45681
45782
  hookCompleted(context, metadata, state) {
45682
45783
  return {
45683
- type: "HookCompleted",
45784
+ type: "hook:completed",
45684
45785
  time: Date.now(),
45685
45786
  source: "cli",
45686
45787
  context: {
@@ -45690,8 +45791,10 @@ var require_structured_logging = __commonJS({
45690
45791
  hook: context.hook
45691
45792
  },
45692
45793
  payload: {
45693
- state,
45694
- metadata
45794
+ hook: context.hook,
45795
+ durationMs: metadata.durationMs,
45796
+ reminderReturned: state?.reminderReturned,
45797
+ responseType: state?.responseType
45695
45798
  }
45696
45799
  };
45697
45800
  },
@@ -45701,7 +45804,7 @@ var require_structured_logging = __commonJS({
45701
45804
  */
45702
45805
  eventReceived(context, metadata) {
45703
45806
  return {
45704
- type: "EventReceived",
45807
+ type: "event:received",
45705
45808
  time: Date.now(),
45706
45809
  source: "daemon",
45707
45810
  context: {
@@ -45712,7 +45815,9 @@ var require_structured_logging = __commonJS({
45712
45815
  taskId: context.taskId
45713
45816
  },
45714
45817
  payload: {
45715
- metadata
45818
+ eventKind: metadata.eventKind,
45819
+ ...metadata.eventType !== void 0 && { eventType: metadata.eventType },
45820
+ ...metadata.hook !== void 0 && { hook: metadata.hook }
45716
45821
  }
45717
45822
  };
45718
45823
  },
@@ -45722,7 +45827,7 @@ var require_structured_logging = __commonJS({
45722
45827
  */
45723
45828
  eventProcessed(context, state, metadata) {
45724
45829
  return {
45725
- type: "EventProcessed",
45830
+ type: "event:processed",
45726
45831
  time: Date.now(),
45727
45832
  source: "daemon",
45728
45833
  context: {
@@ -45733,17 +45838,19 @@ var require_structured_logging = __commonJS({
45733
45838
  taskId: context.taskId
45734
45839
  },
45735
45840
  payload: {
45736
- state,
45737
- metadata
45841
+ handlerId: state.handlerId,
45842
+ success: state.success,
45843
+ durationMs: metadata.durationMs,
45844
+ error: metadata.error
45738
45845
  }
45739
45846
  };
45740
45847
  },
45741
45848
  /**
45742
45849
  * Create a ReminderStaged event (logged when Daemon stages a reminder file).
45743
45850
  */
45744
- reminderStaged(context, state, metadata) {
45851
+ reminderStaged(context, state, _metadata) {
45745
45852
  return {
45746
- type: "ReminderStaged",
45853
+ type: "reminder:staged",
45747
45854
  time: Date.now(),
45748
45855
  source: "daemon",
45749
45856
  context: {
@@ -45754,8 +45861,11 @@ var require_structured_logging = __commonJS({
45754
45861
  taskId: context.taskId
45755
45862
  },
45756
45863
  payload: {
45757
- state,
45758
- metadata
45864
+ reminderName: state.reminderName,
45865
+ hookName: state.hookName,
45866
+ blocking: state.blocking,
45867
+ priority: state.priority,
45868
+ persistent: state.persistent
45759
45869
  }
45760
45870
  };
45761
45871
  },
@@ -45765,14 +45875,15 @@ var require_structured_logging = __commonJS({
45765
45875
  */
45766
45876
  daemonStarting(metadata) {
45767
45877
  return {
45768
- type: "DaemonStarting",
45878
+ type: "daemon:starting",
45769
45879
  time: Date.now(),
45770
45880
  source: "daemon",
45771
45881
  context: {
45772
45882
  sessionId: ""
45773
45883
  },
45774
45884
  payload: {
45775
- metadata
45885
+ projectDir: metadata.projectDir,
45886
+ pid: metadata.pid
45776
45887
  }
45777
45888
  };
45778
45889
  },
@@ -45781,14 +45892,14 @@ var require_structured_logging = __commonJS({
45781
45892
  */
45782
45893
  daemonStarted(metadata) {
45783
45894
  return {
45784
- type: "DaemonStarted",
45895
+ type: "daemon:started",
45785
45896
  time: Date.now(),
45786
45897
  source: "daemon",
45787
45898
  context: {
45788
45899
  sessionId: ""
45789
45900
  },
45790
45901
  payload: {
45791
- metadata
45902
+ startupDurationMs: metadata.startupDurationMs
45792
45903
  }
45793
45904
  };
45794
45905
  },
@@ -45797,14 +45908,14 @@ var require_structured_logging = __commonJS({
45797
45908
  */
45798
45909
  ipcServerStarted(metadata) {
45799
45910
  return {
45800
- type: "IpcServerStarted",
45911
+ type: "ipc:started",
45801
45912
  time: Date.now(),
45802
45913
  source: "daemon",
45803
45914
  context: {
45804
45915
  sessionId: ""
45805
45916
  },
45806
45917
  payload: {
45807
- metadata
45918
+ socketPath: metadata.socketPath
45808
45919
  }
45809
45920
  };
45810
45921
  },
@@ -45813,14 +45924,15 @@ var require_structured_logging = __commonJS({
45813
45924
  */
45814
45925
  configWatcherStarted(metadata) {
45815
45926
  return {
45816
- type: "ConfigWatcherStarted",
45927
+ type: "config:watcher-started",
45817
45928
  time: Date.now(),
45818
45929
  source: "daemon",
45819
45930
  context: {
45820
45931
  sessionId: ""
45821
45932
  },
45822
45933
  payload: {
45823
- metadata
45934
+ projectDir: metadata.projectDir,
45935
+ watchedFiles: metadata.watchedFiles
45824
45936
  }
45825
45937
  };
45826
45938
  },
@@ -45829,14 +45941,14 @@ var require_structured_logging = __commonJS({
45829
45941
  */
45830
45942
  sessionEvictionStarted(metadata) {
45831
45943
  return {
45832
- type: "SessionEvictionStarted",
45944
+ type: "session:eviction-started",
45833
45945
  time: Date.now(),
45834
45946
  source: "daemon",
45835
45947
  context: {
45836
45948
  sessionId: ""
45837
45949
  },
45838
45950
  payload: {
45839
- metadata
45951
+ intervalMs: metadata.intervalMs
45840
45952
  }
45841
45953
  };
45842
45954
  },
@@ -45847,7 +45959,7 @@ var require_structured_logging = __commonJS({
45847
45959
  */
45848
45960
  statuslineRendered(context, state, metadata) {
45849
45961
  return {
45850
- type: "StatuslineRendered",
45962
+ type: "statusline:rendered",
45851
45963
  time: Date.now(),
45852
45964
  source: "cli",
45853
45965
  context: {
@@ -45858,8 +45970,11 @@ var require_structured_logging = __commonJS({
45858
45970
  taskId: context.taskId
45859
45971
  },
45860
45972
  payload: {
45861
- state,
45862
- metadata
45973
+ displayMode: state.displayMode,
45974
+ staleData: state.staleData,
45975
+ model: metadata.model,
45976
+ tokens: metadata.tokens,
45977
+ durationMs: metadata.durationMs
45863
45978
  }
45864
45979
  };
45865
45980
  },
@@ -45869,7 +45984,7 @@ var require_structured_logging = __commonJS({
45869
45984
  */
45870
45985
  statuslineError(context, reason, metadata) {
45871
45986
  return {
45872
- type: "StatuslineError",
45987
+ type: "statusline:error",
45873
45988
  time: Date.now(),
45874
45989
  source: "cli",
45875
45990
  context: {
@@ -45881,7 +45996,9 @@ var require_structured_logging = __commonJS({
45881
45996
  },
45882
45997
  payload: {
45883
45998
  reason,
45884
- metadata
45999
+ file: metadata.file,
46000
+ fallbackUsed: metadata.fallbackUsed,
46001
+ error: metadata.error
45885
46002
  }
45886
46003
  };
45887
46004
  },
@@ -45892,7 +46009,7 @@ var require_structured_logging = __commonJS({
45892
46009
  */
45893
46010
  resumeGenerating(context, metadata) {
45894
46011
  return {
45895
- type: "ResumeGenerating",
46012
+ type: "resume-message:start",
45896
46013
  time: Date.now(),
45897
46014
  source: "daemon",
45898
46015
  context: {
@@ -45903,8 +46020,8 @@ var require_structured_logging = __commonJS({
45903
46020
  taskId: context.taskId
45904
46021
  },
45905
46022
  payload: {
45906
- metadata,
45907
- reason: "pivot_detected"
46023
+ title_confidence: metadata.title_confidence,
46024
+ intent_confidence: metadata.intent_confidence
45908
46025
  }
45909
46026
  };
45910
46027
  },
@@ -45914,7 +46031,7 @@ var require_structured_logging = __commonJS({
45914
46031
  */
45915
46032
  resumeUpdated(context, state) {
45916
46033
  return {
45917
- type: "ResumeUpdated",
46034
+ type: "resume-message:finish",
45918
46035
  time: Date.now(),
45919
46036
  source: "daemon",
45920
46037
  context: {
@@ -45925,8 +46042,8 @@ var require_structured_logging = __commonJS({
45925
46042
  taskId: context.taskId
45926
46043
  },
45927
46044
  payload: {
45928
- state,
45929
- reason: "generation_complete"
46045
+ snarky_comment: state.snarky_comment,
46046
+ timestamp: state.timestamp
45930
46047
  }
45931
46048
  };
45932
46049
  },
@@ -45936,7 +46053,7 @@ var require_structured_logging = __commonJS({
45936
46053
  */
45937
46054
  resumeSkipped(context, metadata, reason) {
45938
46055
  return {
45939
- type: "ResumeSkipped",
46056
+ type: "resume-message:skipped",
45940
46057
  time: Date.now(),
45941
46058
  source: "daemon",
45942
46059
  context: {
@@ -45947,11 +46064,50 @@ var require_structured_logging = __commonJS({
45947
46064
  taskId: context.taskId
45948
46065
  },
45949
46066
  payload: {
45950
- metadata,
46067
+ title_confidence: metadata.title_confidence,
46068
+ intent_confidence: metadata.intent_confidence,
46069
+ min_confidence: metadata.min_confidence,
45951
46070
  reason
45952
46071
  }
45953
46072
  };
45954
46073
  },
46074
+ // --- Persona Events ---
46075
+ /**
46076
+ * Create a PersonaSelected event (logged when a persona is selected for a session).
46077
+ */
46078
+ personaSelected(context, payload) {
46079
+ return {
46080
+ type: "persona:selected",
46081
+ time: Date.now(),
46082
+ source: "daemon",
46083
+ context: {
46084
+ sessionId: context.sessionId,
46085
+ correlationId: context.correlationId,
46086
+ traceId: context.traceId,
46087
+ hook: context.hook,
46088
+ taskId: context.taskId
46089
+ },
46090
+ payload
46091
+ };
46092
+ },
46093
+ /**
46094
+ * Create a PersonaChanged event (logged when persona changes mid-session).
46095
+ */
46096
+ personaChanged(context, payload) {
46097
+ return {
46098
+ type: "persona:changed",
46099
+ time: Date.now(),
46100
+ source: "daemon",
46101
+ context: {
46102
+ sessionId: context.sessionId,
46103
+ correlationId: context.correlationId,
46104
+ traceId: context.traceId,
46105
+ hook: context.hook,
46106
+ taskId: context.taskId
46107
+ },
46108
+ payload
46109
+ };
46110
+ },
45955
46111
  // --- Transcript Events (logged to transcript-events.log) ---
45956
46112
  /**
45957
46113
  * Create a TranscriptEventEmitted event (logged when TranscriptService emits an event).
@@ -45959,7 +46115,7 @@ var require_structured_logging = __commonJS({
45959
46115
  */
45960
46116
  transcriptEventEmitted(context, state, metadata) {
45961
46117
  return {
45962
- type: "TranscriptEventEmitted",
46118
+ type: "transcript:emitted",
45963
46119
  time: Date.now(),
45964
46120
  source: "transcript",
45965
46121
  context: {
@@ -45970,8 +46126,13 @@ var require_structured_logging = __commonJS({
45970
46126
  taskId: context.taskId
45971
46127
  },
45972
46128
  payload: {
45973
- state,
45974
- metadata
46129
+ eventType: state.eventType,
46130
+ lineNumber: state.lineNumber,
46131
+ uuid: state.uuid,
46132
+ toolName: state.toolName,
46133
+ transcriptPath: metadata.transcriptPath,
46134
+ contentPreview: metadata.contentPreview,
46135
+ metrics: metadata.metrics
45975
46136
  }
45976
46137
  };
45977
46138
  },
@@ -45981,7 +46142,7 @@ var require_structured_logging = __commonJS({
45981
46142
  */
45982
46143
  preCompactCaptured(context, state, metadata) {
45983
46144
  return {
45984
- type: "PreCompactCaptured",
46145
+ type: "transcript:pre-compact",
45985
46146
  time: Date.now(),
45986
46147
  source: "transcript",
45987
46148
  context: {
@@ -45992,18 +46153,45 @@ var require_structured_logging = __commonJS({
45992
46153
  taskId: context.taskId
45993
46154
  },
45994
46155
  payload: {
45995
- state,
45996
- metadata,
45997
- reason: "pre_compact_hook"
46156
+ snapshotPath: state.snapshotPath,
46157
+ lineCount: state.lineCount,
46158
+ transcriptPath: metadata.transcriptPath,
46159
+ metrics: metadata.metrics
46160
+ }
46161
+ };
46162
+ },
46163
+ // --- Error Events ---
46164
+ /**
46165
+ * Create an ErrorOccurred event (logged when error/fatal level log is emitted).
46166
+ * Emitted automatically by HookableLogger hook — no manual call-site changes needed.
46167
+ */
46168
+ daemonErrorOccurred(context, state) {
46169
+ return {
46170
+ type: "error:occurred",
46171
+ time: Date.now(),
46172
+ source: "daemon",
46173
+ context: {
46174
+ sessionId: context.sessionId,
46175
+ correlationId: context.correlationId,
46176
+ traceId: context.traceId,
46177
+ hook: context.hook,
46178
+ taskId: context.taskId
46179
+ },
46180
+ payload: {
46181
+ errorMessage: state.errorMessage,
46182
+ errorStack: state.errorStack
45998
46183
  }
45999
46184
  };
46000
46185
  }
46001
46186
  };
46002
46187
  function logEvent(logger, event) {
46003
- logger.info(event.payload.reason ?? `${event.type}`, {
46188
+ const payload = event.payload;
46189
+ const meta = payload != null && typeof payload === "object" ? payload : {};
46190
+ const reason = "reason" in meta ? String(meta.reason) : void 0;
46191
+ logger.info(reason ?? `${event.type}`, {
46004
46192
  type: event.type,
46005
46193
  source: event.source,
46006
- ...event.payload
46194
+ ...meta
46007
46195
  });
46008
46196
  }
46009
46197
  function setupGlobalErrorHandlers(logger) {
@@ -61136,7 +61324,7 @@ var require_log_metrics_descriptors = __commonJS({
61136
61324
  });
61137
61325
 
61138
61326
  // ../sidekick-core/dist/state/index.js
61139
- var require_state2 = __commonJS({
61327
+ var require_state3 = __commonJS({
61140
61328
  "../sidekick-core/dist/state/index.js"(exports2) {
61141
61329
  "use strict";
61142
61330
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -61235,7 +61423,7 @@ var require_transcript_service = __commonJS({
61235
61423
  var node_readline_12 = require("node:readline");
61236
61424
  var node_path_1 = require("node:path");
61237
61425
  var structured_logging_js_1 = require_structured_logging();
61238
- var index_js_1 = require_state2();
61426
+ var index_js_1 = require_state3();
61239
61427
  var EXCLUDED_BUILTIN_COMMANDS = /* @__PURE__ */ new Set([
61240
61428
  "/add-dir",
61241
61429
  "/agents",
@@ -63205,6 +63393,120 @@ var require_hookable_logger = __commonJS({
63205
63393
  }
63206
63394
  });
63207
63395
 
63396
+ // ../sidekick-core/dist/project-registry.js
63397
+ var require_project_registry = __commonJS({
63398
+ "../sidekick-core/dist/project-registry.js"(exports2) {
63399
+ "use strict";
63400
+ var __importDefault2 = exports2 && exports2.__importDefault || function(mod) {
63401
+ return mod && mod.__esModule ? mod : { "default": mod };
63402
+ };
63403
+ Object.defineProperty(exports2, "__esModule", { value: true });
63404
+ exports2.ProjectRegistryService = void 0;
63405
+ exports2.encodeProjectDir = encodeProjectDir;
63406
+ var node_fs_1 = require("node:fs");
63407
+ var promises_12 = __importDefault2(require("node:fs/promises"));
63408
+ var node_crypto_1 = require("node:crypto");
63409
+ var node_path_1 = require("node:path");
63410
+ var types_1 = require_dist();
63411
+ function encodeProjectDir(absPath) {
63412
+ return absPath.replace(/\//g, "-");
63413
+ }
63414
+ var REGISTRY_FILE = "registry.json";
63415
+ var ProjectRegistryService = class {
63416
+ registryRoot;
63417
+ constructor(registryRoot) {
63418
+ this.registryRoot = registryRoot;
63419
+ }
63420
+ /**
63421
+ * Register or update a project in the registry.
63422
+ * Creates the directory and writes registry.json with current timestamp.
63423
+ */
63424
+ async register(projectDir) {
63425
+ const encoded = encodeProjectDir(projectDir);
63426
+ const entryDir = (0, node_path_1.join)(this.registryRoot, encoded);
63427
+ const entryFile = (0, node_path_1.join)(entryDir, REGISTRY_FILE);
63428
+ await promises_12.default.mkdir(entryDir, { recursive: true });
63429
+ const entry = {
63430
+ path: projectDir,
63431
+ displayName: (0, node_path_1.basename)(projectDir),
63432
+ lastActive: (/* @__PURE__ */ new Date()).toISOString()
63433
+ };
63434
+ const tmpPath = `${entryFile}.${(0, node_crypto_1.randomBytes)(6).toString("hex")}.tmp`;
63435
+ try {
63436
+ await promises_12.default.writeFile(tmpPath, JSON.stringify(entry, null, 2), "utf-8");
63437
+ await promises_12.default.rename(tmpPath, entryFile);
63438
+ } catch (err) {
63439
+ await promises_12.default.unlink(tmpPath).catch(() => {
63440
+ });
63441
+ throw err;
63442
+ }
63443
+ }
63444
+ /**
63445
+ * List all valid registered projects.
63446
+ * Skips entries with missing/invalid registry.json.
63447
+ */
63448
+ async list() {
63449
+ if (!(0, node_fs_1.existsSync)(this.registryRoot)) {
63450
+ return [];
63451
+ }
63452
+ const entries = [];
63453
+ const dirents = await promises_12.default.readdir(this.registryRoot, { withFileTypes: true });
63454
+ for (const dirent of dirents) {
63455
+ if (!dirent.isDirectory())
63456
+ continue;
63457
+ const entryFile = (0, node_path_1.join)(this.registryRoot, dirent.name, REGISTRY_FILE);
63458
+ try {
63459
+ const raw = await promises_12.default.readFile(entryFile, "utf-8");
63460
+ const parsed = types_1.ProjectRegistryEntrySchema.parse(JSON.parse(raw));
63461
+ entries.push(parsed);
63462
+ } catch {
63463
+ }
63464
+ }
63465
+ return entries;
63466
+ }
63467
+ /**
63468
+ * Prune stale registry entries.
63469
+ * Removes entries where the project path no longer exists
63470
+ * or lastActive is older than retentionDays.
63471
+ */
63472
+ async prune(options) {
63473
+ if (!(0, node_fs_1.existsSync)(this.registryRoot)) {
63474
+ return [];
63475
+ }
63476
+ const pruned = [];
63477
+ const cutoff = Date.now() - options.retentionDays * 24 * 60 * 60 * 1e3;
63478
+ const dirents = await promises_12.default.readdir(this.registryRoot, { withFileTypes: true });
63479
+ for (const dirent of dirents) {
63480
+ if (!dirent.isDirectory())
63481
+ continue;
63482
+ const entryDir = (0, node_path_1.join)(this.registryRoot, dirent.name);
63483
+ const entryFile = (0, node_path_1.join)(entryDir, REGISTRY_FILE);
63484
+ let entry;
63485
+ try {
63486
+ const raw = await promises_12.default.readFile(entryFile, "utf-8");
63487
+ entry = types_1.ProjectRegistryEntrySchema.parse(JSON.parse(raw));
63488
+ } catch {
63489
+ await promises_12.default.rm(entryDir, { recursive: true, force: true });
63490
+ continue;
63491
+ }
63492
+ let reason = null;
63493
+ if (!(0, node_fs_1.existsSync)(entry.path)) {
63494
+ reason = "path-missing";
63495
+ } else if (new Date(entry.lastActive).getTime() < cutoff) {
63496
+ reason = "age-exceeded";
63497
+ }
63498
+ if (reason) {
63499
+ await promises_12.default.rm(entryDir, { recursive: true, force: true });
63500
+ pruned.push({ path: entry.path, reason });
63501
+ }
63502
+ }
63503
+ return pruned;
63504
+ }
63505
+ };
63506
+ exports2.ProjectRegistryService = ProjectRegistryService;
63507
+ }
63508
+ });
63509
+
63208
63510
  // ../sidekick-core/dist/daemon-health.js
63209
63511
  var require_daemon_health = __commonJS({
63210
63512
  "../sidekick-core/dist/daemon-health.js"(exports2) {
@@ -63448,7 +63750,7 @@ var require_dist4 = __commonJS({
63448
63750
  };
63449
63751
  Object.defineProperty(exports2, "__esModule", { value: true });
63450
63752
  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;
63753
+ 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
63754
  var types_1 = require_dist();
63453
63755
  Object.defineProperty(exports2, "TaskTypes", { enumerable: true, get: function() {
63454
63756
  return types_1.TaskTypes;
@@ -63721,7 +64023,7 @@ var require_dist4 = __commonJS({
63721
64023
  Object.defineProperty(exports2, "createHookableLogger", { enumerable: true, get: function() {
63722
64024
  return hookable_logger_1.createHookableLogger;
63723
64025
  } });
63724
- var index_js_1 = require_state2();
64026
+ var index_js_1 = require_state3();
63725
64027
  Object.defineProperty(exports2, "StateService", { enumerable: true, get: function() {
63726
64028
  return index_js_1.StateService;
63727
64029
  } });
@@ -63758,6 +64060,13 @@ var require_dist4 = __commonJS({
63758
64060
  Object.defineProperty(exports2, "DaemonGlobalLogMetricsDescriptor", { enumerable: true, get: function() {
63759
64061
  return index_js_1.DaemonGlobalLogMetricsDescriptor;
63760
64062
  } });
64063
+ var project_registry_1 = require_project_registry();
64064
+ Object.defineProperty(exports2, "encodeProjectDir", { enumerable: true, get: function() {
64065
+ return project_registry_1.encodeProjectDir;
64066
+ } });
64067
+ Object.defineProperty(exports2, "ProjectRegistryService", { enumerable: true, get: function() {
64068
+ return project_registry_1.ProjectRegistryService;
64069
+ } });
63761
64070
  var daemon_health_1 = require_daemon_health();
63762
64071
  Object.defineProperty(exports2, "readDaemonHealth", { enumerable: true, get: function() {
63763
64072
  return daemon_health_1.readDaemonHealth;
@@ -70982,7 +71291,6 @@ var require_reminder_utils = __commonJS({
70982
71291
  blocking: zod_1.z.boolean(),
70983
71292
  priority: zod_1.z.number(),
70984
71293
  persistent: zod_1.z.boolean(),
70985
- throttle: zod_1.z.boolean().optional(),
70986
71294
  userMessage: zod_1.z.string().optional(),
70987
71295
  additionalContext: zod_1.z.string().optional(),
70988
71296
  reason: zod_1.z.string().optional()
@@ -71033,7 +71341,6 @@ var require_reminder_utils = __commonJS({
71033
71341
  blocking: def.blocking,
71034
71342
  priority: def.priority,
71035
71343
  persistent: def.persistent,
71036
- throttle: def.throttle,
71037
71344
  userMessage: def.userMessage ? interpolateTemplate(def.userMessage, context) : void 0,
71038
71345
  additionalContext: def.additionalContext ? interpolateTemplate(def.additionalContext, context) : void 0,
71039
71346
  reason: def.reason ? interpolateTemplate(def.reason, context) : void 0
@@ -71358,7 +71665,7 @@ var require_types2 = __commonJS({
71358
71665
  });
71359
71666
 
71360
71667
  // ../feature-reminders/dist/state.js
71361
- var require_state3 = __commonJS({
71668
+ var require_state4 = __commonJS({
71362
71669
  "../feature-reminders/dist/state.js"(exports2) {
71363
71670
  "use strict";
71364
71671
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -71399,7 +71706,7 @@ var require_throttle_utils = __commonJS({
71399
71706
  Object.defineProperty(exports2, "__esModule", { value: true });
71400
71707
  exports2.registerThrottledReminder = registerThrottledReminder;
71401
71708
  exports2.resetThrottleCounters = resetThrottleCounters;
71402
- var state_js_1 = require_state3();
71709
+ var state_js_1 = require_state4();
71403
71710
  async function registerThrottledReminder(ctx, sessionId, reminderId, targetHook, resolvedReminder) {
71404
71711
  const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
71405
71712
  const result = await remindersState.reminderThrottle.read(sessionId);
@@ -71434,7 +71741,7 @@ var require_stage_default_user_prompt = __commonJS({
71434
71741
  var staging_handler_utils_js_1 = require_staging_handler_utils();
71435
71742
  var types_js_1 = require_types2();
71436
71743
  var reminder_utils_js_1 = require_reminder_utils();
71437
- var state_js_1 = require_state3();
71744
+ var state_js_1 = require_state4();
71438
71745
  var throttle_utils_js_1 = require_throttle_utils();
71439
71746
  function registerStageDefaultUserPrompt(context) {
71440
71747
  (0, staging_handler_utils_js_1.createStagingHandler)(context, {
@@ -71599,7 +71906,7 @@ var require_stage_pause_and_reflect = __commonJS({
71599
71906
  var types_1 = require_dist();
71600
71907
  var staging_handler_utils_js_1 = require_staging_handler_utils();
71601
71908
  var types_js_1 = require_types2();
71602
- var state_js_1 = require_state3();
71909
+ var state_js_1 = require_state4();
71603
71910
  function registerStagePauseAndReflect(context) {
71604
71911
  (0, staging_handler_utils_js_1.createStagingHandler)(context, {
71605
71912
  id: "reminders:stage-pause-and-reflect",
@@ -73165,6 +73472,86 @@ var require_picomatch2 = __commonJS({
73165
73472
  }
73166
73473
  });
73167
73474
 
73475
+ // ../feature-reminders/dist/events.js
73476
+ var require_events2 = __commonJS({
73477
+ "../feature-reminders/dist/events.js"(exports2) {
73478
+ "use strict";
73479
+ Object.defineProperty(exports2, "__esModule", { value: true });
73480
+ exports2.ReminderEvents = void 0;
73481
+ exports2.ReminderEvents = {
73482
+ /**
73483
+ * Create a ReminderConsumed event (logged when CLI returns a staged reminder).
73484
+ */
73485
+ reminderConsumed(context, state, _metadata) {
73486
+ return {
73487
+ type: "reminder:consumed",
73488
+ time: Date.now(),
73489
+ source: "cli",
73490
+ context: {
73491
+ sessionId: context.sessionId,
73492
+ correlationId: context.correlationId,
73493
+ traceId: context.traceId,
73494
+ hook: context.hook,
73495
+ taskId: context.taskId
73496
+ },
73497
+ payload: {
73498
+ reminderName: state.reminderName,
73499
+ reminderReturned: state.reminderReturned,
73500
+ blocking: state.blocking,
73501
+ priority: state.priority,
73502
+ persistent: state.persistent
73503
+ }
73504
+ };
73505
+ },
73506
+ // Note: reminderStaged stays in @sidekick/core (used by staging-service.ts, circular dep)
73507
+ /**
73508
+ * Create a ReminderUnstaged event (logged when a reminder is removed from staging).
73509
+ */
73510
+ reminderUnstaged(context, state) {
73511
+ return {
73512
+ type: "reminder:unstaged",
73513
+ time: Date.now(),
73514
+ source: "daemon",
73515
+ context: {
73516
+ sessionId: context.sessionId,
73517
+ correlationId: context.correlationId,
73518
+ traceId: context.traceId,
73519
+ hook: context.hook,
73520
+ taskId: context.taskId
73521
+ },
73522
+ payload: {
73523
+ reminderName: state.reminderName,
73524
+ hookName: state.hookName,
73525
+ reason: state.reason
73526
+ }
73527
+ };
73528
+ },
73529
+ /**
73530
+ * Create a RemindersCleared event (logged when staging directory is cleaned).
73531
+ */
73532
+ remindersCleared(context, state, reason) {
73533
+ return {
73534
+ type: "reminder:cleared",
73535
+ time: Date.now(),
73536
+ source: "daemon",
73537
+ context: {
73538
+ sessionId: context.sessionId,
73539
+ correlationId: context.correlationId,
73540
+ traceId: context.traceId,
73541
+ hook: context.hook,
73542
+ taskId: context.taskId
73543
+ },
73544
+ payload: {
73545
+ clearedCount: state.clearedCount,
73546
+ hookNames: state.hookNames,
73547
+ reason
73548
+ }
73549
+ };
73550
+ }
73551
+ };
73552
+ }
73553
+ });
73554
+
73168
73555
  // ../feature-reminders/dist/tool-pattern-matcher.js
73169
73556
  var require_tool_pattern_matcher = __commonJS({
73170
73557
  "../feature-reminders/dist/tool-pattern-matcher.js"(exports2) {
@@ -73217,12 +73604,14 @@ var require_track_verification_tools = __commonJS({
73217
73604
  Object.defineProperty(exports2, "__esModule", { value: true });
73218
73605
  exports2.registerTrackVerificationTools = registerTrackVerificationTools;
73219
73606
  exports2.stageToolsForFiles = stageToolsForFiles;
73607
+ var core_1 = require_dist4();
73608
+ var events_js_1 = require_events2();
73220
73609
  var types_1 = require_dist();
73221
73610
  var picomatch_1 = __importDefault2(require_picomatch2());
73222
73611
  var tool_pattern_matcher_js_1 = require_tool_pattern_matcher();
73223
73612
  var reminder_utils_js_1 = require_reminder_utils();
73224
73613
  var types_js_1 = require_types2();
73225
- var state_js_1 = require_state3();
73614
+ var state_js_1 = require_state4();
73226
73615
  var FILE_EDIT_TOOLS = ["Write", "Edit", "MultiEdit"];
73227
73616
  var TOOL_REMINDER_MAP = {
73228
73617
  build: types_js_1.ReminderIds.VC_BUILD,
@@ -73363,6 +73752,7 @@ var require_track_verification_tools = __commonJS({
73363
73752
  lastMatchedScope: match.scope
73364
73753
  };
73365
73754
  await daemonCtx.staging.deleteReminder("Stop", reminderId);
73755
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, { reminderName: reminderId, hookName: "Stop", reason: "tool_verified" }));
73366
73756
  anyUnstaged = true;
73367
73757
  daemonCtx.logger.debug("VC tool verified", {
73368
73758
  toolName,
@@ -73377,6 +73767,7 @@ var require_track_verification_tools = __commonJS({
73377
73767
  const hasPerToolReminders = remaining.some((r) => VC_TOOL_NAME_SET.has(r.name));
73378
73768
  if (!hasPerToolReminders) {
73379
73769
  await daemonCtx.staging.deleteReminder("Stop", types_js_1.ReminderIds.VERIFY_COMPLETION);
73770
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, { reminderName: types_js_1.ReminderIds.VERIFY_COMPLETION, hookName: "Stop", reason: "all_tools_verified" }));
73380
73771
  daemonCtx.logger.info("All VC tools verified, unstaged wrapper", { sessionId });
73381
73772
  }
73382
73773
  await remindersState.verificationTools.write(sessionId, toolsState);
@@ -73416,7 +73807,7 @@ var require_stage_stop_bash_changes = __commonJS({
73416
73807
  var picomatch_1 = __importDefault2(require_picomatch2());
73417
73808
  var track_verification_tools_js_1 = require_track_verification_tools();
73418
73809
  var types_js_1 = require_types2();
73419
- var state_js_1 = require_state3();
73810
+ var state_js_1 = require_state4();
73420
73811
  var GIT_STATUS_TIMEOUT_MS = 200;
73421
73812
  var MAX_BASELINES = 50;
73422
73813
  function registerStageBashChanges(context) {
@@ -73528,10 +73919,12 @@ var require_unstage_verify_completion = __commonJS({
73528
73919
  "use strict";
73529
73920
  Object.defineProperty(exports2, "__esModule", { value: true });
73530
73921
  exports2.registerUnstageVerifyCompletion = registerUnstageVerifyCompletion;
73922
+ var core_1 = require_dist4();
73923
+ var events_js_1 = require_events2();
73531
73924
  var types_1 = require_dist();
73532
73925
  var types_js_1 = require_types2();
73533
73926
  var reminder_utils_js_1 = require_reminder_utils();
73534
- var state_js_1 = require_state3();
73927
+ var state_js_1 = require_state4();
73535
73928
  function registerUnstageVerifyCompletion(context) {
73536
73929
  if (!(0, types_1.isDaemonContext)(context))
73537
73930
  return;
@@ -73550,6 +73943,7 @@ var require_unstage_verify_completion = __commonJS({
73550
73943
  if (!sessionId) {
73551
73944
  daemonCtx.logger.warn("No sessionId in UserPromptSubmit event");
73552
73945
  await daemonCtx.staging.deleteReminder("Stop", types_js_1.ReminderIds.VERIFY_COMPLETION);
73946
+ (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
73947
  return;
73554
73948
  }
73555
73949
  const remindersState = (0, state_js_1.createRemindersState)(daemonCtx.stateService);
@@ -73630,8 +74024,11 @@ var require_unstage_verify_completion = __commonJS({
73630
74024
  hadState: unverifiedState !== null
73631
74025
  });
73632
74026
  }
74027
+ const eventContext = { sessionId };
74028
+ const reason = unverifiedState?.hasUnverifiedChanges ? "cycle_limit_reached" : "no_unverified_changes";
73633
74029
  for (const vcId of types_js_1.ALL_VC_REMINDER_IDS) {
73634
74030
  await daemonCtx.staging.deleteReminder("Stop", vcId);
74031
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, { reminderName: vcId, hookName: "Stop", reason }));
73635
74032
  }
73636
74033
  daemonCtx.logger.debug("VC unstage: deleted all VC reminders");
73637
74034
  }
@@ -73649,6 +74046,7 @@ var require_stage_persona_reminders = __commonJS({
73649
74046
  exports2.stagePersonaRemindersForSession = stagePersonaRemindersForSession;
73650
74047
  exports2.registerStagePersonaReminders = registerStagePersonaReminders;
73651
74048
  var core_1 = require_dist4();
74049
+ var events_js_1 = require_events2();
73652
74050
  var types_1 = require_dist();
73653
74051
  var reminder_utils_js_1 = require_reminder_utils();
73654
74052
  var types_js_1 = require_types2();
@@ -73669,10 +74067,21 @@ var require_stage_persona_reminders = __commonJS({
73669
74067
  }
73670
74068
  var PERSONA_REMINDER_HOOKS = ["UserPromptSubmit", "SessionStart"];
73671
74069
  async function clearPersonaReminders(ctx, sessionId) {
74070
+ const eventContext = { sessionId };
73672
74071
  for (const hook of PERSONA_REMINDER_HOOKS) {
73673
74072
  await ctx.staging.deleteReminder(hook, types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA);
74073
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
74074
+ reminderName: types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA,
74075
+ hookName: hook,
74076
+ reason: "persona_cleared"
74077
+ }));
73674
74078
  }
73675
74079
  await ctx.staging.deleteReminder("UserPromptSubmit", types_js_1.ReminderIds.PERSONA_CHANGED);
74080
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
74081
+ reminderName: types_js_1.ReminderIds.PERSONA_CHANGED,
74082
+ hookName: "UserPromptSubmit",
74083
+ reason: "persona_cleared"
74084
+ }));
73676
74085
  const lastStaged = await readLastStagedPersona(ctx, sessionId);
73677
74086
  if (lastStaged !== null) {
73678
74087
  await writeLastStagedPersona(ctx, sessionId, null);
@@ -73751,6 +74160,11 @@ var require_stage_persona_reminders = __commonJS({
73751
74160
  const isGenuineChange = lastStaged !== null && // null = never staged (initialization) → skip
73752
74161
  lastStaged.personaId !== persona.id;
73753
74162
  if (isGenuineChange) {
74163
+ (0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaChanged({ sessionId }, {
74164
+ personaFrom: lastStaged.personaId ?? "none",
74165
+ personaTo: persona.id,
74166
+ reason: "mid_session_change"
74167
+ }));
73754
74168
  const changedReminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.PERSONA_CHANGED, {
73755
74169
  context: templateContext,
73756
74170
  assets: ctx.assets
@@ -73808,6 +74222,7 @@ var require_stage_user_profile_reminders = __commonJS({
73808
74222
  exports2.stageUserProfileRemindersForSession = stageUserProfileRemindersForSession;
73809
74223
  exports2.registerStageUserProfileReminders = registerStageUserProfileReminders;
73810
74224
  var core_1 = require_dist4();
74225
+ var events_js_1 = require_events2();
73811
74226
  var types_1 = require_dist();
73812
74227
  var reminder_utils_js_1 = require_reminder_utils();
73813
74228
  var types_js_1 = require_types2();
@@ -73815,8 +74230,14 @@ var require_stage_user_profile_reminders = __commonJS({
73815
74230
  async function stageUserProfileRemindersForSession(ctx, sessionId) {
73816
74231
  const profile = (0, core_1.loadUserProfile)({ logger: ctx.logger });
73817
74232
  if (!profile) {
74233
+ const eventContext = { sessionId };
73818
74234
  for (const hook of USER_PROFILE_REMINDER_HOOKS) {
73819
74235
  await ctx.staging.deleteReminder(hook, types_js_1.ReminderIds.USER_PROFILE);
74236
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
74237
+ reminderName: types_js_1.ReminderIds.USER_PROFILE,
74238
+ hookName: hook,
74239
+ reason: "no_user_profile"
74240
+ }));
73820
74241
  }
73821
74242
  return;
73822
74243
  }
@@ -73885,60 +74306,6 @@ var require_staging2 = __commonJS({
73885
74306
  }
73886
74307
  });
73887
74308
 
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
74309
  // ../feature-reminders/dist/cli-staging-reader.js
73943
74310
  var require_cli_staging_reader = __commonJS({
73944
74311
  "../feature-reminders/dist/cli-staging-reader.js"(exports2) {
@@ -74481,7 +74848,7 @@ var require_reminder_consumed = __commonJS({
74481
74848
  "use strict";
74482
74849
  Object.defineProperty(exports2, "__esModule", { value: true });
74483
74850
  exports2.handleReminderConsumed = handleReminderConsumed;
74484
- var state_js_1 = require_state3();
74851
+ var state_js_1 = require_state4();
74485
74852
  var types_js_1 = require_types2();
74486
74853
  async function handleReminderConsumed(params, ctx) {
74487
74854
  const { sessionId, reminderName, metrics } = params;
@@ -74506,7 +74873,7 @@ var require_vc_unverified = __commonJS({
74506
74873
  Object.defineProperty(exports2, "__esModule", { value: true });
74507
74874
  exports2.handleVCUnverifiedSet = handleVCUnverifiedSet;
74508
74875
  exports2.handleVCUnverifiedClear = handleVCUnverifiedClear;
74509
- var state_js_1 = require_state3();
74876
+ var state_js_1 = require_state4();
74510
74877
  async function handleVCUnverifiedSet(params, ctx) {
74511
74878
  const { sessionId, classification, metrics } = params;
74512
74879
  const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
@@ -74569,7 +74936,9 @@ var require_orchestrator = __commonJS({
74569
74936
  "use strict";
74570
74937
  Object.defineProperty(exports2, "__esModule", { value: true });
74571
74938
  exports2.ReminderOrchestrator = void 0;
74572
- var state_js_1 = require_state3();
74939
+ var core_1 = require_dist4();
74940
+ var events_js_1 = require_events2();
74941
+ var state_js_1 = require_state4();
74573
74942
  var types_js_1 = require_types2();
74574
74943
  var ReminderOrchestrator = class {
74575
74944
  deps;
@@ -74588,8 +74957,14 @@ var require_orchestrator = __commonJS({
74588
74957
  if (reminder.name === types_js_1.ReminderIds.PAUSE_AND_REFLECT) {
74589
74958
  try {
74590
74959
  const staging = this.deps.getStagingService(sessionId);
74960
+ const eventContext = { sessionId };
74591
74961
  for (const vcId of types_js_1.ALL_VC_REMINDER_IDS) {
74592
74962
  await staging.deleteReminder("Stop", vcId);
74963
+ (0, core_1.logEvent)(this.deps.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
74964
+ reminderName: vcId,
74965
+ hookName: "Stop",
74966
+ reason: "pause_and_reflect_cascade"
74967
+ }));
74593
74968
  }
74594
74969
  this.deps.logger.debug("Unstaged all VC reminders after P&R staged", { sessionId });
74595
74970
  } catch (err) {
@@ -74625,6 +75000,7 @@ var require_orchestrator = __commonJS({
74625
75000
  try {
74626
75001
  const staging = this.deps.getStagingService(sessionId);
74627
75002
  await staging.deleteReminder("PreToolUse", types_js_1.ReminderIds.PAUSE_AND_REFLECT);
75003
+ (0, core_1.logEvent)(this.deps.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, { reminderName: types_js_1.ReminderIds.PAUSE_AND_REFLECT, hookName: "PreToolUse", reason: "vc_consumed_cascade" }));
74628
75004
  this.deps.logger.debug("Unstaged P&R after VC consumed", { sessionId });
74629
75005
  } catch (err) {
74630
75006
  this.deps.logger.warn("Failed to unstage P&R after VC consumed", {
@@ -74750,7 +75126,7 @@ var require_dist5 = __commonJS({
74750
75126
  Object.defineProperty(exports2, "ReminderOrchestrator", { enumerable: true, get: function() {
74751
75127
  return orchestrator_js_1.ReminderOrchestrator;
74752
75128
  } });
74753
- var state_js_1 = require_state3();
75129
+ var state_js_1 = require_state4();
74754
75130
  Object.defineProperty(exports2, "createRemindersState", { enumerable: true, get: function() {
74755
75131
  return state_js_1.createRemindersState;
74756
75132
  } });
@@ -75777,7 +76153,7 @@ var require_truncation = __commonJS({
75777
76153
  });
75778
76154
 
75779
76155
  // ../feature-session-summary/dist/state.js
75780
- var require_state4 = __commonJS({
76156
+ var require_state5 = __commonJS({
75781
76157
  "../feature-session-summary/dist/state.js"(exports2) {
75782
76158
  "use strict";
75783
76159
  Object.defineProperty(exports2, "__esModule", { value: true });
@@ -75882,7 +76258,7 @@ var require_persona_selection = __commonJS({
75882
76258
  exports2.selectPersonaForSession = selectPersonaForSession;
75883
76259
  exports2.ensurePersonaForSession = ensurePersonaForSession;
75884
76260
  var core_1 = require_dist4();
75885
- var state_js_1 = require_state4();
76261
+ var state_js_1 = require_state5();
75886
76262
  var types_js_1 = require_types4();
75887
76263
  function parsePersonaList(list) {
75888
76264
  if (!list || !list.trim()) {
@@ -75965,11 +76341,11 @@ var require_persona_selection = __commonJS({
75965
76341
  };
75966
76342
  const summaryState2 = (0, state_js_1.createSessionSummaryState)(ctx.stateService);
75967
76343
  await summaryState2.sessionPersona.write(sessionId, personaState2);
75968
- ctx.logger.info("Using pinned persona for session", {
75969
- sessionId,
76344
+ (0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaSelected({ sessionId }, {
75970
76345
  personaId: pinned.id,
75971
- personaName: pinned.display_name
75972
- });
76346
+ selectionMethod: "pinned",
76347
+ poolSize: 1
76348
+ }));
75973
76349
  return pinned.id;
75974
76350
  }
75975
76351
  ctx.logger.warn("Pinned persona not found, falling back to random selection", {
@@ -75979,13 +76355,18 @@ var require_persona_selection = __commonJS({
75979
76355
  });
75980
76356
  }
75981
76357
  const persistThroughClear = personaConfig.persistThroughClear ?? true;
75982
- ctx.logger.debug("Persona clear handoff check", {
76358
+ ctx.logger.info("[persona-lifecycle] ClearHandoff: checking clear cache", {
76359
+ sessionId,
75983
76360
  persistThroughClear,
75984
76361
  startType: options?.startType,
75985
76362
  hasClearCache: !!ctx.personaClearCache
75986
76363
  });
75987
76364
  if (persistThroughClear && options?.startType === "clear" && ctx.personaClearCache) {
75988
76365
  const cachedPersonaId = ctx.personaClearCache.consume();
76366
+ ctx.logger.info("[persona-lifecycle] ClearHandoff: consumed cache", {
76367
+ sessionId,
76368
+ cachedPersonaId: cachedPersonaId ?? null
76369
+ });
75989
76370
  if (cachedPersonaId) {
75990
76371
  const cachedPersona = allPersonas.get(cachedPersonaId);
75991
76372
  if (cachedPersona) {
@@ -75996,11 +76377,11 @@ var require_persona_selection = __commonJS({
75996
76377
  };
75997
76378
  const summaryState2 = (0, state_js_1.createSessionSummaryState)(ctx.stateService);
75998
76379
  await summaryState2.sessionPersona.write(sessionId, personaState2);
75999
- ctx.logger.info("Preserved persona through clear", {
76000
- sessionId,
76380
+ (0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaSelected({ sessionId }, {
76001
76381
  personaId: cachedPersona.id,
76002
- personaName: cachedPersona.display_name
76003
- });
76382
+ selectionMethod: "handoff",
76383
+ poolSize: 1
76384
+ }));
76004
76385
  return cachedPersona.id;
76005
76386
  } else {
76006
76387
  ctx.logger.warn("Cached persona from clear not found in available personas, falling back to selection", {
@@ -76038,12 +76419,11 @@ var require_persona_selection = __commonJS({
76038
76419
  };
76039
76420
  const summaryState = (0, state_js_1.createSessionSummaryState)(ctx.stateService);
76040
76421
  await summaryState.sessionPersona.write(sessionId, personaState);
76041
- ctx.logger.info("Selected persona for session", {
76042
- sessionId,
76422
+ (0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaSelected({ sessionId }, {
76043
76423
  personaId: selected.id,
76044
- personaName: selected.display_name,
76424
+ selectionMethod: "random",
76045
76425
  poolSize: eligiblePersonas.length
76046
- });
76426
+ }));
76047
76427
  return selected.id;
76048
76428
  }
76049
76429
  async function ensurePersonaForSession(sessionId, ctx) {
@@ -76073,7 +76453,7 @@ var require_create_first_summary = __commonJS({
76073
76453
  Object.defineProperty(exports2, "__esModule", { value: true });
76074
76454
  exports2.createFirstSessionSummary = createFirstSessionSummary;
76075
76455
  var types_1 = require_dist();
76076
- var state_js_1 = require_state4();
76456
+ var state_js_1 = require_state5();
76077
76457
  var persona_selection_js_1 = require_persona_selection();
76078
76458
  var types_js_1 = require_types4();
76079
76459
  async function createFirstSessionSummary(event, ctx) {
@@ -76106,15 +76486,12 @@ var require_events3 = __commonJS({
76106
76486
  "../feature-session-summary/dist/events.js"(exports2) {
76107
76487
  "use strict";
76108
76488
  Object.defineProperty(exports2, "__esModule", { value: true });
76109
- exports2.SessionSummaryEvents = void 0;
76489
+ exports2.DecisionEvents = exports2.SessionSummaryEvents = void 0;
76110
76490
  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) {
76491
+ /** Emitted when summary generation begins. */
76492
+ summaryStart(context, payload) {
76116
76493
  return {
76117
- type: "SummaryUpdated",
76494
+ type: "session-summary:start",
76118
76495
  time: Date.now(),
76119
76496
  source: "daemon",
76120
76497
  context: {
@@ -76124,11 +76501,87 @@ var require_events3 = __commonJS({
76124
76501
  hook: context.hook,
76125
76502
  taskId: context.taskId
76126
76503
  },
76127
- payload: {
76128
- state,
76129
- metadata,
76130
- reason
76131
- }
76504
+ payload
76505
+ };
76506
+ },
76507
+ /** Emitted when summary generation completes. */
76508
+ summaryFinish(context, payload) {
76509
+ return {
76510
+ type: "session-summary:finish",
76511
+ time: Date.now(),
76512
+ source: "daemon",
76513
+ context: {
76514
+ sessionId: context.sessionId,
76515
+ correlationId: context.correlationId,
76516
+ traceId: context.traceId,
76517
+ hook: context.hook,
76518
+ taskId: context.taskId
76519
+ },
76520
+ payload
76521
+ };
76522
+ },
76523
+ /** Emitted when session title changes. */
76524
+ titleChanged(context, payload) {
76525
+ return {
76526
+ type: "session-title:changed",
76527
+ time: Date.now(),
76528
+ source: "daemon",
76529
+ context: {
76530
+ sessionId: context.sessionId,
76531
+ correlationId: context.correlationId,
76532
+ traceId: context.traceId,
76533
+ hook: context.hook,
76534
+ taskId: context.taskId
76535
+ },
76536
+ payload
76537
+ };
76538
+ },
76539
+ /** Emitted when latest intent changes. */
76540
+ intentChanged(context, payload) {
76541
+ return {
76542
+ type: "intent:changed",
76543
+ time: Date.now(),
76544
+ source: "daemon",
76545
+ context: {
76546
+ sessionId: context.sessionId,
76547
+ correlationId: context.correlationId,
76548
+ traceId: context.traceId,
76549
+ hook: context.hook,
76550
+ taskId: context.taskId
76551
+ },
76552
+ payload
76553
+ };
76554
+ },
76555
+ /** Emitted when snarky message generation begins. */
76556
+ snarkyMessageStart(context, payload) {
76557
+ return {
76558
+ type: "snarky-message:start",
76559
+ time: Date.now(),
76560
+ source: "daemon",
76561
+ context: {
76562
+ sessionId: context.sessionId,
76563
+ correlationId: context.correlationId,
76564
+ traceId: context.traceId,
76565
+ hook: context.hook,
76566
+ taskId: context.taskId
76567
+ },
76568
+ payload
76569
+ };
76570
+ },
76571
+ /** Emitted when snarky message generation completes. */
76572
+ snarkyMessageFinish(context, payload) {
76573
+ return {
76574
+ type: "snarky-message:finish",
76575
+ time: Date.now(),
76576
+ source: "daemon",
76577
+ context: {
76578
+ sessionId: context.sessionId,
76579
+ correlationId: context.correlationId,
76580
+ traceId: context.traceId,
76581
+ hook: context.hook,
76582
+ taskId: context.taskId
76583
+ },
76584
+ payload
76132
76585
  };
76133
76586
  },
76134
76587
  /**
@@ -76137,7 +76590,7 @@ var require_events3 = __commonJS({
76137
76590
  */
76138
76591
  summarySkipped(context, metadata) {
76139
76592
  return {
76140
- type: "SummarySkipped",
76593
+ type: "session-summary:skipped",
76141
76594
  time: Date.now(),
76142
76595
  source: "daemon",
76143
76596
  context: {
@@ -76148,12 +76601,31 @@ var require_events3 = __commonJS({
76148
76601
  taskId: context.taskId
76149
76602
  },
76150
76603
  payload: {
76151
- metadata,
76604
+ countdown: metadata.countdown,
76605
+ countdown_threshold: metadata.countdown_threshold,
76152
76606
  reason: "countdown_active"
76153
76607
  }
76154
76608
  };
76155
76609
  }
76156
76610
  };
76611
+ exports2.DecisionEvents = {
76612
+ /** Emitted when an LLM decision is recorded. */
76613
+ decisionRecorded(context, payload) {
76614
+ return {
76615
+ type: "decision:recorded",
76616
+ time: Date.now(),
76617
+ source: "daemon",
76618
+ context: {
76619
+ sessionId: context.sessionId,
76620
+ correlationId: context.correlationId,
76621
+ traceId: context.traceId,
76622
+ hook: context.hook,
76623
+ taskId: context.taskId
76624
+ },
76625
+ payload
76626
+ };
76627
+ }
76628
+ };
76157
76629
  }
76158
76630
  });
76159
76631
 
@@ -76173,7 +76645,7 @@ var require_persona_utils = __commonJS({
76173
76645
  exports2.mergePersonaConfig = mergePersonaConfig;
76174
76646
  exports2.getEffectiveProfile = getEffectiveProfile;
76175
76647
  var core_1 = require_dist4();
76176
- var state_js_1 = require_state4();
76648
+ var state_js_1 = require_state5();
76177
76649
  var types_js_1 = require_types4();
76178
76650
  var DEFAULT_PERSONA_SITUATION = "You are watching over the shoulder of a software developer as they work.";
76179
76651
  function buildUserProfileContext(profile) {
@@ -76315,7 +76787,7 @@ var require_update_summary = __commonJS({
76315
76787
  var events_js_1 = require_events3();
76316
76788
  var zod_1 = require_zod();
76317
76789
  var types_js_1 = require_types4();
76318
- var state_js_1 = require_state4();
76790
+ var state_js_1 = require_state5();
76319
76791
  var persona_utils_js_1 = require_persona_utils();
76320
76792
  var persona_selection_js_1 = require_persona_selection();
76321
76793
  var PROMPT_FILE = "prompts/session-summary.prompt.txt";
@@ -76368,47 +76840,47 @@ var require_update_summary = __commonJS({
76368
76840
  await (0, persona_selection_js_1.ensurePersonaForSession)(sessionId, ctx);
76369
76841
  const metrics = ctx.transcript.getMetrics();
76370
76842
  if (metrics.turnCount === 0) {
76371
- ctx.logger.info("LLM call: session-summary analysis", {
76372
- sessionId,
76843
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76373
76844
  decision: "skipped",
76374
- reason: "BulkProcessingComplete with no user turns (turnCount=0)"
76375
- });
76845
+ reason: "BulkProcessingComplete with no user turns (turnCount=0)",
76846
+ detail: "session-summary analysis"
76847
+ }));
76376
76848
  return;
76377
76849
  }
76378
- ctx.logger.info("LLM call: session-summary analysis", {
76379
- sessionId,
76850
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76380
76851
  decision: "calling",
76381
- reason: "BulkProcessingComplete - analyzing full transcript"
76382
- });
76852
+ reason: "BulkProcessingComplete - analyzing full transcript",
76853
+ detail: "session-summary analysis"
76854
+ }));
76383
76855
  const countdown2 = await loadCountdownState(summaryState, sessionId);
76384
76856
  void performAnalysis(event, ctx, summaryState, countdown2, "user_prompt_forced");
76385
76857
  return;
76386
76858
  }
76387
76859
  const countdown = await loadCountdownState(summaryState, sessionId);
76388
76860
  if (isUserPrompt) {
76389
- ctx.logger.info("LLM call: session-summary analysis", {
76390
- sessionId,
76861
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76391
76862
  decision: "calling",
76392
- reason: "UserPrompt event forces immediate analysis"
76393
- });
76863
+ reason: "UserPrompt event forces immediate analysis",
76864
+ detail: "session-summary analysis"
76865
+ }));
76394
76866
  void performAnalysis(event, ctx, summaryState, countdown, "user_prompt_forced");
76395
76867
  return;
76396
76868
  }
76397
76869
  if (countdown.countdown > 0) {
76398
- ctx.logger.info("LLM call: session-summary analysis", {
76399
- sessionId,
76870
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76400
76871
  decision: "skipped",
76401
- reason: `countdown not reached (${countdown.countdown} tool results remaining)`
76402
- });
76872
+ reason: `countdown not reached (${countdown.countdown} tool results remaining)`,
76873
+ detail: "session-summary analysis"
76874
+ }));
76403
76875
  countdown.countdown--;
76404
76876
  await saveCountdownState(summaryState, sessionId, countdown);
76405
76877
  return;
76406
76878
  }
76407
- ctx.logger.info("LLM call: session-summary analysis", {
76408
- sessionId,
76879
+ (0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
76409
76880
  decision: "calling",
76410
- reason: "countdown reached zero after ToolResult"
76411
- });
76881
+ reason: "countdown reached zero after ToolResult",
76882
+ detail: "session-summary analysis"
76883
+ }));
76412
76884
  void performAnalysis(event, ctx, summaryState, countdown, "countdown_reached");
76413
76885
  }
76414
76886
  async function loadCountdownState(summaryState, sessionId) {
@@ -76442,6 +76914,10 @@ var require_update_summary = __commonJS({
76442
76914
  const { sessionId } = event.context;
76443
76915
  try {
76444
76916
  const startTime = Date.now();
76917
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.summaryStart(event.context, {
76918
+ reason,
76919
+ countdown: countdown.countdown
76920
+ }));
76445
76921
  const featureConfig = ctx.config.getFeature("session-summary");
76446
76922
  const config = { ...types_js_1.DEFAULT_SESSION_SUMMARY_CONFIG, ...featureConfig.settings };
76447
76923
  const currentSummary = await loadCurrentSummary(summaryState, sessionId);
@@ -76545,19 +77021,28 @@ var require_update_summary = __commonJS({
76545
77021
  if (sideEffects.length > 0) {
76546
77022
  await Promise.all(sideEffects);
76547
77023
  }
76548
- (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.summaryUpdated(event.context, {
77024
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.summaryFinish(event.context, {
76549
77025
  session_title: updatedSummary.session_title,
76550
77026
  session_title_confidence: updatedSummary.session_title_confidence,
76551
77027
  latest_intent: updatedSummary.latest_intent,
76552
- latest_intent_confidence: updatedSummary.latest_intent_confidence
76553
- }, {
76554
- countdown_reset_to: newCountdown,
76555
- tokens_used: tokensUsed,
77028
+ latest_intent_confidence: updatedSummary.latest_intent_confidence,
76556
77029
  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));
77030
+ pivot_detected: updatedSummary.pivot_detected ?? false
77031
+ }));
77032
+ if (currentSummary && updatedSummary.session_title !== currentSummary.session_title) {
77033
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.titleChanged(event.context, {
77034
+ previousValue: currentSummary.session_title,
77035
+ newValue: updatedSummary.session_title,
77036
+ confidence: updatedSummary.session_title_confidence
77037
+ }));
77038
+ }
77039
+ if (currentSummary && updatedSummary.latest_intent !== currentSummary.latest_intent) {
77040
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.intentChanged(event.context, {
77041
+ previousValue: currentSummary.latest_intent,
77042
+ newValue: updatedSummary.latest_intent,
77043
+ confidence: updatedSummary.latest_intent_confidence
77044
+ }));
77045
+ }
76561
77046
  ctx.logger.info("Updated session summary", {
76562
77047
  sessionId,
76563
77048
  reason,
@@ -76623,6 +77108,7 @@ var require_update_summary = __commonJS({
76623
77108
  return;
76624
77109
  }
76625
77110
  const provider = ctx.profileFactory.createForProfile(profileResult.profileId, llmConfig.fallbackProfile);
77111
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageStart({ sessionId }, { sessionId }));
76626
77112
  try {
76627
77113
  const response = await provider.complete({
76628
77114
  messages: [{ role: "user", content: prompt }]
@@ -76633,6 +77119,7 @@ var require_update_summary = __commonJS({
76633
77119
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
76634
77120
  };
76635
77121
  await summaryState.snarkyMessage.write(sessionId, snarkyState);
77122
+ (0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageFinish({ sessionId }, { generatedMessage: snarkyMessage }));
76636
77123
  ctx.logger.debug("Generated snarky message", {
76637
77124
  sessionId,
76638
77125
  personaId: persona?.id ?? "none",
@@ -76741,8 +77228,10 @@ var require_on_demand_generation = __commonJS({
76741
77228
  exports2.generateSnarkyMessageOnDemand = generateSnarkyMessageOnDemand;
76742
77229
  exports2.generateResumeMessageOnDemand = generateResumeMessageOnDemand;
76743
77230
  var types_js_1 = require_types4();
76744
- var state_js_1 = require_state4();
77231
+ var state_js_1 = require_state5();
76745
77232
  var core_1 = require_dist4();
77233
+ var core_2 = require_dist4();
77234
+ var events_js_1 = require_events3();
76746
77235
  var update_summary_js_1 = require_update_summary();
76747
77236
  var persona_utils_js_1 = require_persona_utils();
76748
77237
  var SNARKY_PROMPT_FILE = "prompts/snarky-message.prompt.txt";
@@ -76819,6 +77308,7 @@ var require_on_demand_generation = __commonJS({
76819
77308
  return { success: false, error: profileResult.errorMessage };
76820
77309
  }
76821
77310
  const provider = ctx.profileFactory.createForProfile(profileResult.profileId, llmConfig.fallbackProfile);
77311
+ (0, core_2.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageStart({ sessionId }, { sessionId }));
76822
77312
  try {
76823
77313
  const response = await provider.complete({
76824
77314
  messages: [{ role: "user", content: prompt }]
@@ -76829,6 +77319,7 @@ var require_on_demand_generation = __commonJS({
76829
77319
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
76830
77320
  };
76831
77321
  await summaryState.snarkyMessage.write(sessionId, snarkyState);
77322
+ (0, core_2.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageFinish({ sessionId }, { generatedMessage: snarkyMessage }));
76832
77323
  ctx.logger.info("Generated snarky message on-demand", {
76833
77324
  sessionId,
76834
77325
  personaId: persona?.id ?? "none"
@@ -77035,7 +77526,7 @@ var require_dist6 = __commonJS({
77035
77526
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
77036
77527
  };
77037
77528
  Object.defineProperty(exports2, "__esModule", { value: true });
77038
- exports2.SessionSummaryEvents = exports2.manifest = void 0;
77529
+ exports2.DecisionEvents = exports2.SessionSummaryEvents = exports2.manifest = void 0;
77039
77530
  exports2.register = register;
77040
77531
  var index_js_1 = require_handlers();
77041
77532
  exports2.manifest = {
@@ -77052,11 +77543,14 @@ var require_dist6 = __commonJS({
77052
77543
  exports2.default = feature;
77053
77544
  __exportStar(require_types4(), exports2);
77054
77545
  __exportStar(require_handlers(), exports2);
77055
- __exportStar(require_state4(), exports2);
77546
+ __exportStar(require_state5(), exports2);
77056
77547
  var events_js_1 = require_events3();
77057
77548
  Object.defineProperty(exports2, "SessionSummaryEvents", { enumerable: true, get: function() {
77058
77549
  return events_js_1.SessionSummaryEvents;
77059
77550
  } });
77551
+ Object.defineProperty(exports2, "DecisionEvents", { enumerable: true, get: function() {
77552
+ return events_js_1.DecisionEvents;
77553
+ } });
77060
77554
  }
77061
77555
  });
77062
77556
 
@@ -79135,6 +79629,20 @@ var require_persona2 = __commonJS({
79135
79629
  stdout.write(output + "\n");
79136
79630
  return { exitCode, output };
79137
79631
  }
79632
+ function validatePersonaExists(personaId, opts) {
79633
+ const personas = (0, core_1.discoverPersonas)({
79634
+ defaultPersonasDir: (0, core_1.getDefaultPersonasDir)(),
79635
+ projectRoot: opts.projectRoot,
79636
+ logger: opts.logger
79637
+ });
79638
+ if (!personas.has(personaId)) {
79639
+ const availableIds = Array.from(personas.keys()).join(", ");
79640
+ const errorMsg = `Persona "${personaId}" not found. Available: ${availableIds}`;
79641
+ opts.logger.error("Persona not found", { personaId, available: availableIds });
79642
+ return { result: writeJsonResponse(opts.stdout, { success: false, error: errorMsg }, 1) };
79643
+ }
79644
+ return { personas };
79645
+ }
79138
79646
  function handlePersonaList(projectRoot, logger, stdout, options) {
79139
79647
  const format3 = options.format ?? "json";
79140
79648
  const tableWidth = options.width ?? 100;
@@ -79191,17 +79699,10 @@ var require_persona2 = __commonJS({
79191
79699
  return { exitCode: 1, output: error };
79192
79700
  }
79193
79701
  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
- }
79702
+ const validation = validatePersonaExists(personaId, { projectRoot, logger, stdout });
79703
+ if (validation.result)
79704
+ return validation.result;
79705
+ const personas = validation.personas;
79205
79706
  const stateService = new core_1.StateService(projectRoot, { cache: false, logger });
79206
79707
  const personaAccessor = new core_1.SessionStateAccessor(stateService, SessionPersonaDescriptor);
79207
79708
  try {
@@ -79213,10 +79714,16 @@ var require_persona2 = __commonJS({
79213
79714
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
79214
79715
  };
79215
79716
  await personaAccessor.write(sessionId, newState);
79717
+ const personaFilePath = stateService.sessionStatePath(sessionId, "session-persona.json");
79216
79718
  if (previousPersonaId) {
79217
- logger.info("Persona changed", { from: previousPersonaId, to: personaId });
79719
+ logger.info("[persona-lifecycle] PersonaSet: persona changed", {
79720
+ sessionId,
79721
+ from: previousPersonaId,
79722
+ to: personaId,
79723
+ filePath: personaFilePath
79724
+ });
79218
79725
  } else {
79219
- logger.info("Persona set", { personaId });
79726
+ logger.info("[persona-lifecycle] PersonaSet: persona set", { sessionId, personaId, filePath: personaFilePath });
79220
79727
  }
79221
79728
  return writeJsonResponse(stdout, { success: true, personaId, previousPersonaId }, 0);
79222
79729
  } catch (err) {
@@ -79299,17 +79806,9 @@ var require_persona2 = __commonJS({
79299
79806
  function handlePersonaPin(personaId, projectRoot, logger, stdout, options) {
79300
79807
  const scope = options.scope ?? "project";
79301
79808
  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
- }
79809
+ const validation = validatePersonaExists(personaId, { projectRoot, logger, stdout });
79810
+ if (validation.result)
79811
+ return validation.result;
79313
79812
  try {
79314
79813
  const result = (0, core_1.configSet)("features.session-summary.settings.personas.pinnedPersona", personaId, {
79315
79814
  scope,
@@ -79354,7 +79853,7 @@ var require_persona2 = __commonJS({
79354
79853
  return writeJsonResponse(stdout, { success: false, error: errorMsg }, 1);
79355
79854
  }
79356
79855
  }
79357
- function showPersonaHelp(stdout) {
79856
+ function showPersonaHelp(stdout, exitCode = 0) {
79358
79857
  stdout.write(`Usage: sidekick persona <subcommand> [options]
79359
79858
 
79360
79859
  Subcommands:
@@ -79383,7 +79882,7 @@ Examples:
79383
79882
  sidekick persona clear --session-id=abc123
79384
79883
  sidekick persona test skippy --session-id=abc123 --type=snarky
79385
79884
  `);
79386
- return { exitCode: 0, output: "" };
79885
+ return { exitCode, output: "" };
79387
79886
  }
79388
79887
  async function handlePersonaCommand(subcommand, args, projectRoot, logger, stdout, options) {
79389
79888
  const personaId = args[0];
@@ -79424,12 +79923,12 @@ Examples:
79424
79923
  return showPersonaHelp(stdout);
79425
79924
  case void 0:
79426
79925
  stdout.write("Error: persona command requires a subcommand\n\n");
79427
- return showPersonaHelp(stdout);
79926
+ return showPersonaHelp(stdout, 1);
79428
79927
  default:
79429
79928
  stdout.write(`Error: Unknown persona subcommand: ${subcommand}
79430
79929
 
79431
79930
  `);
79432
- return showPersonaHelp(stdout);
79931
+ return showPersonaHelp(stdout, 1);
79433
79932
  }
79434
79933
  }
79435
79934
  }
@@ -83041,7 +83540,7 @@ var require_cli = __commonJS({
83041
83540
  var promises_12 = require("node:fs/promises");
83042
83541
  var node_stream_1 = require("node:stream");
83043
83542
  var yargs_parser_1 = __importDefault2(require_build());
83044
- var VERSION = true ? "0.1.7" : "dev";
83543
+ var VERSION = true ? "0.1.9" : "dev";
83045
83544
  var SANDBOX_ERROR_MESSAGE = `Error: Daemon commands cannot run in sandbox mode.
83046
83545
 
83047
83546
  Claude Code's sandbox blocks Unix socket operations required for daemon IPC.
@@ -83537,6 +84036,7 @@ Run 'sidekick --help' for available options.
83537
84036
  if (sessionId) {
83538
84037
  await persistCliLogMetrics(runtime.stateService, sessionId, runtime.getLogCounts(), runtime.logger);
83539
84038
  }
84039
+ await runtime.logger.flush();
83540
84040
  return result;
83541
84041
  }
83542
84042
  }