@scotthamilton77/sidekick 0.1.29 → 0.1.30

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.
@@ -124,3 +124,8 @@ settings:
124
124
  # When non-off, the persona-voice reminder is replaced by a compact caveman
125
125
  # directive and the statusline shows the level.
126
126
  cavemanMode: "off"
127
+ # Inject persona/caveman into non-interactive (claude -p) sessions. Default
128
+ # false — no human reads a programmatic session, so the voice is wasted tokens.
129
+ # Set true to opt back in.
130
+ injectPersonaIntoNonInteractiveSessions: false
131
+ injectCavemanIntoNonInteractiveSessions: false
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.29" : void 0, devFingerprint = computeDevFingerprint) {
47582
+ function computeBuildIdentity(injectedVersion = true ? "0.1.30" : void 0, devFingerprint = computeDevFingerprint) {
47583
47583
  return injectedVersion !== void 0 ? injectedVersion : DEV_PREFIX + devFingerprint();
47584
47584
  }
47585
47585
  function computeDevFingerprint() {
@@ -76837,7 +76837,9 @@ var require_types3 = __commonJS({
76837
76837
  llmProfiles: {},
76838
76838
  weights: {},
76839
76839
  persistThroughClear: true,
76840
- cavemanMode: "off"
76840
+ cavemanMode: "off",
76841
+ injectPersonaIntoNonInteractiveSessions: false,
76842
+ injectCavemanIntoNonInteractiveSessions: false
76841
76843
  }
76842
76844
  };
76843
76845
  exports2.RESUME_MIN_CONFIDENCE = 0.7;
@@ -77776,6 +77778,10 @@ var require_update_summary = __commonJS({
77776
77778
  ctx.logger.debug("Session summary disabled; skipping analysis", { sessionId, reason });
77777
77779
  return;
77778
77780
  }
77781
+ if (ctx.sessionType === "non-interactive") {
77782
+ ctx.logger.debug("Non-interactive session; skipping summary analysis", { sessionId, reason });
77783
+ return;
77784
+ }
77779
77785
  try {
77780
77786
  const countdown = await loadCountdownState(summaryState, sessionId);
77781
77787
  const startTime = Date.now();
@@ -78148,6 +78154,28 @@ var require_dist5 = __commonJS({
78148
78154
  }
78149
78155
  });
78150
78156
 
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
+
78151
78179
  // ../feature-reminders/dist/handlers/staging/stage-persona-reminders.js
78152
78180
  var require_stage_persona_reminders = __commonJS({
78153
78181
  "../feature-reminders/dist/handlers/staging/stage-persona-reminders.js"(exports2) {
@@ -78163,6 +78191,7 @@ var require_stage_persona_reminders = __commonJS({
78163
78191
  var types_1 = require_dist();
78164
78192
  var reminder_utils_js_1 = require_reminder_utils();
78165
78193
  var types_js_1 = require_types2();
78194
+ var session_type_gate_js_1 = require_session_type_gate();
78166
78195
  var throttle_utils_js_1 = require_throttle_utils();
78167
78196
  async function restagePersonaRemindersForActiveSessions(ctxFactory, sessionIds, logger) {
78168
78197
  logger.info("Re-staging persona reminders for active sessions", { count: sessionIds.length });
@@ -78378,6 +78407,10 @@ var require_stage_persona_reminders = __commonJS({
78378
78407
  async function resolvePersonaContextForSnapshot(ctx, sessionId) {
78379
78408
  if (!isPersonaInjectionEnabled(ctx))
78380
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
+ }
78381
78414
  const persona = await loadPersonaForSession(ctx, sessionId);
78382
78415
  if (!persona)
78383
78416
  return void 0;
@@ -78774,6 +78807,7 @@ var require_consumption_handler_factory = __commonJS({
78774
78807
  var events_js_1 = require_events2();
78775
78808
  var types_1 = require_dist();
78776
78809
  var cli_staging_reader_js_1 = require_cli_staging_reader();
78810
+ var session_type_gate_js_1 = require_session_type_gate();
78777
78811
  function buildDefaultResponse(reminder, supportsBlocking) {
78778
78812
  const response = {};
78779
78813
  if (supportsBlocking && reminder.blocking) {
@@ -78807,7 +78841,8 @@ var require_consumption_handler_factory = __commonJS({
78807
78841
  paths: cliCtx.paths,
78808
78842
  sessionId
78809
78843
  });
78810
- const reminders = reader.listReminders(hook);
78844
+ const personaConfig = cliCtx.config.getFeature("session-summary").settings?.personas ?? {};
78845
+ const reminders = reader.listReminders(hook).filter((r) => !(0, session_type_gate_js_1.suppressReminderForSessionType)(r.name, event.context.sessionType, personaConfig));
78811
78846
  if (reminders.length === 0) {
78812
78847
  return { response: {} };
78813
78848
  }
@@ -79879,7 +79914,8 @@ var require_hook = __commonJS({
79879
79914
  timestamp: Date.now(),
79880
79915
  correlationId,
79881
79916
  ...input.agentId !== void 0 && { agentId: input.agentId },
79882
- ...input.agentType !== void 0 && { agentType: input.agentType }
79917
+ ...input.agentType !== void 0 && { agentType: input.agentType },
79918
+ sessionType: input.sessionType
79883
79919
  };
79884
79920
  switch (hookName) {
79885
79921
  case "SessionStart":
@@ -87523,6 +87559,7 @@ var require_cli = __commonJS({
87523
87559
  Object.defineProperty(exports2, "__esModule", { value: true });
87524
87560
  exports2.UnknownOptionError = void 0;
87525
87561
  exports2.parseArgs = parseArgs;
87562
+ exports2.resolveSessionType = resolveSessionType;
87526
87563
  exports2.parseHookInput = parseHookInput;
87527
87564
  exports2.initializeRuntime = initializeRuntime;
87528
87565
  exports2.initializeSession = initializeSession;
@@ -87531,7 +87568,7 @@ var require_cli = __commonJS({
87531
87568
  var promises_12 = require("node:fs/promises");
87532
87569
  var node_stream_1 = require("node:stream");
87533
87570
  var yargs_parser_1 = __importDefault2(require_build());
87534
- var VERSION = true ? "0.1.29" : "dev";
87571
+ var VERSION = true ? "0.1.30" : "dev";
87535
87572
  var SANDBOX_ERROR_MESSAGE = `Error: Daemon commands cannot run in sandbox mode.
87536
87573
 
87537
87574
  Claude Code's sandbox blocks Unix socket operations required for daemon IPC.
@@ -87661,7 +87698,14 @@ Example: { "command": "pnpm sidekick daemon status", "dangerouslyDisableSandbox"
87661
87698
  writeStatus: Boolean(parsed["write-status"])
87662
87699
  };
87663
87700
  }
87664
- function parseHookInput(stdinData) {
87701
+ function resolveSessionType(agentId, entrypoint) {
87702
+ if (agentId)
87703
+ return "agent";
87704
+ if (entrypoint === "sdk-cli")
87705
+ return "non-interactive";
87706
+ return "interactive";
87707
+ }
87708
+ function parseHookInput(stdinData, entrypoint) {
87665
87709
  if (!stdinData?.trim()) {
87666
87710
  return void 0;
87667
87711
  }
@@ -87686,6 +87730,7 @@ Example: { "command": "pnpm sidekick daemon status", "dangerouslyDisableSandbox"
87686
87730
  permissionMode,
87687
87731
  agentId,
87688
87732
  agentType,
87733
+ sessionType: resolveSessionType(agentId, entrypoint),
87689
87734
  raw
87690
87735
  };
87691
87736
  } catch {
@@ -87696,7 +87741,7 @@ Example: { "command": "pnpm sidekick daemon status", "dangerouslyDisableSandbox"
87696
87741
  const stderr = options.stderr ?? new node_stream_1.PassThrough();
87697
87742
  const parsed = parseArgs(options.argv);
87698
87743
  const homeDir = options.homeDir ?? options.env?.HOME;
87699
- const hookInput = parseHookInput(options.stdinData);
87744
+ const hookInput = parseHookInput(options.stdinData, options.env?.CLAUDE_CODE_ENTRYPOINT);
87700
87745
  const runtime = (0, runtime_1.bootstrapRuntime)({
87701
87746
  projectDir: parsed.projectDir,
87702
87747
  logLevel: parsed.logLevel,
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.29" : void 0, devFingerprint = computeDevFingerprint) {
46606
+ function computeBuildIdentity(injectedVersion = true ? "0.1.30" : void 0, devFingerprint = computeDevFingerprint) {
46607
46607
  return injectedVersion !== void 0 ? injectedVersion : DEV_PREFIX + devFingerprint();
46608
46608
  }
46609
46609
  function computeDevFingerprint() {
@@ -75601,7 +75601,9 @@ var require_types3 = __commonJS({
75601
75601
  llmProfiles: {},
75602
75602
  weights: {},
75603
75603
  persistThroughClear: true,
75604
- cavemanMode: "off"
75604
+ cavemanMode: "off",
75605
+ injectPersonaIntoNonInteractiveSessions: false,
75606
+ injectCavemanIntoNonInteractiveSessions: false
75605
75607
  }
75606
75608
  };
75607
75609
  exports2.RESUME_MIN_CONFIDENCE = 0.7;
@@ -76540,6 +76542,10 @@ var require_update_summary = __commonJS({
76540
76542
  ctx.logger.debug("Session summary disabled; skipping analysis", { sessionId, reason });
76541
76543
  return;
76542
76544
  }
76545
+ if (ctx.sessionType === "non-interactive") {
76546
+ ctx.logger.debug("Non-interactive session; skipping summary analysis", { sessionId, reason });
76547
+ return;
76548
+ }
76543
76549
  try {
76544
76550
  const countdown = await loadCountdownState(summaryState, sessionId);
76545
76551
  const startTime = Date.now();
@@ -76912,6 +76918,28 @@ var require_dist5 = __commonJS({
76912
76918
  }
76913
76919
  });
76914
76920
 
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
+
76915
76943
  // ../feature-reminders/dist/handlers/staging/stage-persona-reminders.js
76916
76944
  var require_stage_persona_reminders = __commonJS({
76917
76945
  "../feature-reminders/dist/handlers/staging/stage-persona-reminders.js"(exports2) {
@@ -76927,6 +76955,7 @@ var require_stage_persona_reminders = __commonJS({
76927
76955
  var types_1 = require_dist();
76928
76956
  var reminder_utils_js_1 = require_reminder_utils();
76929
76957
  var types_js_1 = require_types2();
76958
+ var session_type_gate_js_1 = require_session_type_gate();
76930
76959
  var throttle_utils_js_1 = require_throttle_utils();
76931
76960
  async function restagePersonaRemindersForActiveSessions(ctxFactory, sessionIds, logger) {
76932
76961
  logger.info("Re-staging persona reminders for active sessions", { count: sessionIds.length });
@@ -77142,6 +77171,10 @@ var require_stage_persona_reminders = __commonJS({
77142
77171
  async function resolvePersonaContextForSnapshot(ctx, sessionId) {
77143
77172
  if (!isPersonaInjectionEnabled(ctx))
77144
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
+ }
77145
77178
  const persona = await loadPersonaForSession(ctx, sessionId);
77146
77179
  if (!persona)
77147
77180
  return void 0;
@@ -77538,6 +77571,7 @@ var require_consumption_handler_factory = __commonJS({
77538
77571
  var events_js_1 = require_events2();
77539
77572
  var types_1 = require_dist();
77540
77573
  var cli_staging_reader_js_1 = require_cli_staging_reader();
77574
+ var session_type_gate_js_1 = require_session_type_gate();
77541
77575
  function buildDefaultResponse(reminder, supportsBlocking) {
77542
77576
  const response = {};
77543
77577
  if (supportsBlocking && reminder.blocking) {
@@ -77571,7 +77605,8 @@ var require_consumption_handler_factory = __commonJS({
77571
77605
  paths: cliCtx.paths,
77572
77606
  sessionId
77573
77607
  });
77574
- const reminders = reader.listReminders(hook);
77608
+ const personaConfig = cliCtx.config.getFeature("session-summary").settings?.personas ?? {};
77609
+ const reminders = reader.listReminders(hook).filter((r) => !(0, session_type_gate_js_1.suppressReminderForSessionType)(r.name, event.context.sessionType, personaConfig));
77575
77610
  if (reminders.length === 0) {
77576
77611
  return { response: {} };
77577
77612
  }
@@ -80018,12 +80053,18 @@ var require_daemon_helpers = __commonJS({
80018
80053
  "use strict";
80019
80054
  Object.defineProperty(exports2, "__esModule", { value: true });
80020
80055
  exports2.REGISTRY_HEARTBEAT_INTERVAL_MS = exports2.EVICTION_INTERVAL_MS = exports2.HEARTBEAT_INTERVAL_MS = exports2.IDLE_CHECK_INTERVAL_MS = exports2.VERSION = void 0;
80056
+ exports2.nextStoredSessionType = nextStoredSessionType;
80021
80057
  exports2.diffConfigs = diffConfigs;
80022
80058
  exports2.resolveTranscriptPath = resolveTranscriptPath;
80023
80059
  exports2.shouldRunStartupCleanup = shouldRunStartupCleanup;
80024
80060
  exports2.getPersonaInjectionEnabled = getPersonaInjectionEnabled;
80025
80061
  exports2.getCavemanConfigDefault = getCavemanConfigDefault;
80026
80062
  var core_1 = require_dist4();
80063
+ function nextStoredSessionType(current, incoming) {
80064
+ if (incoming && incoming !== "agent")
80065
+ return incoming;
80066
+ return current;
80067
+ }
80027
80068
  exports2.VERSION = (0, core_1.computeBuildIdentity)();
80028
80069
  exports2.IDLE_CHECK_INTERVAL_MS = 30 * 1e3;
80029
80070
  exports2.HEARTBEAT_INTERVAL_MS = 5 * 1e3;
@@ -80663,6 +80704,13 @@ var require_daemon = __commonJS({
80663
80704
  sessionLogWriter;
80664
80705
  /** In-memory compaction snapshots keyed by sessionId. Populated by PreCompact, consumed by PostCompact. */
80665
80706
  compactionSnapshots = /* @__PURE__ */ new Map();
80707
+ /**
80708
+ * Parent session type keyed by sessionId. Only updated by parent hooks
80709
+ * (interactive/non-interactive); subagent 'agent' hooks share the parent
80710
+ * sessionId and are ignored so they cannot flip the stored type. Surfaced onto
80711
+ * DaemonContext.sessionType to gate expensive session-summary work.
80712
+ */
80713
+ sessionTypes = /* @__PURE__ */ new Map();
80666
80714
  /** Cache persona for handoff on clear. */
80667
80715
  cachePersonaForClear(personaId) {
80668
80716
  this.lastClearedPersona = { personaId, timestamp: Date.now() };
@@ -81026,6 +81074,10 @@ var require_daemon = __commonJS({
81026
81074
  * Uses the same infrastructure as the IPC handlers for message generation.
81027
81075
  */
81028
81076
  async regenerateMessagesForSession(sessionId) {
81077
+ if (this.sessionTypes.get(sessionId) === "non-interactive") {
81078
+ this.logger.debug("Non-interactive session; skipping message regeneration", { sessionId });
81079
+ return;
81080
+ }
81029
81081
  this.logger.info("Regenerating messages after persona change", { sessionId });
81030
81082
  try {
81031
81083
  await (0, persona_transition_js_1.stagePersonaTransition)(this.stateService, sessionId);
@@ -81111,6 +81163,11 @@ var require_daemon = __commonJS({
81111
81163
  throw new Error("hook.invoke requires hook and event parameters");
81112
81164
  }
81113
81165
  const { sessionId, correlationId } = event.context ?? {};
81166
+ if (sessionId) {
81167
+ const next = (0, daemon_helpers_js_1.nextStoredSessionType)(this.sessionTypes.get(sessionId), event.context?.sessionType);
81168
+ if (next !== void 0)
81169
+ this.sessionTypes.set(sessionId, next);
81170
+ }
81114
81171
  const requestLogger = this.logger.child({
81115
81172
  context: { sessionId, correlationId }
81116
81173
  });
@@ -81221,7 +81278,8 @@ ${postCompactResponse.additionalContext}` : postCompactResponse.additionalContex
81221
81278
  llm: void 0,
81222
81279
  profileFactory: void 0,
81223
81280
  orchestrator: this.orchestrator,
81224
- personaClearCache: { consume: () => this.consumeCachedPersona() }
81281
+ personaClearCache: { consume: () => this.consumeCachedPersona() },
81282
+ sessionType: this.sessionTypes.get(sessionId) ?? "interactive"
81225
81283
  };
81226
81284
  const [personaContext, userProfileContext] = await Promise.all([
81227
81285
  (0, feature_reminders_1.resolvePersonaContextForSnapshot)(minimalCtx, sessionId),
@@ -81290,6 +81348,7 @@ ${postCompactResponse.additionalContext}` : postCompactResponse.additionalContex
81290
81348
  const log = options?.logger ?? this.logger;
81291
81349
  const sessionId = event.context?.sessionId;
81292
81350
  if (sessionId) {
81351
+ this.sessionTypes.delete(sessionId);
81293
81352
  const payload = event.payload;
81294
81353
  log.info("[persona-lifecycle] ClearHandoff: handleSessionEnd entered", {
81295
81354
  sessionId,
@@ -81668,7 +81727,8 @@ ${postCompactResponse.additionalContext}` : postCompactResponse.additionalContex
81668
81727
  orchestrator: this.orchestrator,
81669
81728
  personaClearCache: {
81670
81729
  consume: () => this.consumeCachedPersona()
81671
- }
81730
+ },
81731
+ sessionType: this.sessionTypes.get(sessionId) ?? "interactive"
81672
81732
  };
81673
81733
  this.handlerRegistry.updateSession({ sessionId, transcriptPath });
81674
81734
  this.handlerRegistry.setStagingProvider(() => stagingService);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scotthamilton77/sidekick",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
4
4
  "description": "AI pair programming assistant with personas, session tracking, and contextual nudges",
5
5
  "bin": {
6
6
  "sidekick": "dist/bin.js"