@scotthamilton77/sidekick 0.1.9 → 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.
Files changed (3) hide show
  1. package/dist/bin.js +317 -118
  2. package/dist/daemon.js +326 -117
  3. package/package.json +1 -1
package/dist/daemon.js CHANGED
@@ -122,6 +122,7 @@ var require_events = __commonJS({
122
122
  "reminder:unstaged",
123
123
  "reminder:consumed",
124
124
  "reminder:cleared",
125
+ "reminder:not-staged",
125
126
  // Decision events
126
127
  "decision:recorded",
127
128
  // Session summary events
@@ -170,6 +171,7 @@ var require_events = __commonJS({
170
171
  "reminder:unstaged": "timeline",
171
172
  "reminder:consumed": "timeline",
172
173
  "reminder:cleared": "timeline",
174
+ "reminder:not-staged": "log",
173
175
  "decision:recorded": "timeline",
174
176
  "session-summary:start": "timeline",
175
177
  "session-summary:finish": "timeline",
@@ -44889,7 +44891,10 @@ var require_structured_logging = __commonJS({
44889
44891
  hookName: state.hookName,
44890
44892
  blocking: state.blocking,
44891
44893
  priority: state.priority,
44892
- persistent: state.persistent
44894
+ persistent: state.persistent,
44895
+ ...state.reason !== void 0 && { reason: state.reason },
44896
+ ...state.triggeredBy !== void 0 && { triggeredBy: state.triggeredBy },
44897
+ ...state.thresholdState !== void 0 && { thresholdState: state.thresholdState }
44893
44898
  }
44894
44899
  };
44895
44900
  },
@@ -45186,8 +45191,8 @@ var require_structured_logging = __commonJS({
45186
45191
  },
45187
45192
  // --- Error Events ---
45188
45193
  /**
45189
- * Create an ErrorOccurred event (logged when error/fatal level log is emitted).
45190
- * Emitted automatically by HookableLogger hook no manual call-site changes needed.
45194
+ * Create a daemon ErrorOccurred event.
45195
+ * @see packages/sidekick-daemon/src/daemon.ts HookableLogger error hook calls this factory.
45191
45196
  */
45192
45197
  daemonErrorOccurred(context, state) {
45193
45198
  return {
@@ -45206,6 +45211,28 @@ var require_structured_logging = __commonJS({
45206
45211
  errorStack: state.errorStack
45207
45212
  }
45208
45213
  };
45214
+ },
45215
+ /**
45216
+ * Create a CLI ErrorOccurred event.
45217
+ * Available for CLI error hook implementations.
45218
+ */
45219
+ cliErrorOccurred(context, state) {
45220
+ return {
45221
+ type: "error:occurred",
45222
+ time: Date.now(),
45223
+ source: "cli",
45224
+ context: {
45225
+ sessionId: context.sessionId,
45226
+ correlationId: context.correlationId,
45227
+ traceId: context.traceId,
45228
+ hook: context.hook,
45229
+ taskId: context.taskId
45230
+ },
45231
+ payload: {
45232
+ errorMessage: state.errorMessage,
45233
+ errorStack: state.errorStack
45234
+ }
45235
+ };
45209
45236
  }
45210
45237
  };
45211
45238
  function logEvent(logger, event) {
@@ -57252,7 +57279,7 @@ var require_staging_service = __commonJS({
57252
57279
  *
57253
57280
  * @throws Error if hookName or reminderName contain path traversal characters
57254
57281
  */
57255
- async stageReminder(sessionId, hookName, reminderName, data) {
57282
+ async stageReminder(sessionId, hookName, reminderName, data, enrichment) {
57256
57283
  (0, staging_paths_js_1.validatePathSegment)(hookName, "hookName");
57257
57284
  (0, staging_paths_js_1.validatePathSegment)(reminderName, "reminderName");
57258
57285
  const hookDir = this.getHookDirPath(sessionId, hookName);
@@ -57281,7 +57308,8 @@ var require_staging_service = __commonJS({
57281
57308
  hookName,
57282
57309
  blocking: data.blocking,
57283
57310
  priority: data.priority,
57284
- persistent: data.persistent
57311
+ persistent: data.persistent,
57312
+ ...enrichment
57285
57313
  }, { stagingPath: reminderPath });
57286
57314
  (0, structured_logging_1.logEvent)(this.options.logger, event);
57287
57315
  }
@@ -57425,8 +57453,8 @@ var require_staging_service = __commonJS({
57425
57453
  // ============================================================================
57426
57454
  // StagingService Interface Implementation (delegates to core)
57427
57455
  // ============================================================================
57428
- async stageReminder(hookName, reminderName, data) {
57429
- return this.core.stageReminder(this.sessionId, hookName, reminderName, data);
57456
+ async stageReminder(hookName, reminderName, data, enrichment) {
57457
+ return this.core.stageReminder(this.sessionId, hookName, reminderName, data, enrichment);
57430
57458
  }
57431
57459
  async readReminder(hookName, reminderName) {
57432
57460
  return this.core.readReminder(this.sessionId, hookName, reminderName);
@@ -70197,8 +70225,8 @@ var require_reminder_utils = __commonJS({
70197
70225
  return null;
70198
70226
  }
70199
70227
  }
70200
- async function stageReminder(ctx, hookName, reminder) {
70201
- await ctx.staging.stageReminder(hookName, reminder.name, reminder);
70228
+ async function stageReminder(ctx, hookName, reminder, enrichment) {
70229
+ await ctx.staging.stageReminder(hookName, reminder.name, reminder, enrichment);
70202
70230
  ctx.logger.debug("Staged reminder", { hookName, reminderName: reminder.name, priority: reminder.priority });
70203
70231
  }
70204
70232
  async function consumeReminder(ctx, hookName) {
@@ -70744,13 +70772,125 @@ var require_stage_default_user_prompt = __commonJS({
70744
70772
  }
70745
70773
  });
70746
70774
 
70775
+ // ../feature-reminders/dist/events.js
70776
+ var require_events2 = __commonJS({
70777
+ "../feature-reminders/dist/events.js"(exports2) {
70778
+ "use strict";
70779
+ Object.defineProperty(exports2, "__esModule", { value: true });
70780
+ exports2.ReminderEvents = void 0;
70781
+ exports2.ReminderEvents = {
70782
+ /**
70783
+ * Create a ReminderConsumed event (logged when CLI returns a staged reminder).
70784
+ */
70785
+ reminderConsumed(context, state, _metadata) {
70786
+ return {
70787
+ type: "reminder:consumed",
70788
+ time: Date.now(),
70789
+ source: "cli",
70790
+ context: {
70791
+ sessionId: context.sessionId,
70792
+ correlationId: context.correlationId,
70793
+ traceId: context.traceId,
70794
+ hook: context.hook,
70795
+ taskId: context.taskId
70796
+ },
70797
+ payload: {
70798
+ reminderName: state.reminderName,
70799
+ reminderReturned: state.reminderReturned,
70800
+ blocking: state.blocking,
70801
+ priority: state.priority,
70802
+ persistent: state.persistent,
70803
+ ...state.classificationResult !== void 0 && {
70804
+ classificationResult: state.classificationResult
70805
+ }
70806
+ }
70807
+ };
70808
+ },
70809
+ // Note: reminderStaged stays in @sidekick/core (used by staging-service.ts, circular dep)
70810
+ /**
70811
+ * Create a ReminderUnstaged event (logged when a reminder is removed from staging).
70812
+ */
70813
+ reminderUnstaged(context, state) {
70814
+ return {
70815
+ type: "reminder:unstaged",
70816
+ time: Date.now(),
70817
+ source: "daemon",
70818
+ context: {
70819
+ sessionId: context.sessionId,
70820
+ correlationId: context.correlationId,
70821
+ traceId: context.traceId,
70822
+ hook: context.hook,
70823
+ taskId: context.taskId
70824
+ },
70825
+ payload: {
70826
+ reminderName: state.reminderName,
70827
+ hookName: state.hookName,
70828
+ reason: state.reason,
70829
+ ...state.triggeredBy !== void 0 && { triggeredBy: state.triggeredBy },
70830
+ ...state.toolState !== void 0 && { toolState: state.toolState }
70831
+ }
70832
+ };
70833
+ },
70834
+ /**
70835
+ * Create a RemindersCleared event (logged when staging directory is cleaned).
70836
+ */
70837
+ remindersCleared(context, state, reason) {
70838
+ return {
70839
+ type: "reminder:cleared",
70840
+ time: Date.now(),
70841
+ source: "daemon",
70842
+ context: {
70843
+ sessionId: context.sessionId,
70844
+ correlationId: context.correlationId,
70845
+ traceId: context.traceId,
70846
+ hook: context.hook,
70847
+ taskId: context.taskId
70848
+ },
70849
+ payload: {
70850
+ clearedCount: state.clearedCount,
70851
+ hookNames: state.hookNames,
70852
+ reason
70853
+ }
70854
+ };
70855
+ },
70856
+ /**
70857
+ * Create a ReminderNotStaged event (logged when daemon evaluates but decides not to stage).
70858
+ */
70859
+ reminderNotStaged(context, state) {
70860
+ return {
70861
+ type: "reminder:not-staged",
70862
+ time: Date.now(),
70863
+ source: "daemon",
70864
+ context: {
70865
+ sessionId: context.sessionId,
70866
+ correlationId: context.correlationId,
70867
+ traceId: context.traceId,
70868
+ hook: context.hook,
70869
+ taskId: context.taskId
70870
+ },
70871
+ payload: {
70872
+ reminderName: state.reminderName,
70873
+ hookName: state.hookName,
70874
+ reason: state.reason,
70875
+ ...state.threshold !== void 0 && { threshold: state.threshold },
70876
+ ...state.currentValue !== void 0 && { currentValue: state.currentValue },
70877
+ ...state.triggeredBy !== void 0 && { triggeredBy: state.triggeredBy }
70878
+ }
70879
+ };
70880
+ }
70881
+ };
70882
+ }
70883
+ });
70884
+
70747
70885
  // ../feature-reminders/dist/handlers/staging/stage-pause-and-reflect.js
70748
70886
  var require_stage_pause_and_reflect = __commonJS({
70749
70887
  "../feature-reminders/dist/handlers/staging/stage-pause-and-reflect.js"(exports2) {
70750
70888
  "use strict";
70751
70889
  Object.defineProperty(exports2, "__esModule", { value: true });
70752
70890
  exports2.registerStagePauseAndReflect = registerStagePauseAndReflect;
70891
+ var core_1 = require_dist4();
70753
70892
  var types_1 = require_dist();
70893
+ var events_js_1 = require_events2();
70754
70894
  var staging_handler_utils_js_1 = require_staging_handler_utils();
70755
70895
  var types_js_1 = require_types2();
70756
70896
  var state_js_1 = require_state4();
@@ -70764,15 +70904,17 @@ var require_stage_pause_and_reflect = __commonJS({
70764
70904
  return void 0;
70765
70905
  const metrics = event.metadata.metrics;
70766
70906
  const sessionId = event.context?.sessionId;
70907
+ if (!sessionId) {
70908
+ ctx.logger.warn("[stage-pause-and-reflect] No sessionId available, skipping");
70909
+ return void 0;
70910
+ }
70767
70911
  const featureConfig = context.config.getFeature("reminders");
70768
70912
  const config = { ...types_js_1.DEFAULT_REMINDERS_SETTINGS, ...featureConfig.settings };
70769
70913
  let prBaseline = null;
70770
- if (sessionId) {
70771
- const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
70772
- const result = await remindersState.prBaseline.read(sessionId);
70773
- if (result.source !== "default") {
70774
- prBaseline = result.data;
70775
- }
70914
+ const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
70915
+ const result = await remindersState.prBaseline.read(sessionId);
70916
+ if (result.source !== "default") {
70917
+ prBaseline = result.data;
70776
70918
  }
70777
70919
  let effectiveBaseline = 0;
70778
70920
  if (prBaseline && prBaseline.turnCount === metrics.turnCount) {
@@ -70784,12 +70926,28 @@ var require_stage_pause_and_reflect = __commonJS({
70784
70926
  effectiveBaseline = Math.max(effectiveBaseline, lastConsumed.stagedAt.toolsThisTurn);
70785
70927
  }
70786
70928
  const shouldReactivate = metrics.turnCount > lastConsumed.stagedAt.turnCount || metrics.toolsThisTurn >= effectiveBaseline + config.pause_and_reflect_threshold;
70787
- if (!shouldReactivate)
70929
+ if (!shouldReactivate) {
70930
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
70931
+ reminderName: "pause-and-reflect",
70932
+ hookName: "PreToolUse",
70933
+ reason: "same_turn",
70934
+ triggeredBy: "tool_result"
70935
+ }));
70788
70936
  return void 0;
70937
+ }
70789
70938
  }
70790
70939
  const toolsSinceBaseline = metrics.toolsThisTurn - effectiveBaseline;
70791
- if (toolsSinceBaseline < config.pause_and_reflect_threshold)
70940
+ if (toolsSinceBaseline < config.pause_and_reflect_threshold) {
70941
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
70942
+ reminderName: "pause-and-reflect",
70943
+ hookName: "PreToolUse",
70944
+ reason: "below_threshold",
70945
+ threshold: config.pause_and_reflect_threshold,
70946
+ currentValue: toolsSinceBaseline,
70947
+ triggeredBy: "tool_result"
70948
+ }));
70792
70949
  return void 0;
70950
+ }
70793
70951
  return {
70794
70952
  reminderId: types_js_1.ReminderIds.PAUSE_AND_REFLECT,
70795
70953
  targetHook: "PreToolUse",
@@ -72319,86 +72477,6 @@ var require_picomatch2 = __commonJS({
72319
72477
  }
72320
72478
  });
72321
72479
 
72322
- // ../feature-reminders/dist/events.js
72323
- var require_events2 = __commonJS({
72324
- "../feature-reminders/dist/events.js"(exports2) {
72325
- "use strict";
72326
- Object.defineProperty(exports2, "__esModule", { value: true });
72327
- exports2.ReminderEvents = void 0;
72328
- exports2.ReminderEvents = {
72329
- /**
72330
- * Create a ReminderConsumed event (logged when CLI returns a staged reminder).
72331
- */
72332
- reminderConsumed(context, state, _metadata) {
72333
- return {
72334
- type: "reminder:consumed",
72335
- time: Date.now(),
72336
- source: "cli",
72337
- context: {
72338
- sessionId: context.sessionId,
72339
- correlationId: context.correlationId,
72340
- traceId: context.traceId,
72341
- hook: context.hook,
72342
- taskId: context.taskId
72343
- },
72344
- payload: {
72345
- reminderName: state.reminderName,
72346
- reminderReturned: state.reminderReturned,
72347
- blocking: state.blocking,
72348
- priority: state.priority,
72349
- persistent: state.persistent
72350
- }
72351
- };
72352
- },
72353
- // Note: reminderStaged stays in @sidekick/core (used by staging-service.ts, circular dep)
72354
- /**
72355
- * Create a ReminderUnstaged event (logged when a reminder is removed from staging).
72356
- */
72357
- reminderUnstaged(context, state) {
72358
- return {
72359
- type: "reminder:unstaged",
72360
- time: Date.now(),
72361
- source: "daemon",
72362
- context: {
72363
- sessionId: context.sessionId,
72364
- correlationId: context.correlationId,
72365
- traceId: context.traceId,
72366
- hook: context.hook,
72367
- taskId: context.taskId
72368
- },
72369
- payload: {
72370
- reminderName: state.reminderName,
72371
- hookName: state.hookName,
72372
- reason: state.reason
72373
- }
72374
- };
72375
- },
72376
- /**
72377
- * Create a RemindersCleared event (logged when staging directory is cleaned).
72378
- */
72379
- remindersCleared(context, state, reason) {
72380
- return {
72381
- type: "reminder:cleared",
72382
- time: Date.now(),
72383
- source: "daemon",
72384
- context: {
72385
- sessionId: context.sessionId,
72386
- correlationId: context.correlationId,
72387
- traceId: context.traceId,
72388
- hook: context.hook,
72389
- taskId: context.taskId
72390
- },
72391
- payload: {
72392
- clearedCount: state.clearedCount,
72393
- hookNames: state.hookNames,
72394
- reason
72395
- }
72396
- };
72397
- }
72398
- };
72399
- }
72400
- });
72401
-
72402
72480
  // ../feature-reminders/dist/tool-pattern-matcher.js
72403
72481
  var require_tool_pattern_matcher = __commonJS({
72404
72482
  "../feature-reminders/dist/tool-pattern-matcher.js"(exports2) {
@@ -72506,22 +72584,48 @@ var require_track_verification_tools = __commonJS({
72506
72584
  }
72507
72585
  });
72508
72586
  }
72509
- async function stageToolsForFiles(filePaths, daemonCtx, sessionId, verificationTools, toolsState, remindersState) {
72587
+ async function stageToolsForFiles(filePaths, daemonCtx, sessionId, verificationTools, toolsState, remindersState, triggeredBy = "file_edit") {
72510
72588
  const existingReminders = await daemonCtx.staging.listReminders("Stop");
72511
72589
  const stagedNames = new Set(existingReminders.map((r) => r.name));
72512
72590
  let anyStaged = false;
72591
+ const emittedNotStaged = /* @__PURE__ */ new Set();
72513
72592
  for (const filePath of filePaths) {
72514
72593
  for (const [toolName, toolConfig] of Object.entries(verificationTools)) {
72515
- if (!toolConfig.enabled)
72516
- continue;
72517
72594
  const reminderId = TOOL_REMINDER_MAP[toolName];
72518
72595
  if (!reminderId)
72519
72596
  continue;
72520
- if (!picomatch_1.default.isMatch(filePath, toolConfig.clearing_patterns))
72597
+ if (!toolConfig.enabled) {
72598
+ const emitKey = `${reminderId}:feature_disabled`;
72599
+ if (!emittedNotStaged.has(emitKey)) {
72600
+ emittedNotStaged.add(emitKey);
72601
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
72602
+ reminderName: reminderId,
72603
+ hookName: "Stop",
72604
+ reason: "feature_disabled",
72605
+ triggeredBy
72606
+ }));
72607
+ }
72608
+ continue;
72609
+ }
72610
+ if (!picomatch_1.default.isMatch(filePath, toolConfig.clearing_patterns)) {
72611
+ const emitKey = `${reminderId}:pattern_mismatch`;
72612
+ if (!emittedNotStaged.has(emitKey)) {
72613
+ emittedNotStaged.add(emitKey);
72614
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
72615
+ reminderName: reminderId,
72616
+ hookName: "Stop",
72617
+ reason: "pattern_mismatch",
72618
+ triggeredBy
72619
+ }));
72620
+ }
72521
72621
  continue;
72622
+ }
72522
72623
  const current = toolsState[toolName];
72523
72624
  if (!current || current.status === "staged") {
72524
- const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames);
72625
+ const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames, {
72626
+ reason: current ? "re-staged" : "initial",
72627
+ triggeredBy: "file_edit"
72628
+ });
72525
72629
  if (staged) {
72526
72630
  if (!current) {
72527
72631
  toolsState[toolName] = {
@@ -72537,7 +72641,11 @@ var require_track_verification_tools = __commonJS({
72537
72641
  } else {
72538
72642
  const newEdits = current.editsSinceVerified + 1;
72539
72643
  if (newEdits >= toolConfig.clearing_threshold) {
72540
- const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames);
72644
+ const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames, {
72645
+ reason: "threshold_reached",
72646
+ triggeredBy: "file_edit",
72647
+ thresholdState: { current: newEdits, threshold: toolConfig.clearing_threshold }
72648
+ });
72541
72649
  if (staged) {
72542
72650
  toolsState[toolName] = {
72543
72651
  ...current,
@@ -72554,6 +72662,14 @@ var require_track_verification_tools = __commonJS({
72554
72662
  status: "cooldown",
72555
72663
  editsSinceVerified: newEdits
72556
72664
  };
72665
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
72666
+ reminderName: reminderId,
72667
+ hookName: "Stop",
72668
+ reason: "below_threshold",
72669
+ threshold: toolConfig.clearing_threshold,
72670
+ currentValue: newEdits,
72671
+ triggeredBy
72672
+ }));
72557
72673
  }
72558
72674
  }
72559
72675
  }
@@ -72599,7 +72715,16 @@ var require_track_verification_tools = __commonJS({
72599
72715
  lastMatchedScope: match.scope
72600
72716
  };
72601
72717
  await daemonCtx.staging.deleteReminder("Stop", reminderId);
72602
- (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, { reminderName: reminderId, hookName: "Stop", reason: "tool_verified" }));
72718
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, {
72719
+ reminderName: reminderId,
72720
+ hookName: "Stop",
72721
+ reason: "tool_verified",
72722
+ triggeredBy: "verification_passed",
72723
+ toolState: {
72724
+ status: toolsState[toolName].status,
72725
+ editsSinceVerified: toolsState[toolName].editsSinceVerified
72726
+ }
72727
+ }));
72603
72728
  anyUnstaged = true;
72604
72729
  daemonCtx.logger.debug("VC tool verified", {
72605
72730
  toolName,
@@ -72614,13 +72739,18 @@ var require_track_verification_tools = __commonJS({
72614
72739
  const hasPerToolReminders = remaining.some((r) => VC_TOOL_NAME_SET.has(r.name));
72615
72740
  if (!hasPerToolReminders) {
72616
72741
  await daemonCtx.staging.deleteReminder("Stop", types_js_1.ReminderIds.VERIFY_COMPLETION);
72617
- (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" }));
72742
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, {
72743
+ reminderName: types_js_1.ReminderIds.VERIFY_COMPLETION,
72744
+ hookName: "Stop",
72745
+ reason: "all_tools_verified",
72746
+ triggeredBy: "verification_passed"
72747
+ }));
72618
72748
  daemonCtx.logger.info("All VC tools verified, unstaged wrapper", { sessionId });
72619
72749
  }
72620
72750
  await remindersState.verificationTools.write(sessionId, toolsState);
72621
72751
  }
72622
72752
  }
72623
- async function ensureToolReminderStaged(daemonCtx, reminderId, stagedNames) {
72753
+ async function ensureToolReminderStaged(daemonCtx, reminderId, stagedNames, enrichment) {
72624
72754
  if (stagedNames.has(reminderId))
72625
72755
  return true;
72626
72756
  const reminder = (0, reminder_utils_js_1.resolveReminder)(reminderId, {
@@ -72634,7 +72764,7 @@ var require_track_verification_tools = __commonJS({
72634
72764
  await (0, reminder_utils_js_1.stageReminder)(daemonCtx, "Stop", {
72635
72765
  ...reminder,
72636
72766
  stagedAt: { timestamp: Date.now(), turnCount: 0, toolsThisTurn: 0, toolCount: 0 }
72637
- });
72767
+ }, enrichment);
72638
72768
  return true;
72639
72769
  }
72640
72770
  }
@@ -72650,6 +72780,7 @@ var require_stage_stop_bash_changes = __commonJS({
72650
72780
  Object.defineProperty(exports2, "__esModule", { value: true });
72651
72781
  exports2.registerStageBashChanges = registerStageBashChanges;
72652
72782
  var core_1 = require_dist4();
72783
+ var events_js_1 = require_events2();
72653
72784
  var types_1 = require_dist();
72654
72785
  var picomatch_1 = __importDefault(require_picomatch2());
72655
72786
  var track_verification_tools_js_1 = require_track_verification_tools();
@@ -72719,6 +72850,12 @@ var require_stage_stop_bash_changes = __commonJS({
72719
72850
  if (lastConsumed?.stagedAt) {
72720
72851
  const shouldReactivate = metrics.turnCount > lastConsumed.stagedAt.turnCount;
72721
72852
  if (!shouldReactivate) {
72853
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
72854
+ reminderName: "verify-completion",
72855
+ hookName: "Stop",
72856
+ reason: "same_turn",
72857
+ triggeredBy: "bash_command"
72858
+ }));
72722
72859
  daemonCtx.logger.debug("Bash VC: skipped (already consumed this turn)", {
72723
72860
  currentTurn: metrics.turnCount,
72724
72861
  lastConsumedTurn: lastConsumed.stagedAt.turnCount
@@ -72734,12 +72871,25 @@ var require_stage_stop_bash_changes = __commonJS({
72734
72871
  currentCount: current.length,
72735
72872
  newFileCount: newFiles.length
72736
72873
  });
72737
- if (newFiles.length === 0)
72874
+ if (newFiles.length === 0) {
72875
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
72876
+ reminderName: "verify-completion",
72877
+ hookName: "Stop",
72878
+ reason: "no_changes_detected",
72879
+ triggeredBy: "bash_command"
72880
+ }));
72738
72881
  return;
72882
+ }
72739
72883
  const featureConfig = context.config.getFeature("reminders");
72740
72884
  const config = { ...types_js_1.DEFAULT_REMINDERS_SETTINGS, ...featureConfig.settings };
72741
72885
  const sourceMatches = newFiles.filter((f) => picomatch_1.default.isMatch(f, config.source_code_patterns));
72742
72886
  if (sourceMatches.length === 0) {
72887
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
72888
+ reminderName: "verify-completion",
72889
+ hookName: "Stop",
72890
+ reason: "pattern_mismatch",
72891
+ triggeredBy: "bash_command"
72892
+ }));
72743
72893
  daemonCtx.logger.debug("Bash VC: new files found but no source code matches", { newFiles });
72744
72894
  return;
72745
72895
  }
@@ -72753,7 +72903,7 @@ var require_stage_stop_bash_changes = __commonJS({
72753
72903
  const remindersState = (0, state_js_1.createRemindersState)(daemonCtx.stateService);
72754
72904
  const stateResult = await remindersState.verificationTools.read(sessionId);
72755
72905
  const toolsState = { ...stateResult.data };
72756
- await (0, track_verification_tools_js_1.stageToolsForFiles)(sourceMatches, daemonCtx, sessionId, verificationTools, toolsState, remindersState);
72906
+ await (0, track_verification_tools_js_1.stageToolsForFiles)(sourceMatches, daemonCtx, sessionId, verificationTools, toolsState, remindersState, "bash_command");
72757
72907
  }
72758
72908
  });
72759
72909
  }
@@ -72866,6 +73016,11 @@ var require_unstage_verify_completion = __commonJS({
72866
73016
  await remindersState.vcUnverified.delete(sessionId);
72867
73017
  }
72868
73018
  } else {
73019
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
73020
+ reminderName: "verify-completion",
73021
+ hookName: "Stop",
73022
+ reason: "no_unverified_changes"
73023
+ }));
72869
73024
  daemonCtx.logger.info("VC unstage: no unverified changes, clearing reminder", {
72870
73025
  sessionId,
72871
73026
  hadState: unverifiedState !== null
@@ -72875,7 +73030,12 @@ var require_unstage_verify_completion = __commonJS({
72875
73030
  const reason = unverifiedState?.hasUnverifiedChanges ? "cycle_limit_reached" : "no_unverified_changes";
72876
73031
  for (const vcId of types_js_1.ALL_VC_REMINDER_IDS) {
72877
73032
  await daemonCtx.staging.deleteReminder("Stop", vcId);
72878
- (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, { reminderName: vcId, hookName: "Stop", reason }));
73033
+ (0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
73034
+ reminderName: vcId,
73035
+ hookName: "Stop",
73036
+ reason,
73037
+ triggeredBy: unverifiedState?.hasUnverifiedChanges ? "cycle_limit" : "no_unverified_changes"
73038
+ }));
72879
73039
  }
72880
73040
  daemonCtx.logger.debug("VC unstage: deleted all VC reminders");
72881
73041
  }
@@ -72973,12 +73133,22 @@ var require_stage_persona_reminders = __commonJS({
72973
73133
  }
72974
73134
  async function stagePersonaRemindersForSession(ctx, sessionId, options) {
72975
73135
  if (!isPersonaInjectionEnabled(ctx)) {
73136
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
73137
+ reminderName: "remember-your-persona",
73138
+ hookName: "PreToolUse",
73139
+ reason: "feature_disabled"
73140
+ }));
72976
73141
  await clearPersonaReminders(ctx, sessionId);
72977
73142
  ctx.logger.debug("Persona injection disabled by config, cleaned up reminders", { sessionId });
72978
73143
  return;
72979
73144
  }
72980
73145
  const persona = await loadPersonaForSession(ctx, sessionId);
72981
73146
  if (!persona) {
73147
+ (0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
73148
+ reminderName: "remember-your-persona",
73149
+ hookName: "PreToolUse",
73150
+ reason: "no_persona"
73151
+ }));
72982
73152
  await clearPersonaReminders(ctx, sessionId);
72983
73153
  ctx.logger.debug("Persona cleared or disabled, unstaged persona reminders", { sessionId });
72984
73154
  return;
@@ -73278,7 +73448,19 @@ var require_consumption_handler_factory = __commonJS({
73278
73448
  reader.renameReminder(hook, reminder.name);
73279
73449
  }
73280
73450
  }
73281
- let response = buildResponse ? await buildResponse({ reminder: primary, reader, cliCtx, sessionId, event, supportsBlocking }) : buildDefaultResponse(primary, supportsBlocking);
73451
+ let enrichment;
73452
+ let response;
73453
+ if (buildResponse) {
73454
+ const result = await buildResponse({ reminder: primary, reader, cliCtx, sessionId, event, supportsBlocking });
73455
+ if ("response" in result && typeof result.response === "object") {
73456
+ response = result.response;
73457
+ enrichment = result.enrichment;
73458
+ } else {
73459
+ response = result;
73460
+ }
73461
+ } else {
73462
+ response = buildDefaultResponse(primary, supportsBlocking);
73463
+ }
73282
73464
  const secondaryContexts = reminders.slice(1).map((r) => r.additionalContext).filter((ctx2) => !!ctx2);
73283
73465
  if (secondaryContexts.length > 0) {
73284
73466
  const existing = response.additionalContext;
@@ -73296,7 +73478,8 @@ var require_consumption_handler_factory = __commonJS({
73296
73478
  reminderReturned: true,
73297
73479
  blocking: response.blocking ?? false,
73298
73480
  priority: primary.priority,
73299
- persistent: primary.persistent
73481
+ persistent: primary.persistent,
73482
+ ...enrichment
73300
73483
  }));
73301
73484
  return { response };
73302
73485
  }
@@ -73398,6 +73581,13 @@ var require_inject_stop = __commonJS({
73398
73581
  shouldBlock: classification.shouldBlock,
73399
73582
  reasoning: classification.reasoning?.slice(0, 200)
73400
73583
  });
73584
+ const classificationEnrichment = {
73585
+ classificationResult: {
73586
+ category: classification.category,
73587
+ confidence: classification.confidence,
73588
+ shouldBlock: classification.shouldBlock
73589
+ }
73590
+ };
73401
73591
  if (classification.shouldBlock) {
73402
73592
  cliCtx.logger.info("VC inject-stop: BLOCKING (claiming completion)", { sessionId });
73403
73593
  try {
@@ -73407,7 +73597,10 @@ var require_inject_stop = __commonJS({
73407
73597
  error: String(clearErr)
73408
73598
  });
73409
73599
  }
73410
- return (0, consumption_handler_factory_js_1.buildDefaultResponse)(reminder, supportsBlocking);
73600
+ return {
73601
+ response: (0, consumption_handler_factory_js_1.buildDefaultResponse)(reminder, supportsBlocking),
73602
+ enrichment: classificationEnrichment
73603
+ };
73411
73604
  } else {
73412
73605
  cliCtx.logger.info("VC inject-stop: NOT BLOCKING", {
73413
73606
  sessionId,
@@ -73433,13 +73626,13 @@ var require_inject_stop = __commonJS({
73433
73626
  });
73434
73627
  }
73435
73628
  if (classification.category === "ASKING_QUESTION" || classification.category === "ANSWERING_QUESTION") {
73436
- return {};
73629
+ return { response: {}, enrichment: classificationEnrichment };
73437
73630
  } else {
73438
73631
  const response = {};
73439
73632
  if (classification.userMessage) {
73440
73633
  response.userMessage = classification.userMessage;
73441
73634
  }
73442
- return response;
73635
+ return { response, enrichment: classificationEnrichment };
73443
73636
  }
73444
73637
  }
73445
73638
  } catch (err) {
@@ -73810,7 +74003,8 @@ var require_orchestrator = __commonJS({
73810
74003
  (0, core_1.logEvent)(this.deps.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
73811
74004
  reminderName: vcId,
73812
74005
  hookName: "Stop",
73813
- reason: "pause_and_reflect_cascade"
74006
+ reason: "pause_and_reflect_cascade",
74007
+ triggeredBy: "cascade_from_pause_and_reflect"
73814
74008
  }));
73815
74009
  }
73816
74010
  this.deps.logger.debug("Unstaged all VC reminders after P&R staged", { sessionId });
@@ -73847,7 +74041,12 @@ var require_orchestrator = __commonJS({
73847
74041
  try {
73848
74042
  const staging = this.deps.getStagingService(sessionId);
73849
74043
  await staging.deleteReminder("PreToolUse", types_js_1.ReminderIds.PAUSE_AND_REFLECT);
73850
- (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" }));
74044
+ (0, core_1.logEvent)(this.deps.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, {
74045
+ reminderName: types_js_1.ReminderIds.PAUSE_AND_REFLECT,
74046
+ hookName: "PreToolUse",
74047
+ reason: "vc_consumed_cascade",
74048
+ triggeredBy: "cascade_from_verify_completion"
74049
+ }));
73851
74050
  this.deps.logger.debug("Unstaged P&R after VC consumed", { sessionId });
73852
74051
  } catch (err) {
73853
74052
  this.deps.logger.warn("Failed to unstage P&R after VC consumed", {
@@ -77051,6 +77250,7 @@ var require_daemon = __commonJS({
77051
77250
  async start() {
77052
77251
  try {
77053
77252
  this.logger.info("Daemon starting", { projectDir: this.projectDir, pid: process.pid });
77253
+ (0, core_1.logEvent)(this.logger, core_1.LogEvents.daemonStarting({ projectDir: this.projectDir, pid: process.pid }));
77054
77254
  this.setupErrorHandlers();
77055
77255
  await this.writePid();
77056
77256
  await this.writeToken();
@@ -77062,7 +77262,14 @@ var require_daemon = __commonJS({
77062
77262
  }
77063
77263
  (0, task_handlers_js_1.registerStandardTaskHandlers)(this.taskEngine, this.stateService, this.projectDir, this.logger, this.configService.getAll(), this.assetResolver);
77064
77264
  await this.ipcServer.start();
77265
+ (0, core_1.logEvent)(this.logger, core_1.LogEvents.ipcServerStarted({ socketPath: (0, core_1.getSocketPath)(this.projectDir) }));
77065
77266
  this.configWatcher.start();
77267
+ const watchedFiles = [
77268
+ this.stateService.rootDir(),
77269
+ path_1.default.join((0, os_1.homedir)(), ".sidekick"),
77270
+ ...this.configService.core.development.enabled ? [(0, core_1.getDefaultAssetsDir)()] : []
77271
+ ];
77272
+ (0, core_1.logEvent)(this.logger, core_1.LogEvents.configWatcherStarted({ projectDir: this.projectDir, watchedFiles }));
77066
77273
  this.personaWatcher.start();
77067
77274
  this.startIdleCheck();
77068
77275
  this.startHeartbeat();
@@ -77070,6 +77277,7 @@ var require_daemon = __commonJS({
77070
77277
  await this.registerProject();
77071
77278
  this.startRegistryHeartbeat();
77072
77279
  this.logger.info("Daemon started successfully");
77280
+ (0, core_1.logEvent)(this.logger, core_1.LogEvents.daemonStarted({ startupDurationMs: Date.now() - this.startTime }));
77073
77281
  await (0, core_1.updateDaemonHealth)(this.projectDir, "healthy", this.logger);
77074
77282
  } catch (err) {
77075
77283
  this.logger.fatal("Failed to start daemon", { error: err });
@@ -78035,6 +78243,7 @@ var require_daemon = __commonJS({
78035
78243
  }, EVICTION_INTERVAL_MS);
78036
78244
  this.evictionTimer.unref();
78037
78245
  this.logger.info("Session eviction timer started", { intervalMs: EVICTION_INTERVAL_MS });
78246
+ (0, core_1.logEvent)(this.logger, core_1.LogEvents.sessionEvictionStarted({ intervalMs: EVICTION_INTERVAL_MS }));
78038
78247
  }
78039
78248
  stopEvictionTimer() {
78040
78249
  if (this.evictionTimer) {