@scotthamilton77/sidekick 0.1.30 → 0.1.31

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 +37 -97
  2. package/dist/daemon.js +45 -185
  3. package/package.json +1 -1
package/dist/bin.js CHANGED
@@ -47579,7 +47579,7 @@ var require_build_identity = __commonJS({
47579
47579
  var path_1 = __importDefault2(require("path"));
47580
47580
  var DEV_PREFIX = "dev:";
47581
47581
  var NO_DIST_SENTINEL = "nodist";
47582
- function computeBuildIdentity(injectedVersion = true ? "0.1.30" : void 0, devFingerprint = computeDevFingerprint) {
47582
+ function computeBuildIdentity(injectedVersion = true ? "0.1.31" : void 0, devFingerprint = computeDevFingerprint) {
47583
47583
  return injectedVersion !== void 0 ? injectedVersion : DEV_PREFIX + devFingerprint();
47584
47584
  }
47585
47585
  function computeDevFingerprint() {
@@ -61989,7 +61989,7 @@ var require_transcript_metrics_engine = __commonJS({
61989
61989
  exports2.isExcludedBuiltinCommandInvocation = isExcludedBuiltinCommandInvocation;
61990
61990
  exports2.updateToolsPerTurn = updateToolsPerTurn;
61991
61991
  var transcript_helpers_js_1 = require_transcript_helpers();
61992
- async function processEntry(entry, lineNumber, metrics, toolUseIdToName, emitEvent) {
61992
+ async function processEntry(entry, lineNumber, metrics, toolUseIdToName, emitEvent, signalCompaction) {
61993
61993
  const entryType = entry.type;
61994
61994
  switch (entryType) {
61995
61995
  case "user": {
@@ -62018,8 +62018,13 @@ var require_transcript_metrics_engine = __commonJS({
62018
62018
  await emitEvent("AssistantMessage", entry, lineNumber);
62019
62019
  await processNestedToolUses(entry, lineNumber, metrics, toolUseIdToName, emitEvent);
62020
62020
  break;
62021
- case "system":
62021
+ case "system": {
62022
+ const subtype = entry.subtype;
62023
+ if (subtype === "compact_boundary") {
62024
+ await signalCompaction?.(lineNumber);
62025
+ }
62022
62026
  break;
62027
+ }
62023
62028
  }
62024
62029
  }
62025
62030
  function extractTokenUsage(entry, metrics) {
@@ -64477,10 +64482,12 @@ var require_transcript_service = __commonJS({
64477
64482
  // ============================================================================
64478
64483
  // Compaction Management
64479
64484
  // ============================================================================
64480
- async signalCompaction() {
64485
+ async signalCompaction(lineNumber) {
64486
+ if (this.metrics.isPostCompactIndeterminate)
64487
+ return;
64481
64488
  this.metrics.currentContextTokens = null;
64482
64489
  this.metrics.isPostCompactIndeterminate = true;
64483
- await this.emitEvent("Compact", {}, this.metrics.lastProcessedLine);
64490
+ await this.emitEvent("Compact", {}, lineNumber ?? this.metrics.lastProcessedLine);
64484
64491
  this.notifyMetricsChange();
64485
64492
  this.schedulePersistence();
64486
64493
  }
@@ -64538,7 +64545,7 @@ var require_transcript_service = __commonJS({
64538
64545
  return;
64539
64546
  const self = this;
64540
64547
  await (0, transcript_file_watcher_js_1.processTranscriptFile)(this.transcriptPath, this.streamingState, this.metrics, async (entry, lineNumber) => {
64541
- await (0, transcript_metrics_engine_js_1.processEntry)(entry, lineNumber, this.metrics, this.toolUseIdToName, (eventType, e, ln) => this.emitEvent(eventType, e, ln));
64548
+ await (0, transcript_metrics_engine_js_1.processEntry)(entry, lineNumber, this.metrics, this.toolUseIdToName, (eventType, e, ln) => this.emitEvent(eventType, e, ln), (ln) => this.signalCompaction(ln));
64542
64549
  }, async (lineNumber, _durationMs) => {
64543
64550
  await this.emitEvent("BulkProcessingComplete", {}, lineNumber);
64544
64551
  }, this.options.logger, this.sessionId, {
@@ -78154,28 +78161,6 @@ var require_dist5 = __commonJS({
78154
78161
  }
78155
78162
  });
78156
78163
 
78157
- // ../feature-reminders/dist/handlers/consumption/session-type-gate.js
78158
- var require_session_type_gate = __commonJS({
78159
- "../feature-reminders/dist/handlers/consumption/session-type-gate.js"(exports2) {
78160
- "use strict";
78161
- Object.defineProperty(exports2, "__esModule", { value: true });
78162
- exports2.suppressReminderForSessionType = suppressReminderForSessionType;
78163
- var types_js_1 = require_types2();
78164
- var PERSONA_REMINDERS = /* @__PURE__ */ new Set([types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, types_js_1.ReminderIds.PERSONA_CHANGED]);
78165
- function suppressReminderForSessionType(reminderName, sessionType, config) {
78166
- if (sessionType !== "non-interactive")
78167
- return false;
78168
- if (PERSONA_REMINDERS.has(reminderName)) {
78169
- return config.injectPersonaIntoNonInteractiveSessions !== true;
78170
- }
78171
- if (reminderName === types_js_1.ReminderIds.CAVEMAN_MODE) {
78172
- return config.injectCavemanIntoNonInteractiveSessions !== true;
78173
- }
78174
- return false;
78175
- }
78176
- }
78177
- });
78178
-
78179
78164
  // ../feature-reminders/dist/handlers/staging/stage-persona-reminders.js
78180
78165
  var require_stage_persona_reminders = __commonJS({
78181
78166
  "../feature-reminders/dist/handlers/staging/stage-persona-reminders.js"(exports2) {
@@ -78183,7 +78168,6 @@ var require_stage_persona_reminders = __commonJS({
78183
78168
  Object.defineProperty(exports2, "__esModule", { value: true });
78184
78169
  exports2.restagePersonaRemindersForActiveSessions = restagePersonaRemindersForActiveSessions;
78185
78170
  exports2.stagePersonaRemindersForSession = stagePersonaRemindersForSession;
78186
- exports2.resolvePersonaContextForSnapshot = resolvePersonaContextForSnapshot;
78187
78171
  exports2.registerStagePersonaReminders = registerStagePersonaReminders;
78188
78172
  var core_1 = require_dist4();
78189
78173
  var feature_session_summary_1 = require_dist5();
@@ -78191,7 +78175,6 @@ var require_stage_persona_reminders = __commonJS({
78191
78175
  var types_1 = require_dist();
78192
78176
  var reminder_utils_js_1 = require_reminder_utils();
78193
78177
  var types_js_1 = require_types2();
78194
- var session_type_gate_js_1 = require_session_type_gate();
78195
78178
  var throttle_utils_js_1 = require_throttle_utils();
78196
78179
  async function restagePersonaRemindersForActiveSessions(ctxFactory, sessionIds, logger) {
78197
78180
  logger.info("Re-staging persona reminders for active sessions", { count: sessionIds.length });
@@ -78404,24 +78387,6 @@ var require_stage_persona_reminders = __commonJS({
78404
78387
  includeChanged: options?.includeChangedReminder ?? false
78405
78388
  });
78406
78389
  }
78407
- async function resolvePersonaContextForSnapshot(ctx, sessionId) {
78408
- if (!isPersonaInjectionEnabled(ctx))
78409
- return void 0;
78410
- const personaConfig = ctx.config.getFeature("session-summary").settings?.personas ?? {};
78411
- if ((0, session_type_gate_js_1.suppressReminderForSessionType)(types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, ctx.sessionType, personaConfig)) {
78412
- return void 0;
78413
- }
78414
- const persona = await loadPersonaForSession(ctx, sessionId);
78415
- if (!persona)
78416
- return void 0;
78417
- const templateContext = buildPersonaTemplateContext(persona);
78418
- const reminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, {
78419
- context: templateContext,
78420
- assets: ctx.assets,
78421
- logger: ctx.logger
78422
- });
78423
- return reminder?.additionalContext ?? void 0;
78424
- }
78425
78390
  function registerStagePersonaReminders(context) {
78426
78391
  if (!(0, types_1.isDaemonContext)(context))
78427
78392
  return;
@@ -78450,7 +78415,6 @@ var require_stage_user_profile_reminders = __commonJS({
78450
78415
  "use strict";
78451
78416
  Object.defineProperty(exports2, "__esModule", { value: true });
78452
78417
  exports2.stageUserProfileRemindersForSession = stageUserProfileRemindersForSession;
78453
- exports2.resolveUserProfileContextForSnapshot = resolveUserProfileContextForSnapshot;
78454
78418
  exports2.registerStageUserProfileReminders = registerStageUserProfileReminders;
78455
78419
  var core_1 = require_dist4();
78456
78420
  var events_js_1 = require_events2();
@@ -78490,21 +78454,6 @@ var require_stage_user_profile_reminders = __commonJS({
78490
78454
  ctx.logger.warn("Failed to resolve user-profile reminder", { sessionId });
78491
78455
  }
78492
78456
  }
78493
- function resolveUserProfileContextForSnapshot(ctx) {
78494
- const profile = (0, core_1.loadUserProfile)({ logger: ctx.logger });
78495
- if (!profile)
78496
- return void 0;
78497
- const templateContext = {
78498
- user_name: profile.name,
78499
- user_role: profile.role,
78500
- user_interests: profile.interests.join(", ")
78501
- };
78502
- const reminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.USER_PROFILE, {
78503
- context: templateContext,
78504
- assets: ctx.assets
78505
- });
78506
- return reminder?.additionalContext ?? void 0;
78507
- }
78508
78457
  function registerStageUserProfileReminders(context) {
78509
78458
  if (!(0, types_1.isDaemonContext)(context))
78510
78459
  return;
@@ -78796,6 +78745,28 @@ var require_cli_staging_reader = __commonJS({
78796
78745
  }
78797
78746
  });
78798
78747
 
78748
+ // ../feature-reminders/dist/handlers/consumption/session-type-gate.js
78749
+ var require_session_type_gate = __commonJS({
78750
+ "../feature-reminders/dist/handlers/consumption/session-type-gate.js"(exports2) {
78751
+ "use strict";
78752
+ Object.defineProperty(exports2, "__esModule", { value: true });
78753
+ exports2.suppressReminderForSessionType = suppressReminderForSessionType;
78754
+ var types_js_1 = require_types2();
78755
+ var PERSONA_REMINDERS = /* @__PURE__ */ new Set([types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, types_js_1.ReminderIds.PERSONA_CHANGED]);
78756
+ function suppressReminderForSessionType(reminderName, sessionType, config) {
78757
+ if (sessionType !== "non-interactive")
78758
+ return false;
78759
+ if (PERSONA_REMINDERS.has(reminderName)) {
78760
+ return config.injectPersonaIntoNonInteractiveSessions !== true;
78761
+ }
78762
+ if (reminderName === types_js_1.ReminderIds.CAVEMAN_MODE) {
78763
+ return config.injectCavemanIntoNonInteractiveSessions !== true;
78764
+ }
78765
+ return false;
78766
+ }
78767
+ }
78768
+ });
78769
+
78799
78770
  // ../feature-reminders/dist/handlers/consumption/consumption-handler-factory.js
78800
78771
  var require_consumption_handler_factory = __commonJS({
78801
78772
  "../feature-reminders/dist/handlers/consumption/consumption-handler-factory.js"(exports2) {
@@ -79108,22 +79079,6 @@ var require_inject_session_start = __commonJS({
79108
79079
  }
79109
79080
  });
79110
79081
 
79111
- // ../feature-reminders/dist/handlers/consumption/inject-post-compact.js
79112
- var require_inject_post_compact = __commonJS({
79113
- "../feature-reminders/dist/handlers/consumption/inject-post-compact.js"(exports2) {
79114
- "use strict";
79115
- Object.defineProperty(exports2, "__esModule", { value: true });
79116
- exports2.registerInjectPostCompact = registerInjectPostCompact;
79117
- var consumption_handler_factory_js_1 = require_consumption_handler_factory();
79118
- function registerInjectPostCompact(context) {
79119
- (0, consumption_handler_factory_js_1.createConsumptionHandler)(context, {
79120
- id: "reminders:inject-post-compact",
79121
- hook: "PostCompact"
79122
- });
79123
- }
79124
- }
79125
- });
79126
-
79127
79082
  // ../feature-reminders/dist/handlers/consumption/index.js
79128
79083
  var require_consumption = __commonJS({
79129
79084
  "../feature-reminders/dist/handlers/consumption/index.js"(exports2) {
@@ -79135,14 +79090,12 @@ var require_consumption = __commonJS({
79135
79090
  var inject_post_tool_use_1 = require_inject_post_tool_use();
79136
79091
  var inject_stop_1 = require_inject_stop();
79137
79092
  var inject_session_start_1 = require_inject_session_start();
79138
- var inject_post_compact_js_1 = require_inject_post_compact();
79139
79093
  function registerConsumptionHandlers(context) {
79140
79094
  (0, inject_user_prompt_submit_1.registerInjectUserPromptSubmit)(context);
79141
79095
  (0, inject_pre_tool_use_1.registerInjectPreToolUse)(context);
79142
79096
  (0, inject_post_tool_use_1.registerInjectPostToolUse)(context);
79143
79097
  (0, inject_stop_1.registerInjectStop)(context);
79144
79098
  (0, inject_session_start_1.registerInjectSessionStart)(context);
79145
- (0, inject_post_compact_js_1.registerInjectPostCompact)(context);
79146
79099
  }
79147
79100
  }
79148
79101
  });
@@ -79587,7 +79540,7 @@ var require_dist6 = __commonJS({
79587
79540
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
79588
79541
  };
79589
79542
  Object.defineProperty(exports2, "__esModule", { value: true });
79590
- exports2.createRemindersState = exports2.ReminderOrchestrator = exports2.ReminderEvents = exports2.handleVCUnverifiedClear = exports2.handleVCUnverifiedSet = exports2.handleReminderConsumed = exports2.classifyCompletion = exports2.resolveUserProfileContextForSnapshot = exports2.resolvePersonaContextForSnapshot = exports2.restagePersonaRemindersForActiveSessions = exports2.stagePersonaRemindersForSession = exports2.registerStagingHandlers = exports2.registerConsumptionHandlers = exports2.manifest = void 0;
79543
+ exports2.createRemindersState = exports2.ReminderOrchestrator = exports2.ReminderEvents = exports2.handleVCUnverifiedClear = exports2.handleVCUnverifiedSet = exports2.handleReminderConsumed = exports2.classifyCompletion = exports2.restagePersonaRemindersForActiveSessions = exports2.stagePersonaRemindersForSession = exports2.registerStagingHandlers = exports2.registerConsumptionHandlers = exports2.manifest = void 0;
79591
79544
  exports2.register = register;
79592
79545
  var staging_1 = require_staging2();
79593
79546
  var consumption_1 = require_consumption();
@@ -79621,13 +79574,6 @@ var require_dist6 = __commonJS({
79621
79574
  Object.defineProperty(exports2, "restagePersonaRemindersForActiveSessions", { enumerable: true, get: function() {
79622
79575
  return stage_persona_reminders_1.restagePersonaRemindersForActiveSessions;
79623
79576
  } });
79624
- Object.defineProperty(exports2, "resolvePersonaContextForSnapshot", { enumerable: true, get: function() {
79625
- return stage_persona_reminders_1.resolvePersonaContextForSnapshot;
79626
- } });
79627
- var stage_user_profile_reminders_1 = require_stage_user_profile_reminders();
79628
- Object.defineProperty(exports2, "resolveUserProfileContextForSnapshot", { enumerable: true, get: function() {
79629
- return stage_user_profile_reminders_1.resolveUserProfileContextForSnapshot;
79630
- } });
79631
79577
  var completion_classifier_1 = require_completion_classifier();
79632
79578
  Object.defineProperty(exports2, "classifyCompletion", { enumerable: true, get: function() {
79633
79579
  return completion_classifier_1.classifyCompletion;
@@ -80179,12 +80125,6 @@ var require_hook_command = __commonJS({
80179
80125
  }
80180
80126
  function translatePostCompact(internal) {
80181
80127
  const response = {};
80182
- if (internal.additionalContext) {
80183
- response.hookSpecificOutput = {
80184
- hookEventName: "PostCompact",
80185
- additionalContext: internal.additionalContext
80186
- };
80187
- }
80188
80128
  addUserMessage(response, internal.userMessage);
80189
80129
  return response;
80190
80130
  }
@@ -87568,7 +87508,7 @@ var require_cli = __commonJS({
87568
87508
  var promises_12 = require("node:fs/promises");
87569
87509
  var node_stream_1 = require("node:stream");
87570
87510
  var yargs_parser_1 = __importDefault2(require_build());
87571
- var VERSION = true ? "0.1.30" : "dev";
87511
+ var VERSION = true ? "0.1.31" : "dev";
87572
87512
  var SANDBOX_ERROR_MESSAGE = `Error: Daemon commands cannot run in sandbox mode.
87573
87513
 
87574
87514
  Claude Code's sandbox blocks Unix socket operations required for daemon IPC.
package/dist/daemon.js CHANGED
@@ -46603,7 +46603,7 @@ var require_build_identity = __commonJS({
46603
46603
  var path_1 = __importDefault(require("path"));
46604
46604
  var DEV_PREFIX = "dev:";
46605
46605
  var NO_DIST_SENTINEL = "nodist";
46606
- function computeBuildIdentity(injectedVersion = true ? "0.1.30" : void 0, devFingerprint = computeDevFingerprint) {
46606
+ function computeBuildIdentity(injectedVersion = true ? "0.1.31" : void 0, devFingerprint = computeDevFingerprint) {
46607
46607
  return injectedVersion !== void 0 ? injectedVersion : DEV_PREFIX + devFingerprint();
46608
46608
  }
46609
46609
  function computeDevFingerprint() {
@@ -61013,7 +61013,7 @@ var require_transcript_metrics_engine = __commonJS({
61013
61013
  exports2.isExcludedBuiltinCommandInvocation = isExcludedBuiltinCommandInvocation;
61014
61014
  exports2.updateToolsPerTurn = updateToolsPerTurn;
61015
61015
  var transcript_helpers_js_1 = require_transcript_helpers();
61016
- async function processEntry(entry, lineNumber, metrics, toolUseIdToName, emitEvent) {
61016
+ async function processEntry(entry, lineNumber, metrics, toolUseIdToName, emitEvent, signalCompaction) {
61017
61017
  const entryType = entry.type;
61018
61018
  switch (entryType) {
61019
61019
  case "user": {
@@ -61042,8 +61042,13 @@ var require_transcript_metrics_engine = __commonJS({
61042
61042
  await emitEvent("AssistantMessage", entry, lineNumber);
61043
61043
  await processNestedToolUses(entry, lineNumber, metrics, toolUseIdToName, emitEvent);
61044
61044
  break;
61045
- case "system":
61045
+ case "system": {
61046
+ const subtype = entry.subtype;
61047
+ if (subtype === "compact_boundary") {
61048
+ await signalCompaction?.(lineNumber);
61049
+ }
61046
61050
  break;
61051
+ }
61047
61052
  }
61048
61053
  }
61049
61054
  function extractTokenUsage(entry, metrics) {
@@ -63501,10 +63506,12 @@ var require_transcript_service = __commonJS({
63501
63506
  // ============================================================================
63502
63507
  // Compaction Management
63503
63508
  // ============================================================================
63504
- async signalCompaction() {
63509
+ async signalCompaction(lineNumber) {
63510
+ if (this.metrics.isPostCompactIndeterminate)
63511
+ return;
63505
63512
  this.metrics.currentContextTokens = null;
63506
63513
  this.metrics.isPostCompactIndeterminate = true;
63507
- await this.emitEvent("Compact", {}, this.metrics.lastProcessedLine);
63514
+ await this.emitEvent("Compact", {}, lineNumber ?? this.metrics.lastProcessedLine);
63508
63515
  this.notifyMetricsChange();
63509
63516
  this.schedulePersistence();
63510
63517
  }
@@ -63562,7 +63569,7 @@ var require_transcript_service = __commonJS({
63562
63569
  return;
63563
63570
  const self = this;
63564
63571
  await (0, transcript_file_watcher_js_1.processTranscriptFile)(this.transcriptPath, this.streamingState, this.metrics, async (entry, lineNumber) => {
63565
- await (0, transcript_metrics_engine_js_1.processEntry)(entry, lineNumber, this.metrics, this.toolUseIdToName, (eventType, e, ln) => this.emitEvent(eventType, e, ln));
63572
+ await (0, transcript_metrics_engine_js_1.processEntry)(entry, lineNumber, this.metrics, this.toolUseIdToName, (eventType, e, ln) => this.emitEvent(eventType, e, ln), (ln) => this.signalCompaction(ln));
63566
63573
  }, async (lineNumber, _durationMs) => {
63567
63574
  await this.emitEvent("BulkProcessingComplete", {}, lineNumber);
63568
63575
  }, this.options.logger, this.sessionId, {
@@ -76918,28 +76925,6 @@ var require_dist5 = __commonJS({
76918
76925
  }
76919
76926
  });
76920
76927
 
76921
- // ../feature-reminders/dist/handlers/consumption/session-type-gate.js
76922
- var require_session_type_gate = __commonJS({
76923
- "../feature-reminders/dist/handlers/consumption/session-type-gate.js"(exports2) {
76924
- "use strict";
76925
- Object.defineProperty(exports2, "__esModule", { value: true });
76926
- exports2.suppressReminderForSessionType = suppressReminderForSessionType;
76927
- var types_js_1 = require_types2();
76928
- var PERSONA_REMINDERS = /* @__PURE__ */ new Set([types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, types_js_1.ReminderIds.PERSONA_CHANGED]);
76929
- function suppressReminderForSessionType(reminderName, sessionType, config) {
76930
- if (sessionType !== "non-interactive")
76931
- return false;
76932
- if (PERSONA_REMINDERS.has(reminderName)) {
76933
- return config.injectPersonaIntoNonInteractiveSessions !== true;
76934
- }
76935
- if (reminderName === types_js_1.ReminderIds.CAVEMAN_MODE) {
76936
- return config.injectCavemanIntoNonInteractiveSessions !== true;
76937
- }
76938
- return false;
76939
- }
76940
- }
76941
- });
76942
-
76943
76928
  // ../feature-reminders/dist/handlers/staging/stage-persona-reminders.js
76944
76929
  var require_stage_persona_reminders = __commonJS({
76945
76930
  "../feature-reminders/dist/handlers/staging/stage-persona-reminders.js"(exports2) {
@@ -76947,7 +76932,6 @@ var require_stage_persona_reminders = __commonJS({
76947
76932
  Object.defineProperty(exports2, "__esModule", { value: true });
76948
76933
  exports2.restagePersonaRemindersForActiveSessions = restagePersonaRemindersForActiveSessions;
76949
76934
  exports2.stagePersonaRemindersForSession = stagePersonaRemindersForSession;
76950
- exports2.resolvePersonaContextForSnapshot = resolvePersonaContextForSnapshot;
76951
76935
  exports2.registerStagePersonaReminders = registerStagePersonaReminders;
76952
76936
  var core_1 = require_dist4();
76953
76937
  var feature_session_summary_1 = require_dist5();
@@ -76955,7 +76939,6 @@ var require_stage_persona_reminders = __commonJS({
76955
76939
  var types_1 = require_dist();
76956
76940
  var reminder_utils_js_1 = require_reminder_utils();
76957
76941
  var types_js_1 = require_types2();
76958
- var session_type_gate_js_1 = require_session_type_gate();
76959
76942
  var throttle_utils_js_1 = require_throttle_utils();
76960
76943
  async function restagePersonaRemindersForActiveSessions(ctxFactory, sessionIds, logger) {
76961
76944
  logger.info("Re-staging persona reminders for active sessions", { count: sessionIds.length });
@@ -77168,24 +77151,6 @@ var require_stage_persona_reminders = __commonJS({
77168
77151
  includeChanged: options?.includeChangedReminder ?? false
77169
77152
  });
77170
77153
  }
77171
- async function resolvePersonaContextForSnapshot(ctx, sessionId) {
77172
- if (!isPersonaInjectionEnabled(ctx))
77173
- return void 0;
77174
- const personaConfig = ctx.config.getFeature("session-summary").settings?.personas ?? {};
77175
- if ((0, session_type_gate_js_1.suppressReminderForSessionType)(types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, ctx.sessionType, personaConfig)) {
77176
- return void 0;
77177
- }
77178
- const persona = await loadPersonaForSession(ctx, sessionId);
77179
- if (!persona)
77180
- return void 0;
77181
- const templateContext = buildPersonaTemplateContext(persona);
77182
- const reminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, {
77183
- context: templateContext,
77184
- assets: ctx.assets,
77185
- logger: ctx.logger
77186
- });
77187
- return reminder?.additionalContext ?? void 0;
77188
- }
77189
77154
  function registerStagePersonaReminders(context) {
77190
77155
  if (!(0, types_1.isDaemonContext)(context))
77191
77156
  return;
@@ -77214,7 +77179,6 @@ var require_stage_user_profile_reminders = __commonJS({
77214
77179
  "use strict";
77215
77180
  Object.defineProperty(exports2, "__esModule", { value: true });
77216
77181
  exports2.stageUserProfileRemindersForSession = stageUserProfileRemindersForSession;
77217
- exports2.resolveUserProfileContextForSnapshot = resolveUserProfileContextForSnapshot;
77218
77182
  exports2.registerStageUserProfileReminders = registerStageUserProfileReminders;
77219
77183
  var core_1 = require_dist4();
77220
77184
  var events_js_1 = require_events2();
@@ -77254,21 +77218,6 @@ var require_stage_user_profile_reminders = __commonJS({
77254
77218
  ctx.logger.warn("Failed to resolve user-profile reminder", { sessionId });
77255
77219
  }
77256
77220
  }
77257
- function resolveUserProfileContextForSnapshot(ctx) {
77258
- const profile = (0, core_1.loadUserProfile)({ logger: ctx.logger });
77259
- if (!profile)
77260
- return void 0;
77261
- const templateContext = {
77262
- user_name: profile.name,
77263
- user_role: profile.role,
77264
- user_interests: profile.interests.join(", ")
77265
- };
77266
- const reminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.USER_PROFILE, {
77267
- context: templateContext,
77268
- assets: ctx.assets
77269
- });
77270
- return reminder?.additionalContext ?? void 0;
77271
- }
77272
77221
  function registerStageUserProfileReminders(context) {
77273
77222
  if (!(0, types_1.isDaemonContext)(context))
77274
77223
  return;
@@ -77560,6 +77509,28 @@ var require_cli_staging_reader = __commonJS({
77560
77509
  }
77561
77510
  });
77562
77511
 
77512
+ // ../feature-reminders/dist/handlers/consumption/session-type-gate.js
77513
+ var require_session_type_gate = __commonJS({
77514
+ "../feature-reminders/dist/handlers/consumption/session-type-gate.js"(exports2) {
77515
+ "use strict";
77516
+ Object.defineProperty(exports2, "__esModule", { value: true });
77517
+ exports2.suppressReminderForSessionType = suppressReminderForSessionType;
77518
+ var types_js_1 = require_types2();
77519
+ var PERSONA_REMINDERS = /* @__PURE__ */ new Set([types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA, types_js_1.ReminderIds.PERSONA_CHANGED]);
77520
+ function suppressReminderForSessionType(reminderName, sessionType, config) {
77521
+ if (sessionType !== "non-interactive")
77522
+ return false;
77523
+ if (PERSONA_REMINDERS.has(reminderName)) {
77524
+ return config.injectPersonaIntoNonInteractiveSessions !== true;
77525
+ }
77526
+ if (reminderName === types_js_1.ReminderIds.CAVEMAN_MODE) {
77527
+ return config.injectCavemanIntoNonInteractiveSessions !== true;
77528
+ }
77529
+ return false;
77530
+ }
77531
+ }
77532
+ });
77533
+
77563
77534
  // ../feature-reminders/dist/handlers/consumption/consumption-handler-factory.js
77564
77535
  var require_consumption_handler_factory = __commonJS({
77565
77536
  "../feature-reminders/dist/handlers/consumption/consumption-handler-factory.js"(exports2) {
@@ -77872,22 +77843,6 @@ var require_inject_session_start = __commonJS({
77872
77843
  }
77873
77844
  });
77874
77845
 
77875
- // ../feature-reminders/dist/handlers/consumption/inject-post-compact.js
77876
- var require_inject_post_compact = __commonJS({
77877
- "../feature-reminders/dist/handlers/consumption/inject-post-compact.js"(exports2) {
77878
- "use strict";
77879
- Object.defineProperty(exports2, "__esModule", { value: true });
77880
- exports2.registerInjectPostCompact = registerInjectPostCompact;
77881
- var consumption_handler_factory_js_1 = require_consumption_handler_factory();
77882
- function registerInjectPostCompact(context) {
77883
- (0, consumption_handler_factory_js_1.createConsumptionHandler)(context, {
77884
- id: "reminders:inject-post-compact",
77885
- hook: "PostCompact"
77886
- });
77887
- }
77888
- }
77889
- });
77890
-
77891
77846
  // ../feature-reminders/dist/handlers/consumption/index.js
77892
77847
  var require_consumption = __commonJS({
77893
77848
  "../feature-reminders/dist/handlers/consumption/index.js"(exports2) {
@@ -77899,14 +77854,12 @@ var require_consumption = __commonJS({
77899
77854
  var inject_post_tool_use_1 = require_inject_post_tool_use();
77900
77855
  var inject_stop_1 = require_inject_stop();
77901
77856
  var inject_session_start_1 = require_inject_session_start();
77902
- var inject_post_compact_js_1 = require_inject_post_compact();
77903
77857
  function registerConsumptionHandlers(context) {
77904
77858
  (0, inject_user_prompt_submit_1.registerInjectUserPromptSubmit)(context);
77905
77859
  (0, inject_pre_tool_use_1.registerInjectPreToolUse)(context);
77906
77860
  (0, inject_post_tool_use_1.registerInjectPostToolUse)(context);
77907
77861
  (0, inject_stop_1.registerInjectStop)(context);
77908
77862
  (0, inject_session_start_1.registerInjectSessionStart)(context);
77909
- (0, inject_post_compact_js_1.registerInjectPostCompact)(context);
77910
77863
  }
77911
77864
  }
77912
77865
  });
@@ -78351,7 +78304,7 @@ var require_dist6 = __commonJS({
78351
78304
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
78352
78305
  };
78353
78306
  Object.defineProperty(exports2, "__esModule", { value: true });
78354
- exports2.createRemindersState = exports2.ReminderOrchestrator = exports2.ReminderEvents = exports2.handleVCUnverifiedClear = exports2.handleVCUnverifiedSet = exports2.handleReminderConsumed = exports2.classifyCompletion = exports2.resolveUserProfileContextForSnapshot = exports2.resolvePersonaContextForSnapshot = exports2.restagePersonaRemindersForActiveSessions = exports2.stagePersonaRemindersForSession = exports2.registerStagingHandlers = exports2.registerConsumptionHandlers = exports2.manifest = void 0;
78307
+ exports2.createRemindersState = exports2.ReminderOrchestrator = exports2.ReminderEvents = exports2.handleVCUnverifiedClear = exports2.handleVCUnverifiedSet = exports2.handleReminderConsumed = exports2.classifyCompletion = exports2.restagePersonaRemindersForActiveSessions = exports2.stagePersonaRemindersForSession = exports2.registerStagingHandlers = exports2.registerConsumptionHandlers = exports2.manifest = void 0;
78355
78308
  exports2.register = register;
78356
78309
  var staging_1 = require_staging2();
78357
78310
  var consumption_1 = require_consumption();
@@ -78385,13 +78338,6 @@ var require_dist6 = __commonJS({
78385
78338
  Object.defineProperty(exports2, "restagePersonaRemindersForActiveSessions", { enumerable: true, get: function() {
78386
78339
  return stage_persona_reminders_1.restagePersonaRemindersForActiveSessions;
78387
78340
  } });
78388
- Object.defineProperty(exports2, "resolvePersonaContextForSnapshot", { enumerable: true, get: function() {
78389
- return stage_persona_reminders_1.resolvePersonaContextForSnapshot;
78390
- } });
78391
- var stage_user_profile_reminders_1 = require_stage_user_profile_reminders();
78392
- Object.defineProperty(exports2, "resolveUserProfileContextForSnapshot", { enumerable: true, get: function() {
78393
- return stage_user_profile_reminders_1.resolveUserProfileContextForSnapshot;
78394
- } });
78395
78341
  var completion_classifier_1 = require_completion_classifier();
78396
78342
  Object.defineProperty(exports2, "classifyCompletion", { enumerable: true, get: function() {
78397
78343
  return completion_classifier_1.classifyCompletion;
@@ -80702,8 +80648,6 @@ var require_daemon = __commonJS({
80702
80648
  registryService;
80703
80649
  timerManager;
80704
80650
  sessionLogWriter;
80705
- /** In-memory compaction snapshots keyed by sessionId. Populated by PreCompact, consumed by PostCompact. */
80706
- compactionSnapshots = /* @__PURE__ */ new Map();
80707
80651
  /**
80708
80652
  * Parent session type keyed by sessionId. Only updated by parent hooks
80709
80653
  * (interactive/non-interactive); subagent 'agent' hooks share the parent
@@ -81189,36 +81133,29 @@ var require_daemon = __commonJS({
81189
81133
  if (hook === "UserPromptSubmit") {
81190
81134
  await this.handleUserPromptSubmitCleanup(event, { logger: requestLogger });
81191
81135
  }
81192
- if (hook === "PreCompact") {
81193
- await this.handlePreCompact(event, { logger: requestLogger });
81194
- }
81195
- let postCompactResponse;
81196
81136
  if (hook === "PostCompact") {
81197
- postCompactResponse = await this.handlePostCompact(event, { logger: requestLogger });
81137
+ await this.handlePostCompact(event, { logger: requestLogger });
81198
81138
  }
81199
81139
  if (sessionId && !this.logMetrics.hasSession(sessionId)) {
81200
81140
  await this.logMetrics.initSessionCounters(sessionId, false);
81201
81141
  requestLogger.debug("Log counters initialized from file for hook", { hook });
81202
81142
  }
81203
- const response = await this.handlerRegistry.invokeHook(hook, event, { logger: requestLogger });
81204
- if (postCompactResponse?.additionalContext) {
81205
- const registryContext = response.additionalContext;
81206
- response.additionalContext = registryContext ? `${registryContext}
81207
-
81208
- ${postCompactResponse.additionalContext}` : postCompactResponse.additionalContext;
81209
- }
81210
- return response;
81143
+ return this.handlerRegistry.invokeHook(hook, event, { logger: requestLogger });
81211
81144
  }
81212
81145
  /**
81213
- * Handle PostCompact: signal compaction to the session's TranscriptService (UC1)
81214
- * and return the pre-compact session context snapshot for re-injection (UC2).
81146
+ * Handle PostCompact: signal compaction to the session's TranscriptService.
81147
+ *
81148
+ * PostCompact does not re-inject session context: Claude Code's PostCompact hook-output
81149
+ * schema has no additionalContext variant, so any snapshot would be rejected. Persona and
81150
+ * user-profile context are re-established after compaction via the SessionStart:compact
81151
+ * staging path instead.
81215
81152
  */
81216
81153
  async handlePostCompact(event, options) {
81217
81154
  const log = options?.logger ?? this.logger;
81218
81155
  const sessionId = event.context?.sessionId;
81219
81156
  if (!sessionId) {
81220
81157
  log.warn("PostCompact event missing sessionId");
81221
- return {};
81158
+ return;
81222
81159
  }
81223
81160
  const transcriptService = this.serviceFactory.getTranscriptService(sessionId);
81224
81161
  if (transcriptService) {
@@ -81227,82 +81164,6 @@ ${postCompactResponse.additionalContext}` : postCompactResponse.additionalContex
81227
81164
  } else {
81228
81165
  log.warn("PostCompact: no transcript service for session", { sessionId });
81229
81166
  }
81230
- const snapshot = this.compactionSnapshots.get(sessionId);
81231
- if (snapshot) {
81232
- this.compactionSnapshots.delete(sessionId);
81233
- log.info("PostCompact: re-injecting compaction snapshot", {
81234
- sessionId,
81235
- snapshotLength: snapshot.length
81236
- });
81237
- return { additionalContext: snapshot };
81238
- }
81239
- return {};
81240
- }
81241
- /**
81242
- * Handle PreCompact: capture staged SessionStart reminders as a compaction snapshot.
81243
- * The snapshot is returned by the next PostCompact call for context re-injection.
81244
- */
81245
- async handlePreCompact(event, options) {
81246
- const log = options?.logger ?? this.logger;
81247
- const sessionId = event.context?.sessionId;
81248
- if (!sessionId)
81249
- return;
81250
- try {
81251
- const minimalCtx = {
81252
- role: "daemon",
81253
- config: {
81254
- core: {
81255
- logging: {
81256
- level: this.configService.core.logging.level,
81257
- components: this.configService.core.logging.components
81258
- },
81259
- development: { enabled: this.configService.core.development.enabled }
81260
- },
81261
- llm: {
81262
- defaultProfile: this.configService.llm.defaultProfile,
81263
- defaultFallbackProfileId: this.configService.llm.defaultFallbackProfileId,
81264
- profiles: this.configService.llm.profiles,
81265
- fallbackProfiles: this.configService.llm.fallbackProfiles
81266
- },
81267
- getAll: () => this.configService.getAll(),
81268
- getFeature: (name) => this.configService.getFeature(name)
81269
- },
81270
- logger: log,
81271
- assets: this.assetResolver,
81272
- paths: this.buildRuntimePaths(),
81273
- stateService: this.stateService,
81274
- // Remaining DaemonContext fields are not needed by the resolve functions
81275
- handlers: this.handlerRegistry,
81276
- staging: this.serviceFactory.getStagingService(sessionId),
81277
- transcript: void 0,
81278
- llm: void 0,
81279
- profileFactory: void 0,
81280
- orchestrator: this.orchestrator,
81281
- personaClearCache: { consume: () => this.consumeCachedPersona() },
81282
- sessionType: this.sessionTypes.get(sessionId) ?? "interactive"
81283
- };
81284
- const [personaContext, userProfileContext] = await Promise.all([
81285
- (0, feature_reminders_1.resolvePersonaContextForSnapshot)(minimalCtx, sessionId),
81286
- Promise.resolve((0, feature_reminders_1.resolveUserProfileContextForSnapshot)(minimalCtx))
81287
- ]);
81288
- const contextParts = [personaContext, userProfileContext].filter((c) => typeof c === "string" && c.trim().length > 0);
81289
- if (contextParts.length === 0) {
81290
- log.debug("PreCompact: no context to snapshot", { sessionId });
81291
- return;
81292
- }
81293
- const snapshot = ["Context was compacted. Re-establishing session context:", "", ...contextParts].join("\n");
81294
- this.compactionSnapshots.set(sessionId, snapshot);
81295
- log.info("PreCompact: compaction snapshot captured", {
81296
- sessionId,
81297
- reminderCount: contextParts.length,
81298
- snapshotLength: snapshot.length
81299
- });
81300
- } catch (err) {
81301
- log.warn("PreCompact: failed to capture snapshot", {
81302
- sessionId,
81303
- error: (0, core_1.toErrorMessage)(err)
81304
- });
81305
- }
81306
81167
  }
81307
81168
  /**
81308
81169
  * Handle SessionStart-specific logic: clear staging on startup/clear.
@@ -81388,7 +81249,6 @@ ${postCompactResponse.additionalContext}` : postCompactResponse.additionalContex
81388
81249
  }
81389
81250
  await this.llmManager.shutdownSessionProvider(sessionId, log);
81390
81251
  this.logMetrics.deleteSessionCounters(sessionId);
81391
- this.compactionSnapshots.delete(sessionId);
81392
81252
  await this.serviceFactory.shutdownSession(sessionId);
81393
81253
  await this.sessionLogWriter.closeSession(sessionId);
81394
81254
  log.info("Session ended");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scotthamilton77/sidekick",
3
- "version": "0.1.30",
3
+ "version": "0.1.31",
4
4
  "description": "AI pair programming assistant with personas, session tracking, and contextual nudges",
5
5
  "bin": {
6
6
  "sidekick": "dist/bin.js"