@scotthamilton77/sidekick 0.1.5 → 0.1.6

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(),
@@ -55901,7 +55928,8 @@ var require_gitignore = __commonJS({
55901
55928
  ".sidekick/.env.local",
55902
55929
  ".sidekick/sidekick*.pid",
55903
55930
  ".sidekick/sidekick*.token",
55904
- ".sidekick/*.local.yaml"
55931
+ ".sidekick/*.local.yaml",
55932
+ ".sidekick/features.yaml"
55905
55933
  ];
55906
55934
  async function installGitignoreSection(projectDir2) {
55907
55935
  const gitignorePath = path.join(projectDir2, ".gitignore");
@@ -69802,6 +69830,7 @@ var require_reminder_utils = __commonJS({
69802
69830
  blocking: zod_1.z.boolean(),
69803
69831
  priority: zod_1.z.number(),
69804
69832
  persistent: zod_1.z.boolean(),
69833
+ throttle: zod_1.z.boolean().optional(),
69805
69834
  userMessage: zod_1.z.string().optional(),
69806
69835
  additionalContext: zod_1.z.string().optional(),
69807
69836
  reason: zod_1.z.string().optional()
@@ -69852,6 +69881,7 @@ var require_reminder_utils = __commonJS({
69852
69881
  blocking: def.blocking,
69853
69882
  priority: def.priority,
69854
69883
  persistent: def.persistent,
69884
+ throttle: def.throttle,
69855
69885
  userMessage: def.userMessage ? interpolateTemplate(def.userMessage, context) : void 0,
69856
69886
  additionalContext: def.additionalContext ? interpolateTemplate(def.additionalContext, context) : void 0,
69857
69887
  reason: def.reason ? interpolateTemplate(def.reason, context) : void 0
@@ -70148,7 +70178,10 @@ var require_types2 = __commonJS({
70148
70178
  max_verification_cycles: -1,
70149
70179
  // -1 = unlimited, 0 = disabled
70150
70180
  verification_tools: exports2.DEFAULT_VERIFICATION_TOOLS,
70151
- user_prompt_submit_threshold: 10
70181
+ reminder_thresholds: {
70182
+ "user-prompt-submit": 10,
70183
+ "remember-your-persona": 5
70184
+ }
70152
70185
  };
70153
70186
  exports2.ReminderIds = {
70154
70187
  USER_PROMPT_SUBMIT: "user-prompt-submit",
@@ -70192,8 +70225,8 @@ var require_state3 = __commonJS({
70192
70225
  defaultValue: {},
70193
70226
  trackHistory: false
70194
70227
  });
70195
- var UPSThrottleDescriptor = (0, core_1.sessionState)("ups-throttle.json", types_1.UPSThrottleStateSchema, {
70196
- defaultValue: { messagesSinceLastStaging: 0 },
70228
+ var ReminderThrottleDescriptor = (0, core_1.sessionState)("reminder-throttle.json", types_1.ReminderThrottleStateSchema, {
70229
+ defaultValue: {},
70197
70230
  trackHistory: false
70198
70231
  });
70199
70232
  function createRemindersState(stateService) {
@@ -70201,12 +70234,44 @@ var require_state3 = __commonJS({
70201
70234
  prBaseline: new core_1.SessionStateAccessor(stateService, PRBaselineDescriptor),
70202
70235
  vcUnverified: new core_1.SessionStateAccessor(stateService, VCUnverifiedDescriptor),
70203
70236
  verificationTools: new core_1.SessionStateAccessor(stateService, VerificationToolsDescriptor),
70204
- upsThrottle: new core_1.SessionStateAccessor(stateService, UPSThrottleDescriptor)
70237
+ reminderThrottle: new core_1.SessionStateAccessor(stateService, ReminderThrottleDescriptor)
70205
70238
  };
70206
70239
  }
70207
70240
  }
70208
70241
  });
70209
70242
 
70243
+ // ../feature-reminders/dist/handlers/staging/throttle-utils.js
70244
+ var require_throttle_utils = __commonJS({
70245
+ "../feature-reminders/dist/handlers/staging/throttle-utils.js"(exports2) {
70246
+ "use strict";
70247
+ Object.defineProperty(exports2, "__esModule", { value: true });
70248
+ exports2.registerThrottledReminder = registerThrottledReminder;
70249
+ exports2.resetThrottleCounters = resetThrottleCounters;
70250
+ var state_js_1 = require_state3();
70251
+ async function registerThrottledReminder(ctx, sessionId, reminderId, targetHook, resolvedReminder) {
70252
+ const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
70253
+ const result = await remindersState.reminderThrottle.read(sessionId);
70254
+ const state = { ...result.data };
70255
+ const { stagedAt: _stagedAt, ...cachedReminder } = resolvedReminder;
70256
+ state[reminderId] = {
70257
+ messagesSinceLastStaging: 0,
70258
+ targetHook,
70259
+ cachedReminder
70260
+ };
70261
+ await remindersState.reminderThrottle.write(sessionId, state);
70262
+ }
70263
+ async function resetThrottleCounters(ctx, sessionId) {
70264
+ const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
70265
+ const result = await remindersState.reminderThrottle.read(sessionId);
70266
+ const state = { ...result.data };
70267
+ for (const key of Object.keys(state)) {
70268
+ state[key] = { ...state[key], messagesSinceLastStaging: 0 };
70269
+ }
70270
+ await remindersState.reminderThrottle.write(sessionId, state);
70271
+ }
70272
+ }
70273
+ });
70274
+
70210
70275
  // ../feature-reminders/dist/handlers/staging/stage-default-user-prompt.js
70211
70276
  var require_stage_default_user_prompt = __commonJS({
70212
70277
  "../feature-reminders/dist/handlers/staging/stage-default-user-prompt.js"(exports2) {
@@ -70218,6 +70283,7 @@ var require_stage_default_user_prompt = __commonJS({
70218
70283
  var types_js_1 = require_types2();
70219
70284
  var reminder_utils_js_1 = require_reminder_utils();
70220
70285
  var state_js_1 = require_state3();
70286
+ var throttle_utils_js_1 = require_throttle_utils();
70221
70287
  function registerStageDefaultUserPrompt(context) {
70222
70288
  (0, staging_handler_utils_js_1.createStagingHandler)(context, {
70223
70289
  id: "reminders:stage-default-user-prompt",
@@ -70235,23 +70301,6 @@ var require_stage_default_user_prompt = __commonJS({
70235
70301
  };
70236
70302
  }
70237
70303
  });
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
70304
  (0, staging_handler_utils_js_1.createStagingHandler)(context, {
70256
70305
  id: "reminders:stage-default-user-prompt-after-bulk",
70257
70306
  priority: 50,
@@ -70268,65 +70317,109 @@ var require_stage_default_user_prompt = __commonJS({
70268
70317
  };
70269
70318
  }
70270
70319
  });
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
70320
  if (!(0, types_1.isDaemonContext)(context))
70291
70321
  return;
70322
+ const daemonCtx = context;
70323
+ context.handlers.register({
70324
+ id: "reminders:throttle-register-ups-session-start",
70325
+ priority: 49,
70326
+ filter: { kind: "hook", hooks: ["SessionStart"] },
70327
+ handler: async (event) => {
70328
+ if (!(0, types_1.isHookEvent)(event) || !(0, types_1.isSessionStartEvent)(event))
70329
+ return;
70330
+ const sessionId = event.context.sessionId;
70331
+ if (!sessionId)
70332
+ return;
70333
+ const reminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.USER_PROMPT_SUBMIT, {
70334
+ context: { sessionId },
70335
+ assets: daemonCtx.assets
70336
+ });
70337
+ if (reminder) {
70338
+ await (0, throttle_utils_js_1.registerThrottledReminder)(daemonCtx, sessionId, types_js_1.ReminderIds.USER_PROMPT_SUBMIT, "UserPromptSubmit", reminder);
70339
+ }
70340
+ }
70341
+ });
70342
+ context.handlers.register({
70343
+ id: "reminders:throttle-reset-session-start",
70344
+ priority: 48,
70345
+ filter: { kind: "hook", hooks: ["SessionStart"] },
70346
+ handler: async (event) => {
70347
+ if (!(0, types_1.isHookEvent)(event) || !(0, types_1.isSessionStartEvent)(event))
70348
+ return;
70349
+ const sessionId = event.context.sessionId;
70350
+ if (!sessionId)
70351
+ return;
70352
+ await (0, throttle_utils_js_1.resetThrottleCounters)(daemonCtx, sessionId);
70353
+ }
70354
+ });
70292
70355
  context.handlers.register({
70293
- id: "reminders:ups-throttle-restage",
70356
+ id: "reminders:throttle-reset-bulk",
70357
+ priority: 49,
70358
+ filter: { kind: "transcript", eventTypes: ["BulkProcessingComplete"] },
70359
+ handler: async (event) => {
70360
+ if (!(0, types_1.isTranscriptEvent)(event))
70361
+ return;
70362
+ if (event.metadata.isBulkProcessing)
70363
+ return;
70364
+ const sessionId = event.context?.sessionId;
70365
+ if (!sessionId)
70366
+ return;
70367
+ await (0, throttle_utils_js_1.resetThrottleCounters)(daemonCtx, sessionId);
70368
+ }
70369
+ });
70370
+ context.handlers.register({
70371
+ id: "reminders:throttle-restage",
70294
70372
  priority: 50,
70295
70373
  filter: { kind: "transcript", eventTypes: ["UserPrompt", "AssistantMessage"] },
70296
- handler: async (event, ctx) => {
70374
+ handler: async (event) => {
70297
70375
  if (!(0, types_1.isTranscriptEvent)(event))
70298
70376
  return;
70299
- if (!(0, types_1.isDaemonContext)(ctx))
70300
- return;
70301
70377
  if (event.metadata.isBulkProcessing)
70302
70378
  return;
70303
70379
  const sessionId = event.context?.sessionId;
70304
70380
  if (!sessionId)
70305
70381
  return;
70306
- const handlerCtx = ctx;
70307
- const remindersState = (0, state_js_1.createRemindersState)(handlerCtx.stateService);
70308
- const result = await remindersState.upsThrottle.read(sessionId);
70309
- const current = result.data.messagesSinceLastStaging;
70310
- const featureConfig = handlerCtx.config.getFeature("reminders");
70382
+ const remindersState = (0, state_js_1.createRemindersState)(daemonCtx.stateService);
70383
+ const result = await remindersState.reminderThrottle.read(sessionId);
70384
+ const state = { ...result.data };
70385
+ if (Object.keys(state).length === 0)
70386
+ return;
70387
+ const featureConfig = daemonCtx.config.getFeature("reminders");
70311
70388
  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", {
70389
+ const thresholds = config.reminder_thresholds ?? {};
70390
+ let changed = false;
70391
+ for (const [reminderId, entry] of Object.entries(state)) {
70392
+ const typedEntry = entry;
70393
+ const threshold = thresholds[reminderId];
70394
+ if (threshold === void 0)
70395
+ continue;
70396
+ const newCount = typedEntry.messagesSinceLastStaging + 1;
70397
+ if (newCount >= threshold) {
70398
+ const metrics = event.metadata.metrics;
70399
+ const stagedAt = {
70400
+ timestamp: Date.now(),
70401
+ turnCount: metrics.turnCount,
70402
+ toolsThisTurn: metrics.toolsThisTurn,
70403
+ toolCount: metrics.toolCount
70404
+ };
70405
+ await (0, reminder_utils_js_1.stageReminder)(daemonCtx, typedEntry.targetHook, {
70406
+ ...typedEntry.cachedReminder,
70407
+ stagedAt
70408
+ });
70409
+ state[reminderId] = { ...typedEntry, messagesSinceLastStaging: 0 };
70410
+ daemonCtx.logger.debug("Throttle: re-staged reminder", {
70322
70411
  sessionId,
70412
+ reminderId,
70323
70413
  messageCount: newCount,
70324
70414
  threshold
70325
70415
  });
70416
+ } else {
70417
+ state[reminderId] = { ...typedEntry, messagesSinceLastStaging: newCount };
70326
70418
  }
70327
- await remindersState.upsThrottle.write(sessionId, { messagesSinceLastStaging: 0 });
70328
- } else {
70329
- await remindersState.upsThrottle.write(sessionId, { messagesSinceLastStaging: newCount });
70419
+ changed = true;
70420
+ }
70421
+ if (changed) {
70422
+ await remindersState.reminderThrottle.write(sessionId, state);
70330
70423
  }
70331
70424
  }
70332
70425
  });
@@ -72029,27 +72122,33 @@ var require_track_verification_tools = __commonJS({
72029
72122
  continue;
72030
72123
  const current = toolsState[toolName];
72031
72124
  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
- };
72125
+ const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames);
72126
+ if (staged) {
72127
+ if (!current) {
72128
+ toolsState[toolName] = {
72129
+ status: "staged",
72130
+ editsSinceVerified: 0,
72131
+ lastVerifiedAt: null,
72132
+ lastStagedAt: Date.now()
72133
+ };
72134
+ }
72135
+ stagedNames.add(reminderId);
72136
+ anyStaged = true;
72039
72137
  }
72040
- await stageToolReminderIfNeeded(daemonCtx, reminderId, stagedNames);
72041
- anyStaged = true;
72042
72138
  } else {
72043
72139
  const newEdits = current.editsSinceVerified + 1;
72044
72140
  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;
72141
+ const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames);
72142
+ if (staged) {
72143
+ toolsState[toolName] = {
72144
+ ...current,
72145
+ status: "staged",
72146
+ editsSinceVerified: 0,
72147
+ lastStagedAt: Date.now()
72148
+ };
72149
+ stagedNames.add(reminderId);
72150
+ anyStaged = true;
72151
+ }
72053
72152
  } else {
72054
72153
  toolsState[toolName] = {
72055
72154
  ...current,
@@ -72061,7 +72160,10 @@ var require_track_verification_tools = __commonJS({
72061
72160
  }
72062
72161
  }
72063
72162
  if (anyStaged) {
72064
- await stageToolReminderIfNeeded(daemonCtx, types_js_1.ReminderIds.VERIFY_COMPLETION, stagedNames);
72163
+ const wrapperStaged = await ensureToolReminderStaged(daemonCtx, types_js_1.ReminderIds.VERIFY_COMPLETION, stagedNames);
72164
+ if (!wrapperStaged) {
72165
+ daemonCtx.logger.warn("Failed to stage verify-completion wrapper reminder", { sessionId });
72166
+ }
72065
72167
  }
72066
72168
  await remindersState.verificationTools.write(sessionId, toolsState);
72067
72169
  return anyStaged;
@@ -72117,21 +72219,22 @@ var require_track_verification_tools = __commonJS({
72117
72219
  await remindersState.verificationTools.write(sessionId, toolsState);
72118
72220
  }
72119
72221
  }
72120
- async function stageToolReminderIfNeeded(daemonCtx, reminderId, stagedNames) {
72222
+ async function ensureToolReminderStaged(daemonCtx, reminderId, stagedNames) {
72121
72223
  if (stagedNames.has(reminderId))
72122
- return;
72224
+ return true;
72123
72225
  const reminder = (0, reminder_utils_js_1.resolveReminder)(reminderId, {
72124
72226
  context: {},
72125
72227
  assets: daemonCtx.assets
72126
72228
  });
72127
72229
  if (!reminder) {
72128
72230
  daemonCtx.logger.warn("Failed to resolve VC tool reminder", { reminderId });
72129
- return;
72231
+ return false;
72130
72232
  }
72131
72233
  await (0, reminder_utils_js_1.stageReminder)(daemonCtx, "Stop", {
72132
72234
  ...reminder,
72133
72235
  stagedAt: { timestamp: Date.now(), turnCount: 0, toolsThisTurn: 0, toolCount: 0 }
72134
72236
  });
72237
+ return true;
72135
72238
  }
72136
72239
  }
72137
72240
  });
@@ -72386,6 +72489,7 @@ var require_stage_persona_reminders = __commonJS({
72386
72489
  var types_1 = require_dist();
72387
72490
  var reminder_utils_js_1 = require_reminder_utils();
72388
72491
  var types_js_1 = require_types2();
72492
+ var throttle_utils_js_1 = require_throttle_utils();
72389
72493
  async function restagePersonaRemindersForActiveSessions(ctxFactory, sessionIds, logger) {
72390
72494
  logger.info("Re-staging persona reminders for active sessions", { count: sessionIds.length });
72391
72495
  for (const sessionId of sessionIds) {
@@ -72468,6 +72572,9 @@ var require_stage_persona_reminders = __commonJS({
72468
72572
  if (reminder) {
72469
72573
  for (const targetHook of PERSONA_REMINDER_HOOKS) {
72470
72574
  await (0, reminder_utils_js_1.stageReminder)(ctx, targetHook, reminder);
72575
+ if (targetHook === "UserPromptSubmit") {
72576
+ await (0, throttle_utils_js_1.registerThrottledReminder)(ctx, sessionId, types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, "UserPromptSubmit", reminder);
72577
+ }
72471
72578
  }
72472
72579
  } else {
72473
72580
  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.6",
4
4
  "description": "AI pair programming assistant with personas, session tracking, and contextual nudges",
5
5
  "bin": {
6
6
  "sidekick": "dist/bin.js"