@scotthamilton77/sidekick 0.1.5 → 0.1.7

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/daemon.js CHANGED
@@ -54,6 +54,7 @@ var require_events = __commonJS({
54
54
  "../types/dist/events.js"(exports2) {
55
55
  "use strict";
56
56
  Object.defineProperty(exports2, "__esModule", { value: true });
57
+ exports2.HOOK_NAMES = void 0;
57
58
  exports2.isHookEvent = isHookEvent;
58
59
  exports2.isTranscriptEvent = isTranscriptEvent;
59
60
  exports2.isSessionStartEvent = isSessionStartEvent;
@@ -67,6 +68,15 @@ var require_events = __commonJS({
67
68
  exports2.isCLILoggingEvent = isCLILoggingEvent;
68
69
  exports2.isDaemonLoggingEvent = isDaemonLoggingEvent;
69
70
  exports2.isTranscriptLoggingEvent = isTranscriptLoggingEvent;
71
+ exports2.HOOK_NAMES = [
72
+ "SessionStart",
73
+ "SessionEnd",
74
+ "UserPromptSubmit",
75
+ "PreToolUse",
76
+ "PostToolUse",
77
+ "Stop",
78
+ "PreCompact"
79
+ ];
70
80
  function isHookEvent(event) {
71
81
  return event.kind === "hook";
72
82
  }
@@ -16227,6 +16237,7 @@ var require_staging = __commonJS({
16227
16237
  userMessage: zod_1.z.string().optional(),
16228
16238
  additionalContext: zod_1.z.string().optional(),
16229
16239
  reason: zod_1.z.string().optional(),
16240
+ throttle: zod_1.z.boolean().optional(),
16230
16241
  stagedAt: exports2.StagingMetricsSchema.optional()
16231
16242
  });
16232
16243
  }
@@ -16237,9 +16248,10 @@ var require_state = __commonJS({
16237
16248
  "../types/dist/services/state.js"(exports2) {
16238
16249
  "use strict";
16239
16250
  Object.defineProperty(exports2, "__esModule", { value: true });
16240
- exports2.DEFAULT_LATENCY_STATS = exports2.LLMMetricsStateSchema = exports2.LLMSessionTotalsSchema = exports2.LLMProviderMetricsSchema = exports2.LLMModelMetricsSchema = exports2.LLMLatencyStatsSchema = exports2.DEFAULT_PROJECT_METRICS = exports2.DEFAULT_BASE_METRICS = exports2.SessionContextMetricsSchema = exports2.ProjectContextMetricsSchema = exports2.BaseTokenMetricsStateSchema = exports2.UPSThrottleStateSchema = exports2.VerificationToolsStateSchema = exports2.VerificationToolStatusSchema = exports2.VCUnverifiedStateSchema = exports2.PRBaselineStateSchema = exports2.EMPTY_LOG_METRICS = exports2.LogMetricsStateSchema = exports2.TranscriptMetricsStateSchema = exports2.ResumeMessageStateSchema = exports2.SnarkyMessageStateSchema = exports2.SummaryCountdownStateSchema = exports2.LastStagedPersonaSchema = exports2.SessionPersonaStateSchema = exports2.SESSION_SUMMARY_PLACEHOLDERS = exports2.SessionSummaryStateSchema = void 0;
16251
+ exports2.DEFAULT_LATENCY_STATS = exports2.LLMMetricsStateSchema = exports2.LLMSessionTotalsSchema = exports2.LLMProviderMetricsSchema = exports2.LLMModelMetricsSchema = exports2.LLMLatencyStatsSchema = exports2.DEFAULT_PROJECT_METRICS = exports2.DEFAULT_BASE_METRICS = exports2.SessionContextMetricsSchema = exports2.ProjectContextMetricsSchema = exports2.BaseTokenMetricsStateSchema = exports2.ReminderThrottleStateSchema = exports2.ReminderThrottleEntrySchema = exports2.CachedReminderSchema = exports2.VerificationToolsStateSchema = exports2.VerificationToolStatusSchema = exports2.VCUnverifiedStateSchema = exports2.PRBaselineStateSchema = exports2.EMPTY_LOG_METRICS = exports2.LogMetricsStateSchema = exports2.TranscriptMetricsStateSchema = exports2.ResumeMessageStateSchema = exports2.SnarkyMessageStateSchema = exports2.SummaryCountdownStateSchema = exports2.LastStagedPersonaSchema = exports2.SessionPersonaStateSchema = exports2.SESSION_SUMMARY_PLACEHOLDERS = exports2.SessionSummaryStateSchema = void 0;
16241
16252
  exports2.createDefaultLLMMetrics = createDefaultLLMMetrics;
16242
16253
  var zod_1 = require_zod();
16254
+ var events_js_1 = require_events();
16243
16255
  exports2.SessionSummaryStateSchema = zod_1.z.object({
16244
16256
  /** Session identifier */
16245
16257
  session_id: zod_1.z.string(),
@@ -16401,10 +16413,25 @@ var require_state = __commonJS({
16401
16413
  lastMatchedScope: zod_1.z.enum(["project", "package", "file"]).nullable().optional()
16402
16414
  });
16403
16415
  exports2.VerificationToolsStateSchema = zod_1.z.record(zod_1.z.string(), exports2.VerificationToolStatusSchema);
16404
- exports2.UPSThrottleStateSchema = zod_1.z.object({
16416
+ exports2.CachedReminderSchema = zod_1.z.object({
16417
+ name: zod_1.z.string(),
16418
+ blocking: zod_1.z.boolean(),
16419
+ priority: zod_1.z.number(),
16420
+ persistent: zod_1.z.boolean(),
16421
+ throttle: zod_1.z.boolean().optional(),
16422
+ userMessage: zod_1.z.string().optional(),
16423
+ additionalContext: zod_1.z.string().optional(),
16424
+ reason: zod_1.z.string().optional()
16425
+ });
16426
+ exports2.ReminderThrottleEntrySchema = zod_1.z.object({
16405
16427
  /** Number of conversation messages since the reminder was last staged */
16406
- messagesSinceLastStaging: zod_1.z.number()
16428
+ messagesSinceLastStaging: zod_1.z.number().int().nonnegative(),
16429
+ /** Hook to re-stage the reminder for */
16430
+ targetHook: zod_1.z.enum(events_js_1.HOOK_NAMES),
16431
+ /** Cached resolved reminder content for re-staging */
16432
+ cachedReminder: exports2.CachedReminderSchema
16407
16433
  });
16434
+ exports2.ReminderThrottleStateSchema = zod_1.z.record(zod_1.z.string(), exports2.ReminderThrottleEntrySchema);
16408
16435
  exports2.BaseTokenMetricsStateSchema = zod_1.z.object({
16409
16436
  /** System prompt tokens (~3.2k) */
16410
16437
  systemPromptTokens: zod_1.z.number(),
@@ -69802,6 +69829,7 @@ var require_reminder_utils = __commonJS({
69802
69829
  blocking: zod_1.z.boolean(),
69803
69830
  priority: zod_1.z.number(),
69804
69831
  persistent: zod_1.z.boolean(),
69832
+ throttle: zod_1.z.boolean().optional(),
69805
69833
  userMessage: zod_1.z.string().optional(),
69806
69834
  additionalContext: zod_1.z.string().optional(),
69807
69835
  reason: zod_1.z.string().optional()
@@ -69852,6 +69880,7 @@ var require_reminder_utils = __commonJS({
69852
69880
  blocking: def.blocking,
69853
69881
  priority: def.priority,
69854
69882
  persistent: def.persistent,
69883
+ throttle: def.throttle,
69855
69884
  userMessage: def.userMessage ? interpolateTemplate(def.userMessage, context) : void 0,
69856
69885
  additionalContext: def.additionalContext ? interpolateTemplate(def.additionalContext, context) : void 0,
69857
69886
  reason: def.reason ? interpolateTemplate(def.reason, context) : void 0
@@ -70148,7 +70177,10 @@ var require_types2 = __commonJS({
70148
70177
  max_verification_cycles: -1,
70149
70178
  // -1 = unlimited, 0 = disabled
70150
70179
  verification_tools: exports2.DEFAULT_VERIFICATION_TOOLS,
70151
- user_prompt_submit_threshold: 10
70180
+ reminder_thresholds: {
70181
+ "user-prompt-submit": 10,
70182
+ "remember-your-persona": 5
70183
+ }
70152
70184
  };
70153
70185
  exports2.ReminderIds = {
70154
70186
  USER_PROMPT_SUBMIT: "user-prompt-submit",
@@ -70192,8 +70224,8 @@ var require_state3 = __commonJS({
70192
70224
  defaultValue: {},
70193
70225
  trackHistory: false
70194
70226
  });
70195
- var UPSThrottleDescriptor = (0, core_1.sessionState)("ups-throttle.json", types_1.UPSThrottleStateSchema, {
70196
- defaultValue: { messagesSinceLastStaging: 0 },
70227
+ var ReminderThrottleDescriptor = (0, core_1.sessionState)("reminder-throttle.json", types_1.ReminderThrottleStateSchema, {
70228
+ defaultValue: {},
70197
70229
  trackHistory: false
70198
70230
  });
70199
70231
  function createRemindersState(stateService) {
@@ -70201,8 +70233,40 @@ var require_state3 = __commonJS({
70201
70233
  prBaseline: new core_1.SessionStateAccessor(stateService, PRBaselineDescriptor),
70202
70234
  vcUnverified: new core_1.SessionStateAccessor(stateService, VCUnverifiedDescriptor),
70203
70235
  verificationTools: new core_1.SessionStateAccessor(stateService, VerificationToolsDescriptor),
70204
- upsThrottle: new core_1.SessionStateAccessor(stateService, UPSThrottleDescriptor)
70236
+ reminderThrottle: new core_1.SessionStateAccessor(stateService, ReminderThrottleDescriptor)
70237
+ };
70238
+ }
70239
+ }
70240
+ });
70241
+
70242
+ // ../feature-reminders/dist/handlers/staging/throttle-utils.js
70243
+ var require_throttle_utils = __commonJS({
70244
+ "../feature-reminders/dist/handlers/staging/throttle-utils.js"(exports2) {
70245
+ "use strict";
70246
+ Object.defineProperty(exports2, "__esModule", { value: true });
70247
+ exports2.registerThrottledReminder = registerThrottledReminder;
70248
+ exports2.resetThrottleCounters = resetThrottleCounters;
70249
+ var state_js_1 = require_state3();
70250
+ async function registerThrottledReminder(ctx, sessionId, reminderId, targetHook, resolvedReminder) {
70251
+ const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
70252
+ const result = await remindersState.reminderThrottle.read(sessionId);
70253
+ const state = { ...result.data };
70254
+ const { stagedAt: _stagedAt, ...cachedReminder } = resolvedReminder;
70255
+ state[reminderId] = {
70256
+ messagesSinceLastStaging: 0,
70257
+ targetHook,
70258
+ cachedReminder
70205
70259
  };
70260
+ await remindersState.reminderThrottle.write(sessionId, state);
70261
+ }
70262
+ async function resetThrottleCounters(ctx, sessionId) {
70263
+ const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
70264
+ const result = await remindersState.reminderThrottle.read(sessionId);
70265
+ const state = { ...result.data };
70266
+ for (const key of Object.keys(state)) {
70267
+ state[key] = { ...state[key], messagesSinceLastStaging: 0 };
70268
+ }
70269
+ await remindersState.reminderThrottle.write(sessionId, state);
70206
70270
  }
70207
70271
  }
70208
70272
  });
@@ -70218,6 +70282,7 @@ var require_stage_default_user_prompt = __commonJS({
70218
70282
  var types_js_1 = require_types2();
70219
70283
  var reminder_utils_js_1 = require_reminder_utils();
70220
70284
  var state_js_1 = require_state3();
70285
+ var throttle_utils_js_1 = require_throttle_utils();
70221
70286
  function registerStageDefaultUserPrompt(context) {
70222
70287
  (0, staging_handler_utils_js_1.createStagingHandler)(context, {
70223
70288
  id: "reminders:stage-default-user-prompt",
@@ -70235,23 +70300,6 @@ var require_stage_default_user_prompt = __commonJS({
70235
70300
  };
70236
70301
  }
70237
70302
  });
70238
- if ((0, types_1.isDaemonContext)(context)) {
70239
- const startCtx = context;
70240
- context.handlers.register({
70241
- id: "reminders:ups-throttle-reset-session-start",
70242
- priority: 49,
70243
- filter: { kind: "hook", hooks: ["SessionStart"] },
70244
- handler: async (event) => {
70245
- if (!(0, types_1.isHookEvent)(event) || !(0, types_1.isSessionStartEvent)(event))
70246
- return;
70247
- const sessionId = event.context.sessionId;
70248
- if (!sessionId)
70249
- return;
70250
- const remindersState = (0, state_js_1.createRemindersState)(startCtx.stateService);
70251
- await remindersState.upsThrottle.write(sessionId, { messagesSinceLastStaging: 0 });
70252
- }
70253
- });
70254
- }
70255
70303
  (0, staging_handler_utils_js_1.createStagingHandler)(context, {
70256
70304
  id: "reminders:stage-default-user-prompt-after-bulk",
70257
70305
  priority: 50,
@@ -70268,65 +70316,120 @@ var require_stage_default_user_prompt = __commonJS({
70268
70316
  };
70269
70317
  }
70270
70318
  });
70271
- if ((0, types_1.isDaemonContext)(context)) {
70272
- const bulkCtx = context;
70273
- context.handlers.register({
70274
- id: "reminders:ups-throttle-reset-bulk",
70275
- priority: 49,
70276
- filter: { kind: "transcript", eventTypes: ["BulkProcessingComplete"] },
70277
- handler: async (event) => {
70278
- if (!(0, types_1.isTranscriptEvent)(event))
70279
- return;
70280
- if (event.metadata.isBulkProcessing)
70281
- return;
70282
- const sessionId = event.context?.sessionId;
70283
- if (!sessionId)
70284
- return;
70285
- const remindersState = (0, state_js_1.createRemindersState)(bulkCtx.stateService);
70286
- await remindersState.upsThrottle.write(sessionId, { messagesSinceLastStaging: 0 });
70287
- }
70288
- });
70289
- }
70290
70319
  if (!(0, types_1.isDaemonContext)(context))
70291
70320
  return;
70292
70321
  context.handlers.register({
70293
- id: "reminders:ups-throttle-restage",
70294
- priority: 50,
70295
- filter: { kind: "transcript", eventTypes: ["UserPrompt", "AssistantMessage"] },
70322
+ id: "reminders:throttle-register-ups-session-start",
70323
+ priority: 49,
70324
+ filter: { kind: "hook", hooks: ["SessionStart"] },
70296
70325
  handler: async (event, ctx) => {
70297
- if (!(0, types_1.isTranscriptEvent)(event))
70326
+ if (!(0, types_1.isHookEvent)(event) || !(0, types_1.isSessionStartEvent)(event))
70327
+ return;
70328
+ if (!(0, types_1.isDaemonContext)(ctx))
70329
+ return;
70330
+ const handlerCtx = ctx;
70331
+ const sessionId = event.context.sessionId;
70332
+ if (!sessionId)
70333
+ return;
70334
+ const reminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.USER_PROMPT_SUBMIT, {
70335
+ context: { sessionId },
70336
+ assets: handlerCtx.assets
70337
+ });
70338
+ if (reminder) {
70339
+ await (0, throttle_utils_js_1.registerThrottledReminder)(handlerCtx, sessionId, types_js_1.ReminderIds.USER_PROMPT_SUBMIT, "UserPromptSubmit", reminder);
70340
+ }
70341
+ }
70342
+ });
70343
+ context.handlers.register({
70344
+ id: "reminders:throttle-reset-session-start",
70345
+ priority: 48,
70346
+ filter: { kind: "hook", hooks: ["SessionStart"] },
70347
+ handler: async (event, ctx) => {
70348
+ if (!(0, types_1.isHookEvent)(event) || !(0, types_1.isSessionStartEvent)(event))
70298
70349
  return;
70299
70350
  if (!(0, types_1.isDaemonContext)(ctx))
70300
70351
  return;
70352
+ const handlerCtx = ctx;
70353
+ const sessionId = event.context.sessionId;
70354
+ if (!sessionId)
70355
+ return;
70356
+ await (0, throttle_utils_js_1.resetThrottleCounters)(handlerCtx, sessionId);
70357
+ }
70358
+ });
70359
+ context.handlers.register({
70360
+ id: "reminders:throttle-reset-bulk",
70361
+ priority: 49,
70362
+ filter: { kind: "transcript", eventTypes: ["BulkProcessingComplete"] },
70363
+ handler: async (event, ctx) => {
70364
+ if (!(0, types_1.isTranscriptEvent)(event))
70365
+ return;
70301
70366
  if (event.metadata.isBulkProcessing)
70302
70367
  return;
70368
+ if (!(0, types_1.isDaemonContext)(ctx))
70369
+ return;
70370
+ const handlerCtx = ctx;
70303
70371
  const sessionId = event.context?.sessionId;
70304
70372
  if (!sessionId)
70305
70373
  return;
70374
+ await (0, throttle_utils_js_1.resetThrottleCounters)(handlerCtx, sessionId);
70375
+ }
70376
+ });
70377
+ context.handlers.register({
70378
+ id: "reminders:throttle-restage",
70379
+ priority: 50,
70380
+ filter: { kind: "transcript", eventTypes: ["UserPrompt", "AssistantMessage"] },
70381
+ handler: async (event, ctx) => {
70382
+ if (!(0, types_1.isTranscriptEvent)(event))
70383
+ return;
70384
+ if (event.metadata.isBulkProcessing)
70385
+ return;
70386
+ if (!(0, types_1.isDaemonContext)(ctx))
70387
+ return;
70306
70388
  const handlerCtx = ctx;
70389
+ const sessionId = event.context?.sessionId;
70390
+ if (!sessionId)
70391
+ return;
70307
70392
  const remindersState = (0, state_js_1.createRemindersState)(handlerCtx.stateService);
70308
- const result = await remindersState.upsThrottle.read(sessionId);
70309
- const current = result.data.messagesSinceLastStaging;
70393
+ const result = await remindersState.reminderThrottle.read(sessionId);
70394
+ const state = { ...result.data };
70395
+ if (Object.keys(state).length === 0)
70396
+ return;
70310
70397
  const featureConfig = handlerCtx.config.getFeature("reminders");
70311
70398
  const config = { ...types_js_1.DEFAULT_REMINDERS_SETTINGS, ...featureConfig.settings };
70312
- const threshold = config.user_prompt_submit_threshold ?? 10;
70313
- const newCount = current + 1;
70314
- if (newCount >= threshold) {
70315
- const reminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.USER_PROMPT_SUBMIT, {
70316
- context: { sessionId },
70317
- assets: handlerCtx.assets
70318
- });
70319
- if (reminder) {
70320
- await (0, reminder_utils_js_1.stageReminder)(handlerCtx, "UserPromptSubmit", reminder);
70321
- handlerCtx.logger.debug("UPS throttle: re-staged reminder", {
70399
+ const thresholds = config.reminder_thresholds ?? {};
70400
+ let changed = false;
70401
+ for (const [reminderId, entry] of Object.entries(state)) {
70402
+ const typedEntry = entry;
70403
+ const threshold = thresholds[reminderId];
70404
+ if (threshold === void 0)
70405
+ continue;
70406
+ const newCount = typedEntry.messagesSinceLastStaging + 1;
70407
+ if (newCount >= threshold) {
70408
+ const metrics = event.metadata.metrics;
70409
+ const stagedAt = {
70410
+ timestamp: Date.now(),
70411
+ turnCount: metrics.turnCount,
70412
+ toolsThisTurn: metrics.toolsThisTurn,
70413
+ toolCount: metrics.toolCount
70414
+ };
70415
+ await (0, reminder_utils_js_1.stageReminder)(handlerCtx, typedEntry.targetHook, {
70416
+ ...typedEntry.cachedReminder,
70417
+ stagedAt
70418
+ });
70419
+ state[reminderId] = { ...typedEntry, messagesSinceLastStaging: 0 };
70420
+ handlerCtx.logger.debug("Throttle: re-staged reminder", {
70322
70421
  sessionId,
70422
+ reminderId,
70323
70423
  messageCount: newCount,
70324
70424
  threshold
70325
70425
  });
70426
+ } else {
70427
+ state[reminderId] = { ...typedEntry, messagesSinceLastStaging: newCount };
70326
70428
  }
70327
- await remindersState.upsThrottle.write(sessionId, { messagesSinceLastStaging: 0 });
70328
- } else {
70329
- await remindersState.upsThrottle.write(sessionId, { messagesSinceLastStaging: newCount });
70429
+ changed = true;
70430
+ }
70431
+ if (changed) {
70432
+ await remindersState.reminderThrottle.write(sessionId, state);
70330
70433
  }
70331
70434
  }
70332
70435
  });
@@ -72029,27 +72132,33 @@ var require_track_verification_tools = __commonJS({
72029
72132
  continue;
72030
72133
  const current = toolsState[toolName];
72031
72134
  if (!current || current.status === "staged") {
72032
- if (!current) {
72033
- toolsState[toolName] = {
72034
- status: "staged",
72035
- editsSinceVerified: 0,
72036
- lastVerifiedAt: null,
72037
- lastStagedAt: Date.now()
72038
- };
72135
+ const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames);
72136
+ if (staged) {
72137
+ if (!current) {
72138
+ toolsState[toolName] = {
72139
+ status: "staged",
72140
+ editsSinceVerified: 0,
72141
+ lastVerifiedAt: null,
72142
+ lastStagedAt: Date.now()
72143
+ };
72144
+ }
72145
+ stagedNames.add(reminderId);
72146
+ anyStaged = true;
72039
72147
  }
72040
- await stageToolReminderIfNeeded(daemonCtx, reminderId, stagedNames);
72041
- anyStaged = true;
72042
72148
  } else {
72043
72149
  const newEdits = current.editsSinceVerified + 1;
72044
72150
  if (newEdits >= toolConfig.clearing_threshold) {
72045
- toolsState[toolName] = {
72046
- ...current,
72047
- status: "staged",
72048
- editsSinceVerified: 0,
72049
- lastStagedAt: Date.now()
72050
- };
72051
- await stageToolReminderIfNeeded(daemonCtx, reminderId, stagedNames);
72052
- anyStaged = true;
72151
+ const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames);
72152
+ if (staged) {
72153
+ toolsState[toolName] = {
72154
+ ...current,
72155
+ status: "staged",
72156
+ editsSinceVerified: 0,
72157
+ lastStagedAt: Date.now()
72158
+ };
72159
+ stagedNames.add(reminderId);
72160
+ anyStaged = true;
72161
+ }
72053
72162
  } else {
72054
72163
  toolsState[toolName] = {
72055
72164
  ...current,
@@ -72061,7 +72170,10 @@ var require_track_verification_tools = __commonJS({
72061
72170
  }
72062
72171
  }
72063
72172
  if (anyStaged) {
72064
- await stageToolReminderIfNeeded(daemonCtx, types_js_1.ReminderIds.VERIFY_COMPLETION, stagedNames);
72173
+ const wrapperStaged = await ensureToolReminderStaged(daemonCtx, types_js_1.ReminderIds.VERIFY_COMPLETION, stagedNames);
72174
+ if (!wrapperStaged) {
72175
+ daemonCtx.logger.warn("Failed to stage verify-completion wrapper reminder", { sessionId });
72176
+ }
72065
72177
  }
72066
72178
  await remindersState.verificationTools.write(sessionId, toolsState);
72067
72179
  return anyStaged;
@@ -72117,21 +72229,22 @@ var require_track_verification_tools = __commonJS({
72117
72229
  await remindersState.verificationTools.write(sessionId, toolsState);
72118
72230
  }
72119
72231
  }
72120
- async function stageToolReminderIfNeeded(daemonCtx, reminderId, stagedNames) {
72232
+ async function ensureToolReminderStaged(daemonCtx, reminderId, stagedNames) {
72121
72233
  if (stagedNames.has(reminderId))
72122
- return;
72234
+ return true;
72123
72235
  const reminder = (0, reminder_utils_js_1.resolveReminder)(reminderId, {
72124
72236
  context: {},
72125
72237
  assets: daemonCtx.assets
72126
72238
  });
72127
72239
  if (!reminder) {
72128
72240
  daemonCtx.logger.warn("Failed to resolve VC tool reminder", { reminderId });
72129
- return;
72241
+ return false;
72130
72242
  }
72131
72243
  await (0, reminder_utils_js_1.stageReminder)(daemonCtx, "Stop", {
72132
72244
  ...reminder,
72133
72245
  stagedAt: { timestamp: Date.now(), turnCount: 0, toolsThisTurn: 0, toolCount: 0 }
72134
72246
  });
72247
+ return true;
72135
72248
  }
72136
72249
  }
72137
72250
  });
@@ -72386,6 +72499,7 @@ var require_stage_persona_reminders = __commonJS({
72386
72499
  var types_1 = require_dist();
72387
72500
  var reminder_utils_js_1 = require_reminder_utils();
72388
72501
  var types_js_1 = require_types2();
72502
+ var throttle_utils_js_1 = require_throttle_utils();
72389
72503
  async function restagePersonaRemindersForActiveSessions(ctxFactory, sessionIds, logger) {
72390
72504
  logger.info("Re-staging persona reminders for active sessions", { count: sessionIds.length });
72391
72505
  for (const sessionId of sessionIds) {
@@ -72468,6 +72582,9 @@ var require_stage_persona_reminders = __commonJS({
72468
72582
  if (reminder) {
72469
72583
  for (const targetHook of PERSONA_REMINDER_HOOKS) {
72470
72584
  await (0, reminder_utils_js_1.stageReminder)(ctx, targetHook, reminder);
72585
+ if (targetHook === "UserPromptSubmit") {
72586
+ await (0, throttle_utils_js_1.registerThrottledReminder)(ctx, sessionId, types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, "UserPromptSubmit", reminder);
72587
+ }
72471
72588
  }
72472
72589
  } else {
72473
72590
  ctx.logger.warn("Failed to resolve persona reminder", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scotthamilton77/sidekick",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "AI pair programming assistant with personas, session tracking, and contextual nudges",
5
5
  "bin": {
6
6
  "sidekick": "dist/bin.js"