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