@scotthamilton77/sidekick 0.1.8 → 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
CHANGED
|
@@ -1030,7 +1030,7 @@ var require_events = __commonJS({
|
|
|
1030
1030
|
"../types/dist/events.js"(exports2) {
|
|
1031
1031
|
"use strict";
|
|
1032
1032
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
1033
|
-
exports2.HOOK_NAMES = void 0;
|
|
1033
|
+
exports2.UI_EVENT_VISIBILITY = exports2.UI_EVENT_TYPES = exports2.HOOK_NAMES = void 0;
|
|
1034
1034
|
exports2.isHookEvent = isHookEvent;
|
|
1035
1035
|
exports2.isTranscriptEvent = isTranscriptEvent;
|
|
1036
1036
|
exports2.isSessionStartEvent = isSessionStartEvent;
|
|
@@ -1092,6 +1092,92 @@ var require_events = __commonJS({
|
|
|
1092
1092
|
function isTranscriptLoggingEvent(event) {
|
|
1093
1093
|
return event.source === "transcript";
|
|
1094
1094
|
}
|
|
1095
|
+
exports2.UI_EVENT_TYPES = [
|
|
1096
|
+
// Reminder events
|
|
1097
|
+
"reminder:staged",
|
|
1098
|
+
"reminder:unstaged",
|
|
1099
|
+
"reminder:consumed",
|
|
1100
|
+
"reminder:cleared",
|
|
1101
|
+
"reminder:not-staged",
|
|
1102
|
+
// Decision events
|
|
1103
|
+
"decision:recorded",
|
|
1104
|
+
// Session summary events
|
|
1105
|
+
"session-summary:start",
|
|
1106
|
+
"session-summary:finish",
|
|
1107
|
+
// Session state change events
|
|
1108
|
+
"session-title:changed",
|
|
1109
|
+
"intent:changed",
|
|
1110
|
+
// Snarky message events
|
|
1111
|
+
"snarky-message:start",
|
|
1112
|
+
"snarky-message:finish",
|
|
1113
|
+
// Resume message events
|
|
1114
|
+
"resume-message:start",
|
|
1115
|
+
"resume-message:finish",
|
|
1116
|
+
// Persona events
|
|
1117
|
+
"persona:selected",
|
|
1118
|
+
"persona:changed",
|
|
1119
|
+
// Statusline events
|
|
1120
|
+
"statusline:rendered",
|
|
1121
|
+
// Hook lifecycle events
|
|
1122
|
+
"hook:received",
|
|
1123
|
+
"hook:completed",
|
|
1124
|
+
// Daemon event processing
|
|
1125
|
+
"event:received",
|
|
1126
|
+
"event:processed",
|
|
1127
|
+
// Daemon lifecycle events
|
|
1128
|
+
"daemon:starting",
|
|
1129
|
+
"daemon:started",
|
|
1130
|
+
"ipc:started",
|
|
1131
|
+
"config:watcher-started",
|
|
1132
|
+
"session:eviction-started",
|
|
1133
|
+
// Skipped operation events
|
|
1134
|
+
"session-summary:skipped",
|
|
1135
|
+
"resume-message:skipped",
|
|
1136
|
+
// Error events
|
|
1137
|
+
"statusline:error",
|
|
1138
|
+
// Transcript events
|
|
1139
|
+
"transcript:emitted",
|
|
1140
|
+
"transcript:pre-compact",
|
|
1141
|
+
// General error
|
|
1142
|
+
"error:occurred"
|
|
1143
|
+
];
|
|
1144
|
+
exports2.UI_EVENT_VISIBILITY = {
|
|
1145
|
+
// Timeline events (user-visible state changes)
|
|
1146
|
+
"reminder:staged": "timeline",
|
|
1147
|
+
"reminder:unstaged": "timeline",
|
|
1148
|
+
"reminder:consumed": "timeline",
|
|
1149
|
+
"reminder:cleared": "timeline",
|
|
1150
|
+
"reminder:not-staged": "log",
|
|
1151
|
+
"decision:recorded": "timeline",
|
|
1152
|
+
"session-summary:start": "timeline",
|
|
1153
|
+
"session-summary:finish": "timeline",
|
|
1154
|
+
"session-title:changed": "timeline",
|
|
1155
|
+
"intent:changed": "timeline",
|
|
1156
|
+
"snarky-message:start": "timeline",
|
|
1157
|
+
"snarky-message:finish": "timeline",
|
|
1158
|
+
"resume-message:start": "timeline",
|
|
1159
|
+
"resume-message:finish": "timeline",
|
|
1160
|
+
"persona:selected": "timeline",
|
|
1161
|
+
"persona:changed": "timeline",
|
|
1162
|
+
"statusline:rendered": "timeline",
|
|
1163
|
+
// Both (timeline + log viewer)
|
|
1164
|
+
"hook:received": "both",
|
|
1165
|
+
"hook:completed": "both",
|
|
1166
|
+
"statusline:error": "both",
|
|
1167
|
+
"error:occurred": "both",
|
|
1168
|
+
// Log-only (internal machinery)
|
|
1169
|
+
"event:received": "log",
|
|
1170
|
+
"event:processed": "log",
|
|
1171
|
+
"daemon:starting": "log",
|
|
1172
|
+
"daemon:started": "log",
|
|
1173
|
+
"ipc:started": "log",
|
|
1174
|
+
"config:watcher-started": "log",
|
|
1175
|
+
"session:eviction-started": "log",
|
|
1176
|
+
"session-summary:skipped": "log",
|
|
1177
|
+
"resume-message:skipped": "log",
|
|
1178
|
+
"transcript:emitted": "log",
|
|
1179
|
+
"transcript:pre-compact": "log"
|
|
1180
|
+
};
|
|
1095
1181
|
}
|
|
1096
1182
|
});
|
|
1097
1183
|
|
|
@@ -17228,6 +17314,7 @@ var require_state = __commonJS({
|
|
|
17228
17314
|
exports2.createDefaultLLMMetrics = createDefaultLLMMetrics;
|
|
17229
17315
|
var zod_1 = require_zod();
|
|
17230
17316
|
var events_js_1 = require_events();
|
|
17317
|
+
var staging_js_1 = require_staging();
|
|
17231
17318
|
exports2.SessionSummaryStateSchema = zod_1.z.object({
|
|
17232
17319
|
/** Session identifier */
|
|
17233
17320
|
session_id: zod_1.z.string(),
|
|
@@ -17389,16 +17476,7 @@ var require_state = __commonJS({
|
|
|
17389
17476
|
lastMatchedScope: zod_1.z.enum(["project", "package", "file"]).nullable().optional()
|
|
17390
17477
|
});
|
|
17391
17478
|
exports2.VerificationToolsStateSchema = zod_1.z.record(zod_1.z.string(), exports2.VerificationToolStatusSchema);
|
|
17392
|
-
exports2.CachedReminderSchema =
|
|
17393
|
-
name: zod_1.z.string(),
|
|
17394
|
-
blocking: zod_1.z.boolean(),
|
|
17395
|
-
priority: zod_1.z.number(),
|
|
17396
|
-
persistent: zod_1.z.boolean(),
|
|
17397
|
-
throttle: zod_1.z.boolean().optional(),
|
|
17398
|
-
userMessage: zod_1.z.string().optional(),
|
|
17399
|
-
additionalContext: zod_1.z.string().optional(),
|
|
17400
|
-
reason: zod_1.z.string().optional()
|
|
17401
|
-
});
|
|
17479
|
+
exports2.CachedReminderSchema = staging_js_1.StagedReminderSchema.omit({ stagedAt: true });
|
|
17402
17480
|
exports2.ReminderThrottleEntrySchema = zod_1.z.object({
|
|
17403
17481
|
/** Number of conversation messages since the reminder was last staged */
|
|
17404
17482
|
messagesSinceLastStaging: zod_1.z.number().int().nonnegative(),
|
|
@@ -17979,6 +18057,24 @@ var require_setup_status = __commonJS({
|
|
|
17979
18057
|
}
|
|
17980
18058
|
});
|
|
17981
18059
|
|
|
18060
|
+
// ../types/dist/state.js
|
|
18061
|
+
var require_state2 = __commonJS({
|
|
18062
|
+
"../types/dist/state.js"(exports2) {
|
|
18063
|
+
"use strict";
|
|
18064
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
18065
|
+
exports2.ProjectRegistryEntrySchema = void 0;
|
|
18066
|
+
var zod_1 = require_zod();
|
|
18067
|
+
exports2.ProjectRegistryEntrySchema = zod_1.z.object({
|
|
18068
|
+
/** Absolute filesystem path to the project root */
|
|
18069
|
+
path: zod_1.z.string(),
|
|
18070
|
+
/** Human-readable project name (derived from directory name) */
|
|
18071
|
+
displayName: zod_1.z.string(),
|
|
18072
|
+
/** ISO 8601 timestamp of last daemon activity */
|
|
18073
|
+
lastActive: zod_1.z.iso.datetime()
|
|
18074
|
+
});
|
|
18075
|
+
}
|
|
18076
|
+
});
|
|
18077
|
+
|
|
17982
18078
|
// ../types/dist/index.js
|
|
17983
18079
|
var require_dist = __commonJS({
|
|
17984
18080
|
"../types/dist/index.js"(exports2) {
|
|
@@ -18010,6 +18106,7 @@ var require_dist = __commonJS({
|
|
|
18010
18106
|
__exportStar(require_tasks(), exports2);
|
|
18011
18107
|
__exportStar(require_hook_input(), exports2);
|
|
18012
18108
|
__exportStar(require_setup_status(), exports2);
|
|
18109
|
+
__exportStar(require_state2(), exports2);
|
|
18013
18110
|
}
|
|
18014
18111
|
});
|
|
18015
18112
|
|
|
@@ -27755,9 +27852,13 @@ var require_config2 = __commonJS({
|
|
|
27755
27852
|
state: v4_1.z.string(),
|
|
27756
27853
|
assets: v4_1.z.string().optional()
|
|
27757
27854
|
}).strict();
|
|
27855
|
+
var ProjectsSchema = v4_1.z.object({
|
|
27856
|
+
retentionDays: v4_1.z.number().min(1)
|
|
27857
|
+
}).strict();
|
|
27758
27858
|
var DaemonSchema = v4_1.z.object({
|
|
27759
27859
|
idleTimeoutMs: v4_1.z.number().min(0),
|
|
27760
|
-
shutdownTimeoutMs: v4_1.z.number().min(0)
|
|
27860
|
+
shutdownTimeoutMs: v4_1.z.number().min(0),
|
|
27861
|
+
projects: ProjectsSchema.default({ retentionDays: 30 })
|
|
27761
27862
|
}).strict();
|
|
27762
27863
|
var IpcSchema = v4_1.z.object({
|
|
27763
27864
|
connectTimeoutMs: v4_1.z.number().min(0),
|
|
@@ -45661,7 +45762,7 @@ var require_structured_logging = __commonJS({
|
|
|
45661
45762
|
*/
|
|
45662
45763
|
hookReceived(context, metadata) {
|
|
45663
45764
|
return {
|
|
45664
|
-
type: "
|
|
45765
|
+
type: "hook:received",
|
|
45665
45766
|
time: Date.now(),
|
|
45666
45767
|
source: "cli",
|
|
45667
45768
|
context: {
|
|
@@ -45671,7 +45772,9 @@ var require_structured_logging = __commonJS({
|
|
|
45671
45772
|
hook: context.hook
|
|
45672
45773
|
},
|
|
45673
45774
|
payload: {
|
|
45674
|
-
|
|
45775
|
+
hook: context.hook,
|
|
45776
|
+
cwd: metadata.cwd,
|
|
45777
|
+
mode: metadata.mode
|
|
45675
45778
|
}
|
|
45676
45779
|
};
|
|
45677
45780
|
},
|
|
@@ -45680,7 +45783,7 @@ var require_structured_logging = __commonJS({
|
|
|
45680
45783
|
*/
|
|
45681
45784
|
hookCompleted(context, metadata, state) {
|
|
45682
45785
|
return {
|
|
45683
|
-
type: "
|
|
45786
|
+
type: "hook:completed",
|
|
45684
45787
|
time: Date.now(),
|
|
45685
45788
|
source: "cli",
|
|
45686
45789
|
context: {
|
|
@@ -45690,8 +45793,10 @@ var require_structured_logging = __commonJS({
|
|
|
45690
45793
|
hook: context.hook
|
|
45691
45794
|
},
|
|
45692
45795
|
payload: {
|
|
45693
|
-
|
|
45694
|
-
metadata
|
|
45796
|
+
hook: context.hook,
|
|
45797
|
+
durationMs: metadata.durationMs,
|
|
45798
|
+
reminderReturned: state?.reminderReturned,
|
|
45799
|
+
responseType: state?.responseType
|
|
45695
45800
|
}
|
|
45696
45801
|
};
|
|
45697
45802
|
},
|
|
@@ -45701,7 +45806,7 @@ var require_structured_logging = __commonJS({
|
|
|
45701
45806
|
*/
|
|
45702
45807
|
eventReceived(context, metadata) {
|
|
45703
45808
|
return {
|
|
45704
|
-
type: "
|
|
45809
|
+
type: "event:received",
|
|
45705
45810
|
time: Date.now(),
|
|
45706
45811
|
source: "daemon",
|
|
45707
45812
|
context: {
|
|
@@ -45712,7 +45817,9 @@ var require_structured_logging = __commonJS({
|
|
|
45712
45817
|
taskId: context.taskId
|
|
45713
45818
|
},
|
|
45714
45819
|
payload: {
|
|
45715
|
-
metadata
|
|
45820
|
+
eventKind: metadata.eventKind,
|
|
45821
|
+
...metadata.eventType !== void 0 && { eventType: metadata.eventType },
|
|
45822
|
+
...metadata.hook !== void 0 && { hook: metadata.hook }
|
|
45716
45823
|
}
|
|
45717
45824
|
};
|
|
45718
45825
|
},
|
|
@@ -45722,7 +45829,7 @@ var require_structured_logging = __commonJS({
|
|
|
45722
45829
|
*/
|
|
45723
45830
|
eventProcessed(context, state, metadata) {
|
|
45724
45831
|
return {
|
|
45725
|
-
type: "
|
|
45832
|
+
type: "event:processed",
|
|
45726
45833
|
time: Date.now(),
|
|
45727
45834
|
source: "daemon",
|
|
45728
45835
|
context: {
|
|
@@ -45733,17 +45840,19 @@ var require_structured_logging = __commonJS({
|
|
|
45733
45840
|
taskId: context.taskId
|
|
45734
45841
|
},
|
|
45735
45842
|
payload: {
|
|
45736
|
-
state,
|
|
45737
|
-
|
|
45843
|
+
handlerId: state.handlerId,
|
|
45844
|
+
success: state.success,
|
|
45845
|
+
durationMs: metadata.durationMs,
|
|
45846
|
+
error: metadata.error
|
|
45738
45847
|
}
|
|
45739
45848
|
};
|
|
45740
45849
|
},
|
|
45741
45850
|
/**
|
|
45742
45851
|
* Create a ReminderStaged event (logged when Daemon stages a reminder file).
|
|
45743
45852
|
*/
|
|
45744
|
-
reminderStaged(context, state,
|
|
45853
|
+
reminderStaged(context, state, _metadata) {
|
|
45745
45854
|
return {
|
|
45746
|
-
type: "
|
|
45855
|
+
type: "reminder:staged",
|
|
45747
45856
|
time: Date.now(),
|
|
45748
45857
|
source: "daemon",
|
|
45749
45858
|
context: {
|
|
@@ -45754,8 +45863,14 @@ var require_structured_logging = __commonJS({
|
|
|
45754
45863
|
taskId: context.taskId
|
|
45755
45864
|
},
|
|
45756
45865
|
payload: {
|
|
45757
|
-
state,
|
|
45758
|
-
|
|
45866
|
+
reminderName: state.reminderName,
|
|
45867
|
+
hookName: state.hookName,
|
|
45868
|
+
blocking: state.blocking,
|
|
45869
|
+
priority: state.priority,
|
|
45870
|
+
persistent: state.persistent,
|
|
45871
|
+
...state.reason !== void 0 && { reason: state.reason },
|
|
45872
|
+
...state.triggeredBy !== void 0 && { triggeredBy: state.triggeredBy },
|
|
45873
|
+
...state.thresholdState !== void 0 && { thresholdState: state.thresholdState }
|
|
45759
45874
|
}
|
|
45760
45875
|
};
|
|
45761
45876
|
},
|
|
@@ -45765,14 +45880,15 @@ var require_structured_logging = __commonJS({
|
|
|
45765
45880
|
*/
|
|
45766
45881
|
daemonStarting(metadata) {
|
|
45767
45882
|
return {
|
|
45768
|
-
type: "
|
|
45883
|
+
type: "daemon:starting",
|
|
45769
45884
|
time: Date.now(),
|
|
45770
45885
|
source: "daemon",
|
|
45771
45886
|
context: {
|
|
45772
45887
|
sessionId: ""
|
|
45773
45888
|
},
|
|
45774
45889
|
payload: {
|
|
45775
|
-
metadata
|
|
45890
|
+
projectDir: metadata.projectDir,
|
|
45891
|
+
pid: metadata.pid
|
|
45776
45892
|
}
|
|
45777
45893
|
};
|
|
45778
45894
|
},
|
|
@@ -45781,14 +45897,14 @@ var require_structured_logging = __commonJS({
|
|
|
45781
45897
|
*/
|
|
45782
45898
|
daemonStarted(metadata) {
|
|
45783
45899
|
return {
|
|
45784
|
-
type: "
|
|
45900
|
+
type: "daemon:started",
|
|
45785
45901
|
time: Date.now(),
|
|
45786
45902
|
source: "daemon",
|
|
45787
45903
|
context: {
|
|
45788
45904
|
sessionId: ""
|
|
45789
45905
|
},
|
|
45790
45906
|
payload: {
|
|
45791
|
-
metadata
|
|
45907
|
+
startupDurationMs: metadata.startupDurationMs
|
|
45792
45908
|
}
|
|
45793
45909
|
};
|
|
45794
45910
|
},
|
|
@@ -45797,14 +45913,14 @@ var require_structured_logging = __commonJS({
|
|
|
45797
45913
|
*/
|
|
45798
45914
|
ipcServerStarted(metadata) {
|
|
45799
45915
|
return {
|
|
45800
|
-
type: "
|
|
45916
|
+
type: "ipc:started",
|
|
45801
45917
|
time: Date.now(),
|
|
45802
45918
|
source: "daemon",
|
|
45803
45919
|
context: {
|
|
45804
45920
|
sessionId: ""
|
|
45805
45921
|
},
|
|
45806
45922
|
payload: {
|
|
45807
|
-
metadata
|
|
45923
|
+
socketPath: metadata.socketPath
|
|
45808
45924
|
}
|
|
45809
45925
|
};
|
|
45810
45926
|
},
|
|
@@ -45813,14 +45929,15 @@ var require_structured_logging = __commonJS({
|
|
|
45813
45929
|
*/
|
|
45814
45930
|
configWatcherStarted(metadata) {
|
|
45815
45931
|
return {
|
|
45816
|
-
type: "
|
|
45932
|
+
type: "config:watcher-started",
|
|
45817
45933
|
time: Date.now(),
|
|
45818
45934
|
source: "daemon",
|
|
45819
45935
|
context: {
|
|
45820
45936
|
sessionId: ""
|
|
45821
45937
|
},
|
|
45822
45938
|
payload: {
|
|
45823
|
-
metadata
|
|
45939
|
+
projectDir: metadata.projectDir,
|
|
45940
|
+
watchedFiles: metadata.watchedFiles
|
|
45824
45941
|
}
|
|
45825
45942
|
};
|
|
45826
45943
|
},
|
|
@@ -45829,14 +45946,14 @@ var require_structured_logging = __commonJS({
|
|
|
45829
45946
|
*/
|
|
45830
45947
|
sessionEvictionStarted(metadata) {
|
|
45831
45948
|
return {
|
|
45832
|
-
type: "
|
|
45949
|
+
type: "session:eviction-started",
|
|
45833
45950
|
time: Date.now(),
|
|
45834
45951
|
source: "daemon",
|
|
45835
45952
|
context: {
|
|
45836
45953
|
sessionId: ""
|
|
45837
45954
|
},
|
|
45838
45955
|
payload: {
|
|
45839
|
-
metadata
|
|
45956
|
+
intervalMs: metadata.intervalMs
|
|
45840
45957
|
}
|
|
45841
45958
|
};
|
|
45842
45959
|
},
|
|
@@ -45847,7 +45964,7 @@ var require_structured_logging = __commonJS({
|
|
|
45847
45964
|
*/
|
|
45848
45965
|
statuslineRendered(context, state, metadata) {
|
|
45849
45966
|
return {
|
|
45850
|
-
type: "
|
|
45967
|
+
type: "statusline:rendered",
|
|
45851
45968
|
time: Date.now(),
|
|
45852
45969
|
source: "cli",
|
|
45853
45970
|
context: {
|
|
@@ -45858,8 +45975,11 @@ var require_structured_logging = __commonJS({
|
|
|
45858
45975
|
taskId: context.taskId
|
|
45859
45976
|
},
|
|
45860
45977
|
payload: {
|
|
45861
|
-
state,
|
|
45862
|
-
|
|
45978
|
+
displayMode: state.displayMode,
|
|
45979
|
+
staleData: state.staleData,
|
|
45980
|
+
model: metadata.model,
|
|
45981
|
+
tokens: metadata.tokens,
|
|
45982
|
+
durationMs: metadata.durationMs
|
|
45863
45983
|
}
|
|
45864
45984
|
};
|
|
45865
45985
|
},
|
|
@@ -45869,7 +45989,7 @@ var require_structured_logging = __commonJS({
|
|
|
45869
45989
|
*/
|
|
45870
45990
|
statuslineError(context, reason, metadata) {
|
|
45871
45991
|
return {
|
|
45872
|
-
type: "
|
|
45992
|
+
type: "statusline:error",
|
|
45873
45993
|
time: Date.now(),
|
|
45874
45994
|
source: "cli",
|
|
45875
45995
|
context: {
|
|
@@ -45881,7 +46001,9 @@ var require_structured_logging = __commonJS({
|
|
|
45881
46001
|
},
|
|
45882
46002
|
payload: {
|
|
45883
46003
|
reason,
|
|
45884
|
-
metadata
|
|
46004
|
+
file: metadata.file,
|
|
46005
|
+
fallbackUsed: metadata.fallbackUsed,
|
|
46006
|
+
error: metadata.error
|
|
45885
46007
|
}
|
|
45886
46008
|
};
|
|
45887
46009
|
},
|
|
@@ -45892,7 +46014,7 @@ var require_structured_logging = __commonJS({
|
|
|
45892
46014
|
*/
|
|
45893
46015
|
resumeGenerating(context, metadata) {
|
|
45894
46016
|
return {
|
|
45895
|
-
type: "
|
|
46017
|
+
type: "resume-message:start",
|
|
45896
46018
|
time: Date.now(),
|
|
45897
46019
|
source: "daemon",
|
|
45898
46020
|
context: {
|
|
@@ -45903,8 +46025,8 @@ var require_structured_logging = __commonJS({
|
|
|
45903
46025
|
taskId: context.taskId
|
|
45904
46026
|
},
|
|
45905
46027
|
payload: {
|
|
45906
|
-
metadata,
|
|
45907
|
-
|
|
46028
|
+
title_confidence: metadata.title_confidence,
|
|
46029
|
+
intent_confidence: metadata.intent_confidence
|
|
45908
46030
|
}
|
|
45909
46031
|
};
|
|
45910
46032
|
},
|
|
@@ -45914,7 +46036,7 @@ var require_structured_logging = __commonJS({
|
|
|
45914
46036
|
*/
|
|
45915
46037
|
resumeUpdated(context, state) {
|
|
45916
46038
|
return {
|
|
45917
|
-
type: "
|
|
46039
|
+
type: "resume-message:finish",
|
|
45918
46040
|
time: Date.now(),
|
|
45919
46041
|
source: "daemon",
|
|
45920
46042
|
context: {
|
|
@@ -45925,8 +46047,8 @@ var require_structured_logging = __commonJS({
|
|
|
45925
46047
|
taskId: context.taskId
|
|
45926
46048
|
},
|
|
45927
46049
|
payload: {
|
|
45928
|
-
state,
|
|
45929
|
-
|
|
46050
|
+
snarky_comment: state.snarky_comment,
|
|
46051
|
+
timestamp: state.timestamp
|
|
45930
46052
|
}
|
|
45931
46053
|
};
|
|
45932
46054
|
},
|
|
@@ -45936,7 +46058,7 @@ var require_structured_logging = __commonJS({
|
|
|
45936
46058
|
*/
|
|
45937
46059
|
resumeSkipped(context, metadata, reason) {
|
|
45938
46060
|
return {
|
|
45939
|
-
type: "
|
|
46061
|
+
type: "resume-message:skipped",
|
|
45940
46062
|
time: Date.now(),
|
|
45941
46063
|
source: "daemon",
|
|
45942
46064
|
context: {
|
|
@@ -45947,11 +46069,50 @@ var require_structured_logging = __commonJS({
|
|
|
45947
46069
|
taskId: context.taskId
|
|
45948
46070
|
},
|
|
45949
46071
|
payload: {
|
|
45950
|
-
metadata,
|
|
46072
|
+
title_confidence: metadata.title_confidence,
|
|
46073
|
+
intent_confidence: metadata.intent_confidence,
|
|
46074
|
+
min_confidence: metadata.min_confidence,
|
|
45951
46075
|
reason
|
|
45952
46076
|
}
|
|
45953
46077
|
};
|
|
45954
46078
|
},
|
|
46079
|
+
// --- Persona Events ---
|
|
46080
|
+
/**
|
|
46081
|
+
* Create a PersonaSelected event (logged when a persona is selected for a session).
|
|
46082
|
+
*/
|
|
46083
|
+
personaSelected(context, payload) {
|
|
46084
|
+
return {
|
|
46085
|
+
type: "persona:selected",
|
|
46086
|
+
time: Date.now(),
|
|
46087
|
+
source: "daemon",
|
|
46088
|
+
context: {
|
|
46089
|
+
sessionId: context.sessionId,
|
|
46090
|
+
correlationId: context.correlationId,
|
|
46091
|
+
traceId: context.traceId,
|
|
46092
|
+
hook: context.hook,
|
|
46093
|
+
taskId: context.taskId
|
|
46094
|
+
},
|
|
46095
|
+
payload
|
|
46096
|
+
};
|
|
46097
|
+
},
|
|
46098
|
+
/**
|
|
46099
|
+
* Create a PersonaChanged event (logged when persona changes mid-session).
|
|
46100
|
+
*/
|
|
46101
|
+
personaChanged(context, payload) {
|
|
46102
|
+
return {
|
|
46103
|
+
type: "persona:changed",
|
|
46104
|
+
time: Date.now(),
|
|
46105
|
+
source: "daemon",
|
|
46106
|
+
context: {
|
|
46107
|
+
sessionId: context.sessionId,
|
|
46108
|
+
correlationId: context.correlationId,
|
|
46109
|
+
traceId: context.traceId,
|
|
46110
|
+
hook: context.hook,
|
|
46111
|
+
taskId: context.taskId
|
|
46112
|
+
},
|
|
46113
|
+
payload
|
|
46114
|
+
};
|
|
46115
|
+
},
|
|
45955
46116
|
// --- Transcript Events (logged to transcript-events.log) ---
|
|
45956
46117
|
/**
|
|
45957
46118
|
* Create a TranscriptEventEmitted event (logged when TranscriptService emits an event).
|
|
@@ -45959,7 +46120,7 @@ var require_structured_logging = __commonJS({
|
|
|
45959
46120
|
*/
|
|
45960
46121
|
transcriptEventEmitted(context, state, metadata) {
|
|
45961
46122
|
return {
|
|
45962
|
-
type: "
|
|
46123
|
+
type: "transcript:emitted",
|
|
45963
46124
|
time: Date.now(),
|
|
45964
46125
|
source: "transcript",
|
|
45965
46126
|
context: {
|
|
@@ -45970,8 +46131,13 @@ var require_structured_logging = __commonJS({
|
|
|
45970
46131
|
taskId: context.taskId
|
|
45971
46132
|
},
|
|
45972
46133
|
payload: {
|
|
45973
|
-
state,
|
|
45974
|
-
|
|
46134
|
+
eventType: state.eventType,
|
|
46135
|
+
lineNumber: state.lineNumber,
|
|
46136
|
+
uuid: state.uuid,
|
|
46137
|
+
toolName: state.toolName,
|
|
46138
|
+
transcriptPath: metadata.transcriptPath,
|
|
46139
|
+
contentPreview: metadata.contentPreview,
|
|
46140
|
+
metrics: metadata.metrics
|
|
45975
46141
|
}
|
|
45976
46142
|
};
|
|
45977
46143
|
},
|
|
@@ -45981,7 +46147,7 @@ var require_structured_logging = __commonJS({
|
|
|
45981
46147
|
*/
|
|
45982
46148
|
preCompactCaptured(context, state, metadata) {
|
|
45983
46149
|
return {
|
|
45984
|
-
type: "
|
|
46150
|
+
type: "transcript:pre-compact",
|
|
45985
46151
|
time: Date.now(),
|
|
45986
46152
|
source: "transcript",
|
|
45987
46153
|
context: {
|
|
@@ -45992,18 +46158,67 @@ var require_structured_logging = __commonJS({
|
|
|
45992
46158
|
taskId: context.taskId
|
|
45993
46159
|
},
|
|
45994
46160
|
payload: {
|
|
45995
|
-
state,
|
|
45996
|
-
|
|
45997
|
-
|
|
46161
|
+
snapshotPath: state.snapshotPath,
|
|
46162
|
+
lineCount: state.lineCount,
|
|
46163
|
+
transcriptPath: metadata.transcriptPath,
|
|
46164
|
+
metrics: metadata.metrics
|
|
46165
|
+
}
|
|
46166
|
+
};
|
|
46167
|
+
},
|
|
46168
|
+
// --- Error Events ---
|
|
46169
|
+
/**
|
|
46170
|
+
* Create a daemon ErrorOccurred event.
|
|
46171
|
+
* @see packages/sidekick-daemon/src/daemon.ts — HookableLogger error hook calls this factory.
|
|
46172
|
+
*/
|
|
46173
|
+
daemonErrorOccurred(context, state) {
|
|
46174
|
+
return {
|
|
46175
|
+
type: "error:occurred",
|
|
46176
|
+
time: Date.now(),
|
|
46177
|
+
source: "daemon",
|
|
46178
|
+
context: {
|
|
46179
|
+
sessionId: context.sessionId,
|
|
46180
|
+
correlationId: context.correlationId,
|
|
46181
|
+
traceId: context.traceId,
|
|
46182
|
+
hook: context.hook,
|
|
46183
|
+
taskId: context.taskId
|
|
46184
|
+
},
|
|
46185
|
+
payload: {
|
|
46186
|
+
errorMessage: state.errorMessage,
|
|
46187
|
+
errorStack: state.errorStack
|
|
46188
|
+
}
|
|
46189
|
+
};
|
|
46190
|
+
},
|
|
46191
|
+
/**
|
|
46192
|
+
* Create a CLI ErrorOccurred event.
|
|
46193
|
+
* Available for CLI error hook implementations.
|
|
46194
|
+
*/
|
|
46195
|
+
cliErrorOccurred(context, state) {
|
|
46196
|
+
return {
|
|
46197
|
+
type: "error:occurred",
|
|
46198
|
+
time: Date.now(),
|
|
46199
|
+
source: "cli",
|
|
46200
|
+
context: {
|
|
46201
|
+
sessionId: context.sessionId,
|
|
46202
|
+
correlationId: context.correlationId,
|
|
46203
|
+
traceId: context.traceId,
|
|
46204
|
+
hook: context.hook,
|
|
46205
|
+
taskId: context.taskId
|
|
46206
|
+
},
|
|
46207
|
+
payload: {
|
|
46208
|
+
errorMessage: state.errorMessage,
|
|
46209
|
+
errorStack: state.errorStack
|
|
45998
46210
|
}
|
|
45999
46211
|
};
|
|
46000
46212
|
}
|
|
46001
46213
|
};
|
|
46002
46214
|
function logEvent(logger, event) {
|
|
46003
|
-
|
|
46215
|
+
const payload = event.payload;
|
|
46216
|
+
const meta = payload != null && typeof payload === "object" ? payload : {};
|
|
46217
|
+
const reason = "reason" in meta ? String(meta.reason) : void 0;
|
|
46218
|
+
logger.info(reason ?? `${event.type}`, {
|
|
46004
46219
|
type: event.type,
|
|
46005
46220
|
source: event.source,
|
|
46006
|
-
...
|
|
46221
|
+
...meta
|
|
46007
46222
|
});
|
|
46008
46223
|
}
|
|
46009
46224
|
function setupGlobalErrorHandlers(logger) {
|
|
@@ -58040,7 +58255,7 @@ var require_staging_service = __commonJS({
|
|
|
58040
58255
|
*
|
|
58041
58256
|
* @throws Error if hookName or reminderName contain path traversal characters
|
|
58042
58257
|
*/
|
|
58043
|
-
async stageReminder(sessionId, hookName, reminderName, data) {
|
|
58258
|
+
async stageReminder(sessionId, hookName, reminderName, data, enrichment) {
|
|
58044
58259
|
(0, staging_paths_js_1.validatePathSegment)(hookName, "hookName");
|
|
58045
58260
|
(0, staging_paths_js_1.validatePathSegment)(reminderName, "reminderName");
|
|
58046
58261
|
const hookDir = this.getHookDirPath(sessionId, hookName);
|
|
@@ -58069,7 +58284,8 @@ var require_staging_service = __commonJS({
|
|
|
58069
58284
|
hookName,
|
|
58070
58285
|
blocking: data.blocking,
|
|
58071
58286
|
priority: data.priority,
|
|
58072
|
-
persistent: data.persistent
|
|
58287
|
+
persistent: data.persistent,
|
|
58288
|
+
...enrichment
|
|
58073
58289
|
}, { stagingPath: reminderPath });
|
|
58074
58290
|
(0, structured_logging_1.logEvent)(this.options.logger, event);
|
|
58075
58291
|
}
|
|
@@ -58213,8 +58429,8 @@ var require_staging_service = __commonJS({
|
|
|
58213
58429
|
// ============================================================================
|
|
58214
58430
|
// StagingService Interface Implementation (delegates to core)
|
|
58215
58431
|
// ============================================================================
|
|
58216
|
-
async stageReminder(hookName, reminderName, data) {
|
|
58217
|
-
return this.core.stageReminder(this.sessionId, hookName, reminderName, data);
|
|
58432
|
+
async stageReminder(hookName, reminderName, data, enrichment) {
|
|
58433
|
+
return this.core.stageReminder(this.sessionId, hookName, reminderName, data, enrichment);
|
|
58218
58434
|
}
|
|
58219
58435
|
async readReminder(hookName, reminderName) {
|
|
58220
58436
|
return this.core.readReminder(this.sessionId, hookName, reminderName);
|
|
@@ -61136,7 +61352,7 @@ var require_log_metrics_descriptors = __commonJS({
|
|
|
61136
61352
|
});
|
|
61137
61353
|
|
|
61138
61354
|
// ../sidekick-core/dist/state/index.js
|
|
61139
|
-
var
|
|
61355
|
+
var require_state3 = __commonJS({
|
|
61140
61356
|
"../sidekick-core/dist/state/index.js"(exports2) {
|
|
61141
61357
|
"use strict";
|
|
61142
61358
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
@@ -61235,7 +61451,7 @@ var require_transcript_service = __commonJS({
|
|
|
61235
61451
|
var node_readline_12 = require("node:readline");
|
|
61236
61452
|
var node_path_1 = require("node:path");
|
|
61237
61453
|
var structured_logging_js_1 = require_structured_logging();
|
|
61238
|
-
var index_js_1 =
|
|
61454
|
+
var index_js_1 = require_state3();
|
|
61239
61455
|
var EXCLUDED_BUILTIN_COMMANDS = /* @__PURE__ */ new Set([
|
|
61240
61456
|
"/add-dir",
|
|
61241
61457
|
"/agents",
|
|
@@ -63205,6 +63421,120 @@ var require_hookable_logger = __commonJS({
|
|
|
63205
63421
|
}
|
|
63206
63422
|
});
|
|
63207
63423
|
|
|
63424
|
+
// ../sidekick-core/dist/project-registry.js
|
|
63425
|
+
var require_project_registry = __commonJS({
|
|
63426
|
+
"../sidekick-core/dist/project-registry.js"(exports2) {
|
|
63427
|
+
"use strict";
|
|
63428
|
+
var __importDefault2 = exports2 && exports2.__importDefault || function(mod) {
|
|
63429
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
63430
|
+
};
|
|
63431
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
63432
|
+
exports2.ProjectRegistryService = void 0;
|
|
63433
|
+
exports2.encodeProjectDir = encodeProjectDir;
|
|
63434
|
+
var node_fs_1 = require("node:fs");
|
|
63435
|
+
var promises_12 = __importDefault2(require("node:fs/promises"));
|
|
63436
|
+
var node_crypto_1 = require("node:crypto");
|
|
63437
|
+
var node_path_1 = require("node:path");
|
|
63438
|
+
var types_1 = require_dist();
|
|
63439
|
+
function encodeProjectDir(absPath) {
|
|
63440
|
+
return absPath.replace(/\//g, "-");
|
|
63441
|
+
}
|
|
63442
|
+
var REGISTRY_FILE = "registry.json";
|
|
63443
|
+
var ProjectRegistryService = class {
|
|
63444
|
+
registryRoot;
|
|
63445
|
+
constructor(registryRoot) {
|
|
63446
|
+
this.registryRoot = registryRoot;
|
|
63447
|
+
}
|
|
63448
|
+
/**
|
|
63449
|
+
* Register or update a project in the registry.
|
|
63450
|
+
* Creates the directory and writes registry.json with current timestamp.
|
|
63451
|
+
*/
|
|
63452
|
+
async register(projectDir) {
|
|
63453
|
+
const encoded = encodeProjectDir(projectDir);
|
|
63454
|
+
const entryDir = (0, node_path_1.join)(this.registryRoot, encoded);
|
|
63455
|
+
const entryFile = (0, node_path_1.join)(entryDir, REGISTRY_FILE);
|
|
63456
|
+
await promises_12.default.mkdir(entryDir, { recursive: true });
|
|
63457
|
+
const entry = {
|
|
63458
|
+
path: projectDir,
|
|
63459
|
+
displayName: (0, node_path_1.basename)(projectDir),
|
|
63460
|
+
lastActive: (/* @__PURE__ */ new Date()).toISOString()
|
|
63461
|
+
};
|
|
63462
|
+
const tmpPath = `${entryFile}.${(0, node_crypto_1.randomBytes)(6).toString("hex")}.tmp`;
|
|
63463
|
+
try {
|
|
63464
|
+
await promises_12.default.writeFile(tmpPath, JSON.stringify(entry, null, 2), "utf-8");
|
|
63465
|
+
await promises_12.default.rename(tmpPath, entryFile);
|
|
63466
|
+
} catch (err) {
|
|
63467
|
+
await promises_12.default.unlink(tmpPath).catch(() => {
|
|
63468
|
+
});
|
|
63469
|
+
throw err;
|
|
63470
|
+
}
|
|
63471
|
+
}
|
|
63472
|
+
/**
|
|
63473
|
+
* List all valid registered projects.
|
|
63474
|
+
* Skips entries with missing/invalid registry.json.
|
|
63475
|
+
*/
|
|
63476
|
+
async list() {
|
|
63477
|
+
if (!(0, node_fs_1.existsSync)(this.registryRoot)) {
|
|
63478
|
+
return [];
|
|
63479
|
+
}
|
|
63480
|
+
const entries = [];
|
|
63481
|
+
const dirents = await promises_12.default.readdir(this.registryRoot, { withFileTypes: true });
|
|
63482
|
+
for (const dirent of dirents) {
|
|
63483
|
+
if (!dirent.isDirectory())
|
|
63484
|
+
continue;
|
|
63485
|
+
const entryFile = (0, node_path_1.join)(this.registryRoot, dirent.name, REGISTRY_FILE);
|
|
63486
|
+
try {
|
|
63487
|
+
const raw = await promises_12.default.readFile(entryFile, "utf-8");
|
|
63488
|
+
const parsed = types_1.ProjectRegistryEntrySchema.parse(JSON.parse(raw));
|
|
63489
|
+
entries.push(parsed);
|
|
63490
|
+
} catch {
|
|
63491
|
+
}
|
|
63492
|
+
}
|
|
63493
|
+
return entries;
|
|
63494
|
+
}
|
|
63495
|
+
/**
|
|
63496
|
+
* Prune stale registry entries.
|
|
63497
|
+
* Removes entries where the project path no longer exists
|
|
63498
|
+
* or lastActive is older than retentionDays.
|
|
63499
|
+
*/
|
|
63500
|
+
async prune(options) {
|
|
63501
|
+
if (!(0, node_fs_1.existsSync)(this.registryRoot)) {
|
|
63502
|
+
return [];
|
|
63503
|
+
}
|
|
63504
|
+
const pruned = [];
|
|
63505
|
+
const cutoff = Date.now() - options.retentionDays * 24 * 60 * 60 * 1e3;
|
|
63506
|
+
const dirents = await promises_12.default.readdir(this.registryRoot, { withFileTypes: true });
|
|
63507
|
+
for (const dirent of dirents) {
|
|
63508
|
+
if (!dirent.isDirectory())
|
|
63509
|
+
continue;
|
|
63510
|
+
const entryDir = (0, node_path_1.join)(this.registryRoot, dirent.name);
|
|
63511
|
+
const entryFile = (0, node_path_1.join)(entryDir, REGISTRY_FILE);
|
|
63512
|
+
let entry;
|
|
63513
|
+
try {
|
|
63514
|
+
const raw = await promises_12.default.readFile(entryFile, "utf-8");
|
|
63515
|
+
entry = types_1.ProjectRegistryEntrySchema.parse(JSON.parse(raw));
|
|
63516
|
+
} catch {
|
|
63517
|
+
await promises_12.default.rm(entryDir, { recursive: true, force: true });
|
|
63518
|
+
continue;
|
|
63519
|
+
}
|
|
63520
|
+
let reason = null;
|
|
63521
|
+
if (!(0, node_fs_1.existsSync)(entry.path)) {
|
|
63522
|
+
reason = "path-missing";
|
|
63523
|
+
} else if (new Date(entry.lastActive).getTime() < cutoff) {
|
|
63524
|
+
reason = "age-exceeded";
|
|
63525
|
+
}
|
|
63526
|
+
if (reason) {
|
|
63527
|
+
await promises_12.default.rm(entryDir, { recursive: true, force: true });
|
|
63528
|
+
pruned.push({ path: entry.path, reason });
|
|
63529
|
+
}
|
|
63530
|
+
}
|
|
63531
|
+
return pruned;
|
|
63532
|
+
}
|
|
63533
|
+
};
|
|
63534
|
+
exports2.ProjectRegistryService = ProjectRegistryService;
|
|
63535
|
+
}
|
|
63536
|
+
});
|
|
63537
|
+
|
|
63208
63538
|
// ../sidekick-core/dist/daemon-health.js
|
|
63209
63539
|
var require_daemon_health = __commonJS({
|
|
63210
63540
|
"../sidekick-core/dist/daemon-health.js"(exports2) {
|
|
@@ -63448,7 +63778,7 @@ var require_dist4 = __commonJS({
|
|
|
63448
63778
|
};
|
|
63449
63779
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
63450
63780
|
exports2.SIDEKICK_SECTION_START = exports2.detectGitignoreStatus = exports2.removeGitignoreSection = exports2.installGitignoreSection = exports2.validateOpenAIKey = exports2.validateOpenRouterKey = exports2.createSetupStatusService = exports2.SetupStatusService = exports2.DaemonClient = exports2.findZombieDaemons = exports2.killZombieDaemons = exports2.killAllDaemons = exports2.logEvent = exports2.LogEvents = exports2.DEFAULT_MAX_FILES = exports2.DEFAULT_ROTATE_SIZE_BYTES = exports2.getComponentLogLevel = exports2.setupGlobalErrorHandlers = exports2.createLoggerFacade = exports2.createLogManager = exports2.createConsoleLogger = exports2.getUserDaemonsDir = exports2.getUserPidPath = exports2.getTokenPath = exports2.getSocketPath = exports2.getProjectHash = exports2.getPidPath = exports2.getLockPath = exports2.IpcService = exports2.IpcServer = exports2.loadPersonaFile = exports2.getDefaultPersonasDir = exports2.discoverPersonas = exports2.createPersonaLoader = exports2.reconstructTranscriptPath = exports2.encodeProjectPath = exports2.isPreCompactEvent = exports2.isStopEvent = exports2.isPostToolUseEvent = exports2.isPreToolUseEvent = exports2.isUserPromptSubmitEvent = exports2.isSessionEndEvent = exports2.isSessionStartEvent = exports2.isTranscriptEvent = exports2.isHookEvent = exports2.MetricsPersistPayloadSchema = exports2.CleanupPayloadSchema = exports2.ResumeGenerationPayloadSchema = exports2.SessionSummaryPayloadSchema = exports2.TaskTypes = void 0;
|
|
63451
|
-
exports2.loadUserProfile = exports2.parseGitStatusOutput = exports2.getGitFileStatus = exports2.isInSandbox = exports2.updateDaemonHealth = exports2.readDaemonHealth = exports2.DaemonGlobalLogMetricsDescriptor = exports2.CliLogMetricsDescriptor = exports2.DaemonLogMetricsDescriptor = exports2.CompactionHistoryDescriptor = exports2.TranscriptMetricsDescriptor = exports2.GlobalStateAccessor = exports2.SessionStateAccessor = exports2.globalState = exports2.sessionState = exports2.StateCorruptError = exports2.StateNotFoundError = exports2.StateService = exports2.createHookableLogger = exports2.InstrumentedProfileProviderFactory = exports2.InstrumentedLLMProvider = exports2.ServiceFactoryImpl = exports2.TranscriptServiceImpl = exports2.createDefaultTokenUsage = exports2.createDefaultMetrics = exports2.copyWithTimestampSync = exports2.renameWithTimestampSync = exports2.renameWithTimestamp = exports2.copyWithTimestamp = exports2.getTimestampedPath = exports2.extractToolResultPreview = exports2.extractToolCallPreview = exports2.extractTextFromContent = exports2.extractContentPreview = exports2.HandlerRegistryImpl = exports2.extractConsumedTimestamp = exports2.createConsumedFilePattern = exports2.CONSUMED_FILE_PATTERN = exports2.filterActiveReminderFiles = exports2.validatePathSegment = exports2.isValidPathSegment = exports2.getReminderPath = exports2.getHookDir = exports2.getStagingRoot = exports2.SessionScopedStagingService = exports2.StagingServiceCore = exports2.GITIGNORE_ENTRIES = exports2.SIDEKICK_SECTION_END = void 0;
|
|
63781
|
+
exports2.loadUserProfile = exports2.parseGitStatusOutput = exports2.getGitFileStatus = exports2.isInSandbox = exports2.updateDaemonHealth = exports2.readDaemonHealth = exports2.ProjectRegistryService = exports2.encodeProjectDir = exports2.DaemonGlobalLogMetricsDescriptor = exports2.CliLogMetricsDescriptor = exports2.DaemonLogMetricsDescriptor = exports2.CompactionHistoryDescriptor = exports2.TranscriptMetricsDescriptor = exports2.GlobalStateAccessor = exports2.SessionStateAccessor = exports2.globalState = exports2.sessionState = exports2.StateCorruptError = exports2.StateNotFoundError = exports2.StateService = exports2.createHookableLogger = exports2.InstrumentedProfileProviderFactory = exports2.InstrumentedLLMProvider = exports2.ServiceFactoryImpl = exports2.TranscriptServiceImpl = exports2.createDefaultTokenUsage = exports2.createDefaultMetrics = exports2.copyWithTimestampSync = exports2.renameWithTimestampSync = exports2.renameWithTimestamp = exports2.copyWithTimestamp = exports2.getTimestampedPath = exports2.extractToolResultPreview = exports2.extractToolCallPreview = exports2.extractTextFromContent = exports2.extractContentPreview = exports2.HandlerRegistryImpl = exports2.extractConsumedTimestamp = exports2.createConsumedFilePattern = exports2.CONSUMED_FILE_PATTERN = exports2.filterActiveReminderFiles = exports2.validatePathSegment = exports2.isValidPathSegment = exports2.getReminderPath = exports2.getHookDir = exports2.getStagingRoot = exports2.SessionScopedStagingService = exports2.StagingServiceCore = exports2.GITIGNORE_ENTRIES = exports2.SIDEKICK_SECTION_END = void 0;
|
|
63452
63782
|
var types_1 = require_dist();
|
|
63453
63783
|
Object.defineProperty(exports2, "TaskTypes", { enumerable: true, get: function() {
|
|
63454
63784
|
return types_1.TaskTypes;
|
|
@@ -63721,7 +64051,7 @@ var require_dist4 = __commonJS({
|
|
|
63721
64051
|
Object.defineProperty(exports2, "createHookableLogger", { enumerable: true, get: function() {
|
|
63722
64052
|
return hookable_logger_1.createHookableLogger;
|
|
63723
64053
|
} });
|
|
63724
|
-
var index_js_1 =
|
|
64054
|
+
var index_js_1 = require_state3();
|
|
63725
64055
|
Object.defineProperty(exports2, "StateService", { enumerable: true, get: function() {
|
|
63726
64056
|
return index_js_1.StateService;
|
|
63727
64057
|
} });
|
|
@@ -63758,6 +64088,13 @@ var require_dist4 = __commonJS({
|
|
|
63758
64088
|
Object.defineProperty(exports2, "DaemonGlobalLogMetricsDescriptor", { enumerable: true, get: function() {
|
|
63759
64089
|
return index_js_1.DaemonGlobalLogMetricsDescriptor;
|
|
63760
64090
|
} });
|
|
64091
|
+
var project_registry_1 = require_project_registry();
|
|
64092
|
+
Object.defineProperty(exports2, "encodeProjectDir", { enumerable: true, get: function() {
|
|
64093
|
+
return project_registry_1.encodeProjectDir;
|
|
64094
|
+
} });
|
|
64095
|
+
Object.defineProperty(exports2, "ProjectRegistryService", { enumerable: true, get: function() {
|
|
64096
|
+
return project_registry_1.ProjectRegistryService;
|
|
64097
|
+
} });
|
|
63761
64098
|
var daemon_health_1 = require_daemon_health();
|
|
63762
64099
|
Object.defineProperty(exports2, "readDaemonHealth", { enumerable: true, get: function() {
|
|
63763
64100
|
return daemon_health_1.readDaemonHealth;
|
|
@@ -70982,7 +71319,6 @@ var require_reminder_utils = __commonJS({
|
|
|
70982
71319
|
blocking: zod_1.z.boolean(),
|
|
70983
71320
|
priority: zod_1.z.number(),
|
|
70984
71321
|
persistent: zod_1.z.boolean(),
|
|
70985
|
-
throttle: zod_1.z.boolean().optional(),
|
|
70986
71322
|
userMessage: zod_1.z.string().optional(),
|
|
70987
71323
|
additionalContext: zod_1.z.string().optional(),
|
|
70988
71324
|
reason: zod_1.z.string().optional()
|
|
@@ -71033,7 +71369,6 @@ var require_reminder_utils = __commonJS({
|
|
|
71033
71369
|
blocking: def.blocking,
|
|
71034
71370
|
priority: def.priority,
|
|
71035
71371
|
persistent: def.persistent,
|
|
71036
|
-
throttle: def.throttle,
|
|
71037
71372
|
userMessage: def.userMessage ? interpolateTemplate(def.userMessage, context) : void 0,
|
|
71038
71373
|
additionalContext: def.additionalContext ? interpolateTemplate(def.additionalContext, context) : void 0,
|
|
71039
71374
|
reason: def.reason ? interpolateTemplate(def.reason, context) : void 0
|
|
@@ -71043,8 +71378,8 @@ var require_reminder_utils = __commonJS({
|
|
|
71043
71378
|
return null;
|
|
71044
71379
|
}
|
|
71045
71380
|
}
|
|
71046
|
-
async function stageReminder(ctx, hookName, reminder) {
|
|
71047
|
-
await ctx.staging.stageReminder(hookName, reminder.name, reminder);
|
|
71381
|
+
async function stageReminder(ctx, hookName, reminder, enrichment) {
|
|
71382
|
+
await ctx.staging.stageReminder(hookName, reminder.name, reminder, enrichment);
|
|
71048
71383
|
ctx.logger.debug("Staged reminder", { hookName, reminderName: reminder.name, priority: reminder.priority });
|
|
71049
71384
|
}
|
|
71050
71385
|
async function consumeReminder(ctx, hookName) {
|
|
@@ -71358,7 +71693,7 @@ var require_types2 = __commonJS({
|
|
|
71358
71693
|
});
|
|
71359
71694
|
|
|
71360
71695
|
// ../feature-reminders/dist/state.js
|
|
71361
|
-
var
|
|
71696
|
+
var require_state4 = __commonJS({
|
|
71362
71697
|
"../feature-reminders/dist/state.js"(exports2) {
|
|
71363
71698
|
"use strict";
|
|
71364
71699
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
@@ -71399,7 +71734,7 @@ var require_throttle_utils = __commonJS({
|
|
|
71399
71734
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
71400
71735
|
exports2.registerThrottledReminder = registerThrottledReminder;
|
|
71401
71736
|
exports2.resetThrottleCounters = resetThrottleCounters;
|
|
71402
|
-
var state_js_1 =
|
|
71737
|
+
var state_js_1 = require_state4();
|
|
71403
71738
|
async function registerThrottledReminder(ctx, sessionId, reminderId, targetHook, resolvedReminder) {
|
|
71404
71739
|
const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
|
|
71405
71740
|
const result = await remindersState.reminderThrottle.read(sessionId);
|
|
@@ -71434,7 +71769,7 @@ var require_stage_default_user_prompt = __commonJS({
|
|
|
71434
71769
|
var staging_handler_utils_js_1 = require_staging_handler_utils();
|
|
71435
71770
|
var types_js_1 = require_types2();
|
|
71436
71771
|
var reminder_utils_js_1 = require_reminder_utils();
|
|
71437
|
-
var state_js_1 =
|
|
71772
|
+
var state_js_1 = require_state4();
|
|
71438
71773
|
var throttle_utils_js_1 = require_throttle_utils();
|
|
71439
71774
|
function registerStageDefaultUserPrompt(context) {
|
|
71440
71775
|
(0, staging_handler_utils_js_1.createStagingHandler)(context, {
|
|
@@ -71590,16 +71925,128 @@ var require_stage_default_user_prompt = __commonJS({
|
|
|
71590
71925
|
}
|
|
71591
71926
|
});
|
|
71592
71927
|
|
|
71928
|
+
// ../feature-reminders/dist/events.js
|
|
71929
|
+
var require_events2 = __commonJS({
|
|
71930
|
+
"../feature-reminders/dist/events.js"(exports2) {
|
|
71931
|
+
"use strict";
|
|
71932
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
71933
|
+
exports2.ReminderEvents = void 0;
|
|
71934
|
+
exports2.ReminderEvents = {
|
|
71935
|
+
/**
|
|
71936
|
+
* Create a ReminderConsumed event (logged when CLI returns a staged reminder).
|
|
71937
|
+
*/
|
|
71938
|
+
reminderConsumed(context, state, _metadata) {
|
|
71939
|
+
return {
|
|
71940
|
+
type: "reminder:consumed",
|
|
71941
|
+
time: Date.now(),
|
|
71942
|
+
source: "cli",
|
|
71943
|
+
context: {
|
|
71944
|
+
sessionId: context.sessionId,
|
|
71945
|
+
correlationId: context.correlationId,
|
|
71946
|
+
traceId: context.traceId,
|
|
71947
|
+
hook: context.hook,
|
|
71948
|
+
taskId: context.taskId
|
|
71949
|
+
},
|
|
71950
|
+
payload: {
|
|
71951
|
+
reminderName: state.reminderName,
|
|
71952
|
+
reminderReturned: state.reminderReturned,
|
|
71953
|
+
blocking: state.blocking,
|
|
71954
|
+
priority: state.priority,
|
|
71955
|
+
persistent: state.persistent,
|
|
71956
|
+
...state.classificationResult !== void 0 && {
|
|
71957
|
+
classificationResult: state.classificationResult
|
|
71958
|
+
}
|
|
71959
|
+
}
|
|
71960
|
+
};
|
|
71961
|
+
},
|
|
71962
|
+
// Note: reminderStaged stays in @sidekick/core (used by staging-service.ts, circular dep)
|
|
71963
|
+
/**
|
|
71964
|
+
* Create a ReminderUnstaged event (logged when a reminder is removed from staging).
|
|
71965
|
+
*/
|
|
71966
|
+
reminderUnstaged(context, state) {
|
|
71967
|
+
return {
|
|
71968
|
+
type: "reminder:unstaged",
|
|
71969
|
+
time: Date.now(),
|
|
71970
|
+
source: "daemon",
|
|
71971
|
+
context: {
|
|
71972
|
+
sessionId: context.sessionId,
|
|
71973
|
+
correlationId: context.correlationId,
|
|
71974
|
+
traceId: context.traceId,
|
|
71975
|
+
hook: context.hook,
|
|
71976
|
+
taskId: context.taskId
|
|
71977
|
+
},
|
|
71978
|
+
payload: {
|
|
71979
|
+
reminderName: state.reminderName,
|
|
71980
|
+
hookName: state.hookName,
|
|
71981
|
+
reason: state.reason,
|
|
71982
|
+
...state.triggeredBy !== void 0 && { triggeredBy: state.triggeredBy },
|
|
71983
|
+
...state.toolState !== void 0 && { toolState: state.toolState }
|
|
71984
|
+
}
|
|
71985
|
+
};
|
|
71986
|
+
},
|
|
71987
|
+
/**
|
|
71988
|
+
* Create a RemindersCleared event (logged when staging directory is cleaned).
|
|
71989
|
+
*/
|
|
71990
|
+
remindersCleared(context, state, reason) {
|
|
71991
|
+
return {
|
|
71992
|
+
type: "reminder:cleared",
|
|
71993
|
+
time: Date.now(),
|
|
71994
|
+
source: "daemon",
|
|
71995
|
+
context: {
|
|
71996
|
+
sessionId: context.sessionId,
|
|
71997
|
+
correlationId: context.correlationId,
|
|
71998
|
+
traceId: context.traceId,
|
|
71999
|
+
hook: context.hook,
|
|
72000
|
+
taskId: context.taskId
|
|
72001
|
+
},
|
|
72002
|
+
payload: {
|
|
72003
|
+
clearedCount: state.clearedCount,
|
|
72004
|
+
hookNames: state.hookNames,
|
|
72005
|
+
reason
|
|
72006
|
+
}
|
|
72007
|
+
};
|
|
72008
|
+
},
|
|
72009
|
+
/**
|
|
72010
|
+
* Create a ReminderNotStaged event (logged when daemon evaluates but decides not to stage).
|
|
72011
|
+
*/
|
|
72012
|
+
reminderNotStaged(context, state) {
|
|
72013
|
+
return {
|
|
72014
|
+
type: "reminder:not-staged",
|
|
72015
|
+
time: Date.now(),
|
|
72016
|
+
source: "daemon",
|
|
72017
|
+
context: {
|
|
72018
|
+
sessionId: context.sessionId,
|
|
72019
|
+
correlationId: context.correlationId,
|
|
72020
|
+
traceId: context.traceId,
|
|
72021
|
+
hook: context.hook,
|
|
72022
|
+
taskId: context.taskId
|
|
72023
|
+
},
|
|
72024
|
+
payload: {
|
|
72025
|
+
reminderName: state.reminderName,
|
|
72026
|
+
hookName: state.hookName,
|
|
72027
|
+
reason: state.reason,
|
|
72028
|
+
...state.threshold !== void 0 && { threshold: state.threshold },
|
|
72029
|
+
...state.currentValue !== void 0 && { currentValue: state.currentValue },
|
|
72030
|
+
...state.triggeredBy !== void 0 && { triggeredBy: state.triggeredBy }
|
|
72031
|
+
}
|
|
72032
|
+
};
|
|
72033
|
+
}
|
|
72034
|
+
};
|
|
72035
|
+
}
|
|
72036
|
+
});
|
|
72037
|
+
|
|
71593
72038
|
// ../feature-reminders/dist/handlers/staging/stage-pause-and-reflect.js
|
|
71594
72039
|
var require_stage_pause_and_reflect = __commonJS({
|
|
71595
72040
|
"../feature-reminders/dist/handlers/staging/stage-pause-and-reflect.js"(exports2) {
|
|
71596
72041
|
"use strict";
|
|
71597
72042
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
71598
72043
|
exports2.registerStagePauseAndReflect = registerStagePauseAndReflect;
|
|
72044
|
+
var core_1 = require_dist4();
|
|
71599
72045
|
var types_1 = require_dist();
|
|
72046
|
+
var events_js_1 = require_events2();
|
|
71600
72047
|
var staging_handler_utils_js_1 = require_staging_handler_utils();
|
|
71601
72048
|
var types_js_1 = require_types2();
|
|
71602
|
-
var state_js_1 =
|
|
72049
|
+
var state_js_1 = require_state4();
|
|
71603
72050
|
function registerStagePauseAndReflect(context) {
|
|
71604
72051
|
(0, staging_handler_utils_js_1.createStagingHandler)(context, {
|
|
71605
72052
|
id: "reminders:stage-pause-and-reflect",
|
|
@@ -71610,15 +72057,17 @@ var require_stage_pause_and_reflect = __commonJS({
|
|
|
71610
72057
|
return void 0;
|
|
71611
72058
|
const metrics = event.metadata.metrics;
|
|
71612
72059
|
const sessionId = event.context?.sessionId;
|
|
72060
|
+
if (!sessionId) {
|
|
72061
|
+
ctx.logger.warn("[stage-pause-and-reflect] No sessionId available, skipping");
|
|
72062
|
+
return void 0;
|
|
72063
|
+
}
|
|
71613
72064
|
const featureConfig = context.config.getFeature("reminders");
|
|
71614
72065
|
const config = { ...types_js_1.DEFAULT_REMINDERS_SETTINGS, ...featureConfig.settings };
|
|
71615
72066
|
let prBaseline = null;
|
|
71616
|
-
|
|
71617
|
-
|
|
71618
|
-
|
|
71619
|
-
|
|
71620
|
-
prBaseline = result.data;
|
|
71621
|
-
}
|
|
72067
|
+
const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
|
|
72068
|
+
const result = await remindersState.prBaseline.read(sessionId);
|
|
72069
|
+
if (result.source !== "default") {
|
|
72070
|
+
prBaseline = result.data;
|
|
71622
72071
|
}
|
|
71623
72072
|
let effectiveBaseline = 0;
|
|
71624
72073
|
if (prBaseline && prBaseline.turnCount === metrics.turnCount) {
|
|
@@ -71630,12 +72079,28 @@ var require_stage_pause_and_reflect = __commonJS({
|
|
|
71630
72079
|
effectiveBaseline = Math.max(effectiveBaseline, lastConsumed.stagedAt.toolsThisTurn);
|
|
71631
72080
|
}
|
|
71632
72081
|
const shouldReactivate = metrics.turnCount > lastConsumed.stagedAt.turnCount || metrics.toolsThisTurn >= effectiveBaseline + config.pause_and_reflect_threshold;
|
|
71633
|
-
if (!shouldReactivate)
|
|
72082
|
+
if (!shouldReactivate) {
|
|
72083
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
72084
|
+
reminderName: "pause-and-reflect",
|
|
72085
|
+
hookName: "PreToolUse",
|
|
72086
|
+
reason: "same_turn",
|
|
72087
|
+
triggeredBy: "tool_result"
|
|
72088
|
+
}));
|
|
71634
72089
|
return void 0;
|
|
72090
|
+
}
|
|
71635
72091
|
}
|
|
71636
72092
|
const toolsSinceBaseline = metrics.toolsThisTurn - effectiveBaseline;
|
|
71637
|
-
if (toolsSinceBaseline < config.pause_and_reflect_threshold)
|
|
72093
|
+
if (toolsSinceBaseline < config.pause_and_reflect_threshold) {
|
|
72094
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
72095
|
+
reminderName: "pause-and-reflect",
|
|
72096
|
+
hookName: "PreToolUse",
|
|
72097
|
+
reason: "below_threshold",
|
|
72098
|
+
threshold: config.pause_and_reflect_threshold,
|
|
72099
|
+
currentValue: toolsSinceBaseline,
|
|
72100
|
+
triggeredBy: "tool_result"
|
|
72101
|
+
}));
|
|
71638
72102
|
return void 0;
|
|
72103
|
+
}
|
|
71639
72104
|
return {
|
|
71640
72105
|
reminderId: types_js_1.ReminderIds.PAUSE_AND_REFLECT,
|
|
71641
72106
|
targetHook: "PreToolUse",
|
|
@@ -73217,12 +73682,14 @@ var require_track_verification_tools = __commonJS({
|
|
|
73217
73682
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
73218
73683
|
exports2.registerTrackVerificationTools = registerTrackVerificationTools;
|
|
73219
73684
|
exports2.stageToolsForFiles = stageToolsForFiles;
|
|
73685
|
+
var core_1 = require_dist4();
|
|
73686
|
+
var events_js_1 = require_events2();
|
|
73220
73687
|
var types_1 = require_dist();
|
|
73221
73688
|
var picomatch_1 = __importDefault2(require_picomatch2());
|
|
73222
73689
|
var tool_pattern_matcher_js_1 = require_tool_pattern_matcher();
|
|
73223
73690
|
var reminder_utils_js_1 = require_reminder_utils();
|
|
73224
73691
|
var types_js_1 = require_types2();
|
|
73225
|
-
var state_js_1 =
|
|
73692
|
+
var state_js_1 = require_state4();
|
|
73226
73693
|
var FILE_EDIT_TOOLS = ["Write", "Edit", "MultiEdit"];
|
|
73227
73694
|
var TOOL_REMINDER_MAP = {
|
|
73228
73695
|
build: types_js_1.ReminderIds.VC_BUILD,
|
|
@@ -73270,22 +73737,48 @@ var require_track_verification_tools = __commonJS({
|
|
|
73270
73737
|
}
|
|
73271
73738
|
});
|
|
73272
73739
|
}
|
|
73273
|
-
async function stageToolsForFiles(filePaths, daemonCtx, sessionId, verificationTools, toolsState, remindersState) {
|
|
73740
|
+
async function stageToolsForFiles(filePaths, daemonCtx, sessionId, verificationTools, toolsState, remindersState, triggeredBy = "file_edit") {
|
|
73274
73741
|
const existingReminders = await daemonCtx.staging.listReminders("Stop");
|
|
73275
73742
|
const stagedNames = new Set(existingReminders.map((r) => r.name));
|
|
73276
73743
|
let anyStaged = false;
|
|
73744
|
+
const emittedNotStaged = /* @__PURE__ */ new Set();
|
|
73277
73745
|
for (const filePath of filePaths) {
|
|
73278
73746
|
for (const [toolName, toolConfig] of Object.entries(verificationTools)) {
|
|
73279
|
-
if (!toolConfig.enabled)
|
|
73280
|
-
continue;
|
|
73281
73747
|
const reminderId = TOOL_REMINDER_MAP[toolName];
|
|
73282
73748
|
if (!reminderId)
|
|
73283
73749
|
continue;
|
|
73284
|
-
if (!
|
|
73750
|
+
if (!toolConfig.enabled) {
|
|
73751
|
+
const emitKey = `${reminderId}:feature_disabled`;
|
|
73752
|
+
if (!emittedNotStaged.has(emitKey)) {
|
|
73753
|
+
emittedNotStaged.add(emitKey);
|
|
73754
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
73755
|
+
reminderName: reminderId,
|
|
73756
|
+
hookName: "Stop",
|
|
73757
|
+
reason: "feature_disabled",
|
|
73758
|
+
triggeredBy
|
|
73759
|
+
}));
|
|
73760
|
+
}
|
|
73285
73761
|
continue;
|
|
73762
|
+
}
|
|
73763
|
+
if (!picomatch_1.default.isMatch(filePath, toolConfig.clearing_patterns)) {
|
|
73764
|
+
const emitKey = `${reminderId}:pattern_mismatch`;
|
|
73765
|
+
if (!emittedNotStaged.has(emitKey)) {
|
|
73766
|
+
emittedNotStaged.add(emitKey);
|
|
73767
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
73768
|
+
reminderName: reminderId,
|
|
73769
|
+
hookName: "Stop",
|
|
73770
|
+
reason: "pattern_mismatch",
|
|
73771
|
+
triggeredBy
|
|
73772
|
+
}));
|
|
73773
|
+
}
|
|
73774
|
+
continue;
|
|
73775
|
+
}
|
|
73286
73776
|
const current = toolsState[toolName];
|
|
73287
73777
|
if (!current || current.status === "staged") {
|
|
73288
|
-
const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames
|
|
73778
|
+
const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames, {
|
|
73779
|
+
reason: current ? "re-staged" : "initial",
|
|
73780
|
+
triggeredBy: "file_edit"
|
|
73781
|
+
});
|
|
73289
73782
|
if (staged) {
|
|
73290
73783
|
if (!current) {
|
|
73291
73784
|
toolsState[toolName] = {
|
|
@@ -73301,7 +73794,11 @@ var require_track_verification_tools = __commonJS({
|
|
|
73301
73794
|
} else {
|
|
73302
73795
|
const newEdits = current.editsSinceVerified + 1;
|
|
73303
73796
|
if (newEdits >= toolConfig.clearing_threshold) {
|
|
73304
|
-
const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames
|
|
73797
|
+
const staged = await ensureToolReminderStaged(daemonCtx, reminderId, stagedNames, {
|
|
73798
|
+
reason: "threshold_reached",
|
|
73799
|
+
triggeredBy: "file_edit",
|
|
73800
|
+
thresholdState: { current: newEdits, threshold: toolConfig.clearing_threshold }
|
|
73801
|
+
});
|
|
73305
73802
|
if (staged) {
|
|
73306
73803
|
toolsState[toolName] = {
|
|
73307
73804
|
...current,
|
|
@@ -73318,6 +73815,14 @@ var require_track_verification_tools = __commonJS({
|
|
|
73318
73815
|
status: "cooldown",
|
|
73319
73816
|
editsSinceVerified: newEdits
|
|
73320
73817
|
};
|
|
73818
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
73819
|
+
reminderName: reminderId,
|
|
73820
|
+
hookName: "Stop",
|
|
73821
|
+
reason: "below_threshold",
|
|
73822
|
+
threshold: toolConfig.clearing_threshold,
|
|
73823
|
+
currentValue: newEdits,
|
|
73824
|
+
triggeredBy
|
|
73825
|
+
}));
|
|
73321
73826
|
}
|
|
73322
73827
|
}
|
|
73323
73828
|
}
|
|
@@ -73363,6 +73868,16 @@ var require_track_verification_tools = __commonJS({
|
|
|
73363
73868
|
lastMatchedScope: match.scope
|
|
73364
73869
|
};
|
|
73365
73870
|
await daemonCtx.staging.deleteReminder("Stop", reminderId);
|
|
73871
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, {
|
|
73872
|
+
reminderName: reminderId,
|
|
73873
|
+
hookName: "Stop",
|
|
73874
|
+
reason: "tool_verified",
|
|
73875
|
+
triggeredBy: "verification_passed",
|
|
73876
|
+
toolState: {
|
|
73877
|
+
status: toolsState[toolName].status,
|
|
73878
|
+
editsSinceVerified: toolsState[toolName].editsSinceVerified
|
|
73879
|
+
}
|
|
73880
|
+
}));
|
|
73366
73881
|
anyUnstaged = true;
|
|
73367
73882
|
daemonCtx.logger.debug("VC tool verified", {
|
|
73368
73883
|
toolName,
|
|
@@ -73377,12 +73892,18 @@ var require_track_verification_tools = __commonJS({
|
|
|
73377
73892
|
const hasPerToolReminders = remaining.some((r) => VC_TOOL_NAME_SET.has(r.name));
|
|
73378
73893
|
if (!hasPerToolReminders) {
|
|
73379
73894
|
await daemonCtx.staging.deleteReminder("Stop", types_js_1.ReminderIds.VERIFY_COMPLETION);
|
|
73895
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, {
|
|
73896
|
+
reminderName: types_js_1.ReminderIds.VERIFY_COMPLETION,
|
|
73897
|
+
hookName: "Stop",
|
|
73898
|
+
reason: "all_tools_verified",
|
|
73899
|
+
triggeredBy: "verification_passed"
|
|
73900
|
+
}));
|
|
73380
73901
|
daemonCtx.logger.info("All VC tools verified, unstaged wrapper", { sessionId });
|
|
73381
73902
|
}
|
|
73382
73903
|
await remindersState.verificationTools.write(sessionId, toolsState);
|
|
73383
73904
|
}
|
|
73384
73905
|
}
|
|
73385
|
-
async function ensureToolReminderStaged(daemonCtx, reminderId, stagedNames) {
|
|
73906
|
+
async function ensureToolReminderStaged(daemonCtx, reminderId, stagedNames, enrichment) {
|
|
73386
73907
|
if (stagedNames.has(reminderId))
|
|
73387
73908
|
return true;
|
|
73388
73909
|
const reminder = (0, reminder_utils_js_1.resolveReminder)(reminderId, {
|
|
@@ -73396,7 +73917,7 @@ var require_track_verification_tools = __commonJS({
|
|
|
73396
73917
|
await (0, reminder_utils_js_1.stageReminder)(daemonCtx, "Stop", {
|
|
73397
73918
|
...reminder,
|
|
73398
73919
|
stagedAt: { timestamp: Date.now(), turnCount: 0, toolsThisTurn: 0, toolCount: 0 }
|
|
73399
|
-
});
|
|
73920
|
+
}, enrichment);
|
|
73400
73921
|
return true;
|
|
73401
73922
|
}
|
|
73402
73923
|
}
|
|
@@ -73412,11 +73933,12 @@ var require_stage_stop_bash_changes = __commonJS({
|
|
|
73412
73933
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
73413
73934
|
exports2.registerStageBashChanges = registerStageBashChanges;
|
|
73414
73935
|
var core_1 = require_dist4();
|
|
73936
|
+
var events_js_1 = require_events2();
|
|
73415
73937
|
var types_1 = require_dist();
|
|
73416
73938
|
var picomatch_1 = __importDefault2(require_picomatch2());
|
|
73417
73939
|
var track_verification_tools_js_1 = require_track_verification_tools();
|
|
73418
73940
|
var types_js_1 = require_types2();
|
|
73419
|
-
var state_js_1 =
|
|
73941
|
+
var state_js_1 = require_state4();
|
|
73420
73942
|
var GIT_STATUS_TIMEOUT_MS = 200;
|
|
73421
73943
|
var MAX_BASELINES = 50;
|
|
73422
73944
|
function registerStageBashChanges(context) {
|
|
@@ -73481,6 +74003,12 @@ var require_stage_stop_bash_changes = __commonJS({
|
|
|
73481
74003
|
if (lastConsumed?.stagedAt) {
|
|
73482
74004
|
const shouldReactivate = metrics.turnCount > lastConsumed.stagedAt.turnCount;
|
|
73483
74005
|
if (!shouldReactivate) {
|
|
74006
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
74007
|
+
reminderName: "verify-completion",
|
|
74008
|
+
hookName: "Stop",
|
|
74009
|
+
reason: "same_turn",
|
|
74010
|
+
triggeredBy: "bash_command"
|
|
74011
|
+
}));
|
|
73484
74012
|
daemonCtx.logger.debug("Bash VC: skipped (already consumed this turn)", {
|
|
73485
74013
|
currentTurn: metrics.turnCount,
|
|
73486
74014
|
lastConsumedTurn: lastConsumed.stagedAt.turnCount
|
|
@@ -73496,12 +74024,25 @@ var require_stage_stop_bash_changes = __commonJS({
|
|
|
73496
74024
|
currentCount: current.length,
|
|
73497
74025
|
newFileCount: newFiles.length
|
|
73498
74026
|
});
|
|
73499
|
-
if (newFiles.length === 0)
|
|
74027
|
+
if (newFiles.length === 0) {
|
|
74028
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
74029
|
+
reminderName: "verify-completion",
|
|
74030
|
+
hookName: "Stop",
|
|
74031
|
+
reason: "no_changes_detected",
|
|
74032
|
+
triggeredBy: "bash_command"
|
|
74033
|
+
}));
|
|
73500
74034
|
return;
|
|
74035
|
+
}
|
|
73501
74036
|
const featureConfig = context.config.getFeature("reminders");
|
|
73502
74037
|
const config = { ...types_js_1.DEFAULT_REMINDERS_SETTINGS, ...featureConfig.settings };
|
|
73503
74038
|
const sourceMatches = newFiles.filter((f) => picomatch_1.default.isMatch(f, config.source_code_patterns));
|
|
73504
74039
|
if (sourceMatches.length === 0) {
|
|
74040
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
74041
|
+
reminderName: "verify-completion",
|
|
74042
|
+
hookName: "Stop",
|
|
74043
|
+
reason: "pattern_mismatch",
|
|
74044
|
+
triggeredBy: "bash_command"
|
|
74045
|
+
}));
|
|
73505
74046
|
daemonCtx.logger.debug("Bash VC: new files found but no source code matches", { newFiles });
|
|
73506
74047
|
return;
|
|
73507
74048
|
}
|
|
@@ -73515,7 +74056,7 @@ var require_stage_stop_bash_changes = __commonJS({
|
|
|
73515
74056
|
const remindersState = (0, state_js_1.createRemindersState)(daemonCtx.stateService);
|
|
73516
74057
|
const stateResult = await remindersState.verificationTools.read(sessionId);
|
|
73517
74058
|
const toolsState = { ...stateResult.data };
|
|
73518
|
-
await (0, track_verification_tools_js_1.stageToolsForFiles)(sourceMatches, daemonCtx, sessionId, verificationTools, toolsState, remindersState);
|
|
74059
|
+
await (0, track_verification_tools_js_1.stageToolsForFiles)(sourceMatches, daemonCtx, sessionId, verificationTools, toolsState, remindersState, "bash_command");
|
|
73519
74060
|
}
|
|
73520
74061
|
});
|
|
73521
74062
|
}
|
|
@@ -73528,10 +74069,12 @@ var require_unstage_verify_completion = __commonJS({
|
|
|
73528
74069
|
"use strict";
|
|
73529
74070
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
73530
74071
|
exports2.registerUnstageVerifyCompletion = registerUnstageVerifyCompletion;
|
|
74072
|
+
var core_1 = require_dist4();
|
|
74073
|
+
var events_js_1 = require_events2();
|
|
73531
74074
|
var types_1 = require_dist();
|
|
73532
74075
|
var types_js_1 = require_types2();
|
|
73533
74076
|
var reminder_utils_js_1 = require_reminder_utils();
|
|
73534
|
-
var state_js_1 =
|
|
74077
|
+
var state_js_1 = require_state4();
|
|
73535
74078
|
function registerUnstageVerifyCompletion(context) {
|
|
73536
74079
|
if (!(0, types_1.isDaemonContext)(context))
|
|
73537
74080
|
return;
|
|
@@ -73550,6 +74093,7 @@ var require_unstage_verify_completion = __commonJS({
|
|
|
73550
74093
|
if (!sessionId) {
|
|
73551
74094
|
daemonCtx.logger.warn("No sessionId in UserPromptSubmit event");
|
|
73552
74095
|
await daemonCtx.staging.deleteReminder("Stop", types_js_1.ReminderIds.VERIFY_COMPLETION);
|
|
74096
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId: "" }, { reminderName: types_js_1.ReminderIds.VERIFY_COMPLETION, hookName: "Stop", reason: "no_session_id" }));
|
|
73553
74097
|
return;
|
|
73554
74098
|
}
|
|
73555
74099
|
const remindersState = (0, state_js_1.createRemindersState)(daemonCtx.stateService);
|
|
@@ -73625,13 +74169,26 @@ var require_unstage_verify_completion = __commonJS({
|
|
|
73625
74169
|
await remindersState.vcUnverified.delete(sessionId);
|
|
73626
74170
|
}
|
|
73627
74171
|
} else {
|
|
74172
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
74173
|
+
reminderName: "verify-completion",
|
|
74174
|
+
hookName: "Stop",
|
|
74175
|
+
reason: "no_unverified_changes"
|
|
74176
|
+
}));
|
|
73628
74177
|
daemonCtx.logger.info("VC unstage: no unverified changes, clearing reminder", {
|
|
73629
74178
|
sessionId,
|
|
73630
74179
|
hadState: unverifiedState !== null
|
|
73631
74180
|
});
|
|
73632
74181
|
}
|
|
74182
|
+
const eventContext = { sessionId };
|
|
74183
|
+
const reason = unverifiedState?.hasUnverifiedChanges ? "cycle_limit_reached" : "no_unverified_changes";
|
|
73633
74184
|
for (const vcId of types_js_1.ALL_VC_REMINDER_IDS) {
|
|
73634
74185
|
await daemonCtx.staging.deleteReminder("Stop", vcId);
|
|
74186
|
+
(0, core_1.logEvent)(daemonCtx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
|
|
74187
|
+
reminderName: vcId,
|
|
74188
|
+
hookName: "Stop",
|
|
74189
|
+
reason,
|
|
74190
|
+
triggeredBy: unverifiedState?.hasUnverifiedChanges ? "cycle_limit" : "no_unverified_changes"
|
|
74191
|
+
}));
|
|
73635
74192
|
}
|
|
73636
74193
|
daemonCtx.logger.debug("VC unstage: deleted all VC reminders");
|
|
73637
74194
|
}
|
|
@@ -73649,6 +74206,7 @@ var require_stage_persona_reminders = __commonJS({
|
|
|
73649
74206
|
exports2.stagePersonaRemindersForSession = stagePersonaRemindersForSession;
|
|
73650
74207
|
exports2.registerStagePersonaReminders = registerStagePersonaReminders;
|
|
73651
74208
|
var core_1 = require_dist4();
|
|
74209
|
+
var events_js_1 = require_events2();
|
|
73652
74210
|
var types_1 = require_dist();
|
|
73653
74211
|
var reminder_utils_js_1 = require_reminder_utils();
|
|
73654
74212
|
var types_js_1 = require_types2();
|
|
@@ -73669,10 +74227,21 @@ var require_stage_persona_reminders = __commonJS({
|
|
|
73669
74227
|
}
|
|
73670
74228
|
var PERSONA_REMINDER_HOOKS = ["UserPromptSubmit", "SessionStart"];
|
|
73671
74229
|
async function clearPersonaReminders(ctx, sessionId) {
|
|
74230
|
+
const eventContext = { sessionId };
|
|
73672
74231
|
for (const hook of PERSONA_REMINDER_HOOKS) {
|
|
73673
74232
|
await ctx.staging.deleteReminder(hook, types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA);
|
|
74233
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
|
|
74234
|
+
reminderName: types_js_1.ReminderIds.REMEMBER_YOUR_PERSONA,
|
|
74235
|
+
hookName: hook,
|
|
74236
|
+
reason: "persona_cleared"
|
|
74237
|
+
}));
|
|
73674
74238
|
}
|
|
73675
74239
|
await ctx.staging.deleteReminder("UserPromptSubmit", types_js_1.ReminderIds.PERSONA_CHANGED);
|
|
74240
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
|
|
74241
|
+
reminderName: types_js_1.ReminderIds.PERSONA_CHANGED,
|
|
74242
|
+
hookName: "UserPromptSubmit",
|
|
74243
|
+
reason: "persona_cleared"
|
|
74244
|
+
}));
|
|
73676
74245
|
const lastStaged = await readLastStagedPersona(ctx, sessionId);
|
|
73677
74246
|
if (lastStaged !== null) {
|
|
73678
74247
|
await writeLastStagedPersona(ctx, sessionId, null);
|
|
@@ -73717,12 +74286,22 @@ var require_stage_persona_reminders = __commonJS({
|
|
|
73717
74286
|
}
|
|
73718
74287
|
async function stagePersonaRemindersForSession(ctx, sessionId, options) {
|
|
73719
74288
|
if (!isPersonaInjectionEnabled(ctx)) {
|
|
74289
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
74290
|
+
reminderName: "remember-your-persona",
|
|
74291
|
+
hookName: "PreToolUse",
|
|
74292
|
+
reason: "feature_disabled"
|
|
74293
|
+
}));
|
|
73720
74294
|
await clearPersonaReminders(ctx, sessionId);
|
|
73721
74295
|
ctx.logger.debug("Persona injection disabled by config, cleaned up reminders", { sessionId });
|
|
73722
74296
|
return;
|
|
73723
74297
|
}
|
|
73724
74298
|
const persona = await loadPersonaForSession(ctx, sessionId);
|
|
73725
74299
|
if (!persona) {
|
|
74300
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderNotStaged({ sessionId }, {
|
|
74301
|
+
reminderName: "remember-your-persona",
|
|
74302
|
+
hookName: "PreToolUse",
|
|
74303
|
+
reason: "no_persona"
|
|
74304
|
+
}));
|
|
73726
74305
|
await clearPersonaReminders(ctx, sessionId);
|
|
73727
74306
|
ctx.logger.debug("Persona cleared or disabled, unstaged persona reminders", { sessionId });
|
|
73728
74307
|
return;
|
|
@@ -73751,6 +74330,11 @@ var require_stage_persona_reminders = __commonJS({
|
|
|
73751
74330
|
const isGenuineChange = lastStaged !== null && // null = never staged (initialization) → skip
|
|
73752
74331
|
lastStaged.personaId !== persona.id;
|
|
73753
74332
|
if (isGenuineChange) {
|
|
74333
|
+
(0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaChanged({ sessionId }, {
|
|
74334
|
+
personaFrom: lastStaged.personaId ?? "none",
|
|
74335
|
+
personaTo: persona.id,
|
|
74336
|
+
reason: "mid_session_change"
|
|
74337
|
+
}));
|
|
73754
74338
|
const changedReminder = (0, reminder_utils_js_1.resolveReminder)(types_js_1.ReminderIds.PERSONA_CHANGED, {
|
|
73755
74339
|
context: templateContext,
|
|
73756
74340
|
assets: ctx.assets
|
|
@@ -73808,6 +74392,7 @@ var require_stage_user_profile_reminders = __commonJS({
|
|
|
73808
74392
|
exports2.stageUserProfileRemindersForSession = stageUserProfileRemindersForSession;
|
|
73809
74393
|
exports2.registerStageUserProfileReminders = registerStageUserProfileReminders;
|
|
73810
74394
|
var core_1 = require_dist4();
|
|
74395
|
+
var events_js_1 = require_events2();
|
|
73811
74396
|
var types_1 = require_dist();
|
|
73812
74397
|
var reminder_utils_js_1 = require_reminder_utils();
|
|
73813
74398
|
var types_js_1 = require_types2();
|
|
@@ -73815,8 +74400,14 @@ var require_stage_user_profile_reminders = __commonJS({
|
|
|
73815
74400
|
async function stageUserProfileRemindersForSession(ctx, sessionId) {
|
|
73816
74401
|
const profile = (0, core_1.loadUserProfile)({ logger: ctx.logger });
|
|
73817
74402
|
if (!profile) {
|
|
74403
|
+
const eventContext = { sessionId };
|
|
73818
74404
|
for (const hook of USER_PROFILE_REMINDER_HOOKS) {
|
|
73819
74405
|
await ctx.staging.deleteReminder(hook, types_js_1.ReminderIds.USER_PROFILE);
|
|
74406
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
|
|
74407
|
+
reminderName: types_js_1.ReminderIds.USER_PROFILE,
|
|
74408
|
+
hookName: hook,
|
|
74409
|
+
reason: "no_user_profile"
|
|
74410
|
+
}));
|
|
73820
74411
|
}
|
|
73821
74412
|
return;
|
|
73822
74413
|
}
|
|
@@ -73885,60 +74476,6 @@ var require_staging2 = __commonJS({
|
|
|
73885
74476
|
}
|
|
73886
74477
|
});
|
|
73887
74478
|
|
|
73888
|
-
// ../feature-reminders/dist/events.js
|
|
73889
|
-
var require_events2 = __commonJS({
|
|
73890
|
-
"../feature-reminders/dist/events.js"(exports2) {
|
|
73891
|
-
"use strict";
|
|
73892
|
-
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
73893
|
-
exports2.ReminderEvents = void 0;
|
|
73894
|
-
exports2.ReminderEvents = {
|
|
73895
|
-
/**
|
|
73896
|
-
* Create a ReminderConsumed event (logged when CLI returns a staged reminder).
|
|
73897
|
-
*/
|
|
73898
|
-
reminderConsumed(context, state, metadata) {
|
|
73899
|
-
return {
|
|
73900
|
-
type: "ReminderConsumed",
|
|
73901
|
-
time: Date.now(),
|
|
73902
|
-
source: "cli",
|
|
73903
|
-
context: {
|
|
73904
|
-
sessionId: context.sessionId,
|
|
73905
|
-
correlationId: context.correlationId,
|
|
73906
|
-
traceId: context.traceId,
|
|
73907
|
-
hook: context.hook,
|
|
73908
|
-
taskId: context.taskId
|
|
73909
|
-
},
|
|
73910
|
-
payload: {
|
|
73911
|
-
state,
|
|
73912
|
-
metadata
|
|
73913
|
-
}
|
|
73914
|
-
};
|
|
73915
|
-
},
|
|
73916
|
-
// Note: reminderStaged stays in @sidekick/core (used by staging-service.ts, circular dep)
|
|
73917
|
-
/**
|
|
73918
|
-
* Create a RemindersCleared event (logged when staging directory is cleaned).
|
|
73919
|
-
*/
|
|
73920
|
-
remindersCleared(context, state, reason) {
|
|
73921
|
-
return {
|
|
73922
|
-
type: "RemindersCleared",
|
|
73923
|
-
time: Date.now(),
|
|
73924
|
-
source: "daemon",
|
|
73925
|
-
context: {
|
|
73926
|
-
sessionId: context.sessionId,
|
|
73927
|
-
correlationId: context.correlationId,
|
|
73928
|
-
traceId: context.traceId,
|
|
73929
|
-
hook: context.hook,
|
|
73930
|
-
taskId: context.taskId
|
|
73931
|
-
},
|
|
73932
|
-
payload: {
|
|
73933
|
-
state,
|
|
73934
|
-
reason
|
|
73935
|
-
}
|
|
73936
|
-
};
|
|
73937
|
-
}
|
|
73938
|
-
};
|
|
73939
|
-
}
|
|
73940
|
-
});
|
|
73941
|
-
|
|
73942
74479
|
// ../feature-reminders/dist/cli-staging-reader.js
|
|
73943
74480
|
var require_cli_staging_reader = __commonJS({
|
|
73944
74481
|
"../feature-reminders/dist/cli-staging-reader.js"(exports2) {
|
|
@@ -74064,7 +74601,19 @@ var require_consumption_handler_factory = __commonJS({
|
|
|
74064
74601
|
reader.renameReminder(hook, reminder.name);
|
|
74065
74602
|
}
|
|
74066
74603
|
}
|
|
74067
|
-
let
|
|
74604
|
+
let enrichment;
|
|
74605
|
+
let response;
|
|
74606
|
+
if (buildResponse) {
|
|
74607
|
+
const result = await buildResponse({ reminder: primary, reader, cliCtx, sessionId, event, supportsBlocking });
|
|
74608
|
+
if ("response" in result && typeof result.response === "object") {
|
|
74609
|
+
response = result.response;
|
|
74610
|
+
enrichment = result.enrichment;
|
|
74611
|
+
} else {
|
|
74612
|
+
response = result;
|
|
74613
|
+
}
|
|
74614
|
+
} else {
|
|
74615
|
+
response = buildDefaultResponse(primary, supportsBlocking);
|
|
74616
|
+
}
|
|
74068
74617
|
const secondaryContexts = reminders.slice(1).map((r) => r.additionalContext).filter((ctx2) => !!ctx2);
|
|
74069
74618
|
if (secondaryContexts.length > 0) {
|
|
74070
74619
|
const existing = response.additionalContext;
|
|
@@ -74082,7 +74631,8 @@ var require_consumption_handler_factory = __commonJS({
|
|
|
74082
74631
|
reminderReturned: true,
|
|
74083
74632
|
blocking: response.blocking ?? false,
|
|
74084
74633
|
priority: primary.priority,
|
|
74085
|
-
persistent: primary.persistent
|
|
74634
|
+
persistent: primary.persistent,
|
|
74635
|
+
...enrichment
|
|
74086
74636
|
}));
|
|
74087
74637
|
return { response };
|
|
74088
74638
|
}
|
|
@@ -74184,6 +74734,13 @@ var require_inject_stop = __commonJS({
|
|
|
74184
74734
|
shouldBlock: classification.shouldBlock,
|
|
74185
74735
|
reasoning: classification.reasoning?.slice(0, 200)
|
|
74186
74736
|
});
|
|
74737
|
+
const classificationEnrichment = {
|
|
74738
|
+
classificationResult: {
|
|
74739
|
+
category: classification.category,
|
|
74740
|
+
confidence: classification.confidence,
|
|
74741
|
+
shouldBlock: classification.shouldBlock
|
|
74742
|
+
}
|
|
74743
|
+
};
|
|
74187
74744
|
if (classification.shouldBlock) {
|
|
74188
74745
|
cliCtx.logger.info("VC inject-stop: BLOCKING (claiming completion)", { sessionId });
|
|
74189
74746
|
try {
|
|
@@ -74193,7 +74750,10 @@ var require_inject_stop = __commonJS({
|
|
|
74193
74750
|
error: String(clearErr)
|
|
74194
74751
|
});
|
|
74195
74752
|
}
|
|
74196
|
-
return
|
|
74753
|
+
return {
|
|
74754
|
+
response: (0, consumption_handler_factory_js_1.buildDefaultResponse)(reminder, supportsBlocking),
|
|
74755
|
+
enrichment: classificationEnrichment
|
|
74756
|
+
};
|
|
74197
74757
|
} else {
|
|
74198
74758
|
cliCtx.logger.info("VC inject-stop: NOT BLOCKING", {
|
|
74199
74759
|
sessionId,
|
|
@@ -74219,13 +74779,13 @@ var require_inject_stop = __commonJS({
|
|
|
74219
74779
|
});
|
|
74220
74780
|
}
|
|
74221
74781
|
if (classification.category === "ASKING_QUESTION" || classification.category === "ANSWERING_QUESTION") {
|
|
74222
|
-
return {};
|
|
74782
|
+
return { response: {}, enrichment: classificationEnrichment };
|
|
74223
74783
|
} else {
|
|
74224
74784
|
const response = {};
|
|
74225
74785
|
if (classification.userMessage) {
|
|
74226
74786
|
response.userMessage = classification.userMessage;
|
|
74227
74787
|
}
|
|
74228
|
-
return response;
|
|
74788
|
+
return { response, enrichment: classificationEnrichment };
|
|
74229
74789
|
}
|
|
74230
74790
|
}
|
|
74231
74791
|
} catch (err) {
|
|
@@ -74481,7 +75041,7 @@ var require_reminder_consumed = __commonJS({
|
|
|
74481
75041
|
"use strict";
|
|
74482
75042
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
74483
75043
|
exports2.handleReminderConsumed = handleReminderConsumed;
|
|
74484
|
-
var state_js_1 =
|
|
75044
|
+
var state_js_1 = require_state4();
|
|
74485
75045
|
var types_js_1 = require_types2();
|
|
74486
75046
|
async function handleReminderConsumed(params, ctx) {
|
|
74487
75047
|
const { sessionId, reminderName, metrics } = params;
|
|
@@ -74506,7 +75066,7 @@ var require_vc_unverified = __commonJS({
|
|
|
74506
75066
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
74507
75067
|
exports2.handleVCUnverifiedSet = handleVCUnverifiedSet;
|
|
74508
75068
|
exports2.handleVCUnverifiedClear = handleVCUnverifiedClear;
|
|
74509
|
-
var state_js_1 =
|
|
75069
|
+
var state_js_1 = require_state4();
|
|
74510
75070
|
async function handleVCUnverifiedSet(params, ctx) {
|
|
74511
75071
|
const { sessionId, classification, metrics } = params;
|
|
74512
75072
|
const remindersState = (0, state_js_1.createRemindersState)(ctx.stateService);
|
|
@@ -74569,7 +75129,9 @@ var require_orchestrator = __commonJS({
|
|
|
74569
75129
|
"use strict";
|
|
74570
75130
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
74571
75131
|
exports2.ReminderOrchestrator = void 0;
|
|
74572
|
-
var
|
|
75132
|
+
var core_1 = require_dist4();
|
|
75133
|
+
var events_js_1 = require_events2();
|
|
75134
|
+
var state_js_1 = require_state4();
|
|
74573
75135
|
var types_js_1 = require_types2();
|
|
74574
75136
|
var ReminderOrchestrator = class {
|
|
74575
75137
|
deps;
|
|
@@ -74588,8 +75150,15 @@ var require_orchestrator = __commonJS({
|
|
|
74588
75150
|
if (reminder.name === types_js_1.ReminderIds.PAUSE_AND_REFLECT) {
|
|
74589
75151
|
try {
|
|
74590
75152
|
const staging = this.deps.getStagingService(sessionId);
|
|
75153
|
+
const eventContext = { sessionId };
|
|
74591
75154
|
for (const vcId of types_js_1.ALL_VC_REMINDER_IDS) {
|
|
74592
75155
|
await staging.deleteReminder("Stop", vcId);
|
|
75156
|
+
(0, core_1.logEvent)(this.deps.logger, events_js_1.ReminderEvents.reminderUnstaged(eventContext, {
|
|
75157
|
+
reminderName: vcId,
|
|
75158
|
+
hookName: "Stop",
|
|
75159
|
+
reason: "pause_and_reflect_cascade",
|
|
75160
|
+
triggeredBy: "cascade_from_pause_and_reflect"
|
|
75161
|
+
}));
|
|
74593
75162
|
}
|
|
74594
75163
|
this.deps.logger.debug("Unstaged all VC reminders after P&R staged", { sessionId });
|
|
74595
75164
|
} catch (err) {
|
|
@@ -74625,6 +75194,12 @@ var require_orchestrator = __commonJS({
|
|
|
74625
75194
|
try {
|
|
74626
75195
|
const staging = this.deps.getStagingService(sessionId);
|
|
74627
75196
|
await staging.deleteReminder("PreToolUse", types_js_1.ReminderIds.PAUSE_AND_REFLECT);
|
|
75197
|
+
(0, core_1.logEvent)(this.deps.logger, events_js_1.ReminderEvents.reminderUnstaged({ sessionId }, {
|
|
75198
|
+
reminderName: types_js_1.ReminderIds.PAUSE_AND_REFLECT,
|
|
75199
|
+
hookName: "PreToolUse",
|
|
75200
|
+
reason: "vc_consumed_cascade",
|
|
75201
|
+
triggeredBy: "cascade_from_verify_completion"
|
|
75202
|
+
}));
|
|
74628
75203
|
this.deps.logger.debug("Unstaged P&R after VC consumed", { sessionId });
|
|
74629
75204
|
} catch (err) {
|
|
74630
75205
|
this.deps.logger.warn("Failed to unstage P&R after VC consumed", {
|
|
@@ -74750,7 +75325,7 @@ var require_dist5 = __commonJS({
|
|
|
74750
75325
|
Object.defineProperty(exports2, "ReminderOrchestrator", { enumerable: true, get: function() {
|
|
74751
75326
|
return orchestrator_js_1.ReminderOrchestrator;
|
|
74752
75327
|
} });
|
|
74753
|
-
var state_js_1 =
|
|
75328
|
+
var state_js_1 = require_state4();
|
|
74754
75329
|
Object.defineProperty(exports2, "createRemindersState", { enumerable: true, get: function() {
|
|
74755
75330
|
return state_js_1.createRemindersState;
|
|
74756
75331
|
} });
|
|
@@ -75777,7 +76352,7 @@ var require_truncation = __commonJS({
|
|
|
75777
76352
|
});
|
|
75778
76353
|
|
|
75779
76354
|
// ../feature-session-summary/dist/state.js
|
|
75780
|
-
var
|
|
76355
|
+
var require_state5 = __commonJS({
|
|
75781
76356
|
"../feature-session-summary/dist/state.js"(exports2) {
|
|
75782
76357
|
"use strict";
|
|
75783
76358
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
@@ -75882,7 +76457,7 @@ var require_persona_selection = __commonJS({
|
|
|
75882
76457
|
exports2.selectPersonaForSession = selectPersonaForSession;
|
|
75883
76458
|
exports2.ensurePersonaForSession = ensurePersonaForSession;
|
|
75884
76459
|
var core_1 = require_dist4();
|
|
75885
|
-
var state_js_1 =
|
|
76460
|
+
var state_js_1 = require_state5();
|
|
75886
76461
|
var types_js_1 = require_types4();
|
|
75887
76462
|
function parsePersonaList(list) {
|
|
75888
76463
|
if (!list || !list.trim()) {
|
|
@@ -75965,11 +76540,11 @@ var require_persona_selection = __commonJS({
|
|
|
75965
76540
|
};
|
|
75966
76541
|
const summaryState2 = (0, state_js_1.createSessionSummaryState)(ctx.stateService);
|
|
75967
76542
|
await summaryState2.sessionPersona.write(sessionId, personaState2);
|
|
75968
|
-
ctx.logger.
|
|
75969
|
-
sessionId,
|
|
76543
|
+
(0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaSelected({ sessionId }, {
|
|
75970
76544
|
personaId: pinned.id,
|
|
75971
|
-
|
|
75972
|
-
|
|
76545
|
+
selectionMethod: "pinned",
|
|
76546
|
+
poolSize: 1
|
|
76547
|
+
}));
|
|
75973
76548
|
return pinned.id;
|
|
75974
76549
|
}
|
|
75975
76550
|
ctx.logger.warn("Pinned persona not found, falling back to random selection", {
|
|
@@ -75979,13 +76554,18 @@ var require_persona_selection = __commonJS({
|
|
|
75979
76554
|
});
|
|
75980
76555
|
}
|
|
75981
76556
|
const persistThroughClear = personaConfig.persistThroughClear ?? true;
|
|
75982
|
-
ctx.logger.
|
|
76557
|
+
ctx.logger.info("[persona-lifecycle] ClearHandoff: checking clear cache", {
|
|
76558
|
+
sessionId,
|
|
75983
76559
|
persistThroughClear,
|
|
75984
76560
|
startType: options?.startType,
|
|
75985
76561
|
hasClearCache: !!ctx.personaClearCache
|
|
75986
76562
|
});
|
|
75987
76563
|
if (persistThroughClear && options?.startType === "clear" && ctx.personaClearCache) {
|
|
75988
76564
|
const cachedPersonaId = ctx.personaClearCache.consume();
|
|
76565
|
+
ctx.logger.info("[persona-lifecycle] ClearHandoff: consumed cache", {
|
|
76566
|
+
sessionId,
|
|
76567
|
+
cachedPersonaId: cachedPersonaId ?? null
|
|
76568
|
+
});
|
|
75989
76569
|
if (cachedPersonaId) {
|
|
75990
76570
|
const cachedPersona = allPersonas.get(cachedPersonaId);
|
|
75991
76571
|
if (cachedPersona) {
|
|
@@ -75996,11 +76576,11 @@ var require_persona_selection = __commonJS({
|
|
|
75996
76576
|
};
|
|
75997
76577
|
const summaryState2 = (0, state_js_1.createSessionSummaryState)(ctx.stateService);
|
|
75998
76578
|
await summaryState2.sessionPersona.write(sessionId, personaState2);
|
|
75999
|
-
ctx.logger.
|
|
76000
|
-
sessionId,
|
|
76579
|
+
(0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaSelected({ sessionId }, {
|
|
76001
76580
|
personaId: cachedPersona.id,
|
|
76002
|
-
|
|
76003
|
-
|
|
76581
|
+
selectionMethod: "handoff",
|
|
76582
|
+
poolSize: 1
|
|
76583
|
+
}));
|
|
76004
76584
|
return cachedPersona.id;
|
|
76005
76585
|
} else {
|
|
76006
76586
|
ctx.logger.warn("Cached persona from clear not found in available personas, falling back to selection", {
|
|
@@ -76038,12 +76618,11 @@ var require_persona_selection = __commonJS({
|
|
|
76038
76618
|
};
|
|
76039
76619
|
const summaryState = (0, state_js_1.createSessionSummaryState)(ctx.stateService);
|
|
76040
76620
|
await summaryState.sessionPersona.write(sessionId, personaState);
|
|
76041
|
-
ctx.logger.
|
|
76042
|
-
sessionId,
|
|
76621
|
+
(0, core_1.logEvent)(ctx.logger, core_1.LogEvents.personaSelected({ sessionId }, {
|
|
76043
76622
|
personaId: selected.id,
|
|
76044
|
-
|
|
76623
|
+
selectionMethod: "random",
|
|
76045
76624
|
poolSize: eligiblePersonas.length
|
|
76046
|
-
});
|
|
76625
|
+
}));
|
|
76047
76626
|
return selected.id;
|
|
76048
76627
|
}
|
|
76049
76628
|
async function ensurePersonaForSession(sessionId, ctx) {
|
|
@@ -76073,7 +76652,7 @@ var require_create_first_summary = __commonJS({
|
|
|
76073
76652
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
76074
76653
|
exports2.createFirstSessionSummary = createFirstSessionSummary;
|
|
76075
76654
|
var types_1 = require_dist();
|
|
76076
|
-
var state_js_1 =
|
|
76655
|
+
var state_js_1 = require_state5();
|
|
76077
76656
|
var persona_selection_js_1 = require_persona_selection();
|
|
76078
76657
|
var types_js_1 = require_types4();
|
|
76079
76658
|
async function createFirstSessionSummary(event, ctx) {
|
|
@@ -76106,15 +76685,12 @@ var require_events3 = __commonJS({
|
|
|
76106
76685
|
"../feature-session-summary/dist/events.js"(exports2) {
|
|
76107
76686
|
"use strict";
|
|
76108
76687
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
76109
|
-
exports2.SessionSummaryEvents = void 0;
|
|
76688
|
+
exports2.DecisionEvents = exports2.SessionSummaryEvents = void 0;
|
|
76110
76689
|
exports2.SessionSummaryEvents = {
|
|
76111
|
-
/**
|
|
76112
|
-
|
|
76113
|
-
* @see docs/design/FEATURE-SESSION-SUMMARY.md §3.4
|
|
76114
|
-
*/
|
|
76115
|
-
summaryUpdated(context, state, metadata, reason) {
|
|
76690
|
+
/** Emitted when summary generation begins. */
|
|
76691
|
+
summaryStart(context, payload) {
|
|
76116
76692
|
return {
|
|
76117
|
-
type: "
|
|
76693
|
+
type: "session-summary:start",
|
|
76118
76694
|
time: Date.now(),
|
|
76119
76695
|
source: "daemon",
|
|
76120
76696
|
context: {
|
|
@@ -76124,11 +76700,87 @@ var require_events3 = __commonJS({
|
|
|
76124
76700
|
hook: context.hook,
|
|
76125
76701
|
taskId: context.taskId
|
|
76126
76702
|
},
|
|
76127
|
-
payload
|
|
76128
|
-
|
|
76129
|
-
|
|
76130
|
-
|
|
76131
|
-
|
|
76703
|
+
payload
|
|
76704
|
+
};
|
|
76705
|
+
},
|
|
76706
|
+
/** Emitted when summary generation completes. */
|
|
76707
|
+
summaryFinish(context, payload) {
|
|
76708
|
+
return {
|
|
76709
|
+
type: "session-summary:finish",
|
|
76710
|
+
time: Date.now(),
|
|
76711
|
+
source: "daemon",
|
|
76712
|
+
context: {
|
|
76713
|
+
sessionId: context.sessionId,
|
|
76714
|
+
correlationId: context.correlationId,
|
|
76715
|
+
traceId: context.traceId,
|
|
76716
|
+
hook: context.hook,
|
|
76717
|
+
taskId: context.taskId
|
|
76718
|
+
},
|
|
76719
|
+
payload
|
|
76720
|
+
};
|
|
76721
|
+
},
|
|
76722
|
+
/** Emitted when session title changes. */
|
|
76723
|
+
titleChanged(context, payload) {
|
|
76724
|
+
return {
|
|
76725
|
+
type: "session-title:changed",
|
|
76726
|
+
time: Date.now(),
|
|
76727
|
+
source: "daemon",
|
|
76728
|
+
context: {
|
|
76729
|
+
sessionId: context.sessionId,
|
|
76730
|
+
correlationId: context.correlationId,
|
|
76731
|
+
traceId: context.traceId,
|
|
76732
|
+
hook: context.hook,
|
|
76733
|
+
taskId: context.taskId
|
|
76734
|
+
},
|
|
76735
|
+
payload
|
|
76736
|
+
};
|
|
76737
|
+
},
|
|
76738
|
+
/** Emitted when latest intent changes. */
|
|
76739
|
+
intentChanged(context, payload) {
|
|
76740
|
+
return {
|
|
76741
|
+
type: "intent:changed",
|
|
76742
|
+
time: Date.now(),
|
|
76743
|
+
source: "daemon",
|
|
76744
|
+
context: {
|
|
76745
|
+
sessionId: context.sessionId,
|
|
76746
|
+
correlationId: context.correlationId,
|
|
76747
|
+
traceId: context.traceId,
|
|
76748
|
+
hook: context.hook,
|
|
76749
|
+
taskId: context.taskId
|
|
76750
|
+
},
|
|
76751
|
+
payload
|
|
76752
|
+
};
|
|
76753
|
+
},
|
|
76754
|
+
/** Emitted when snarky message generation begins. */
|
|
76755
|
+
snarkyMessageStart(context, payload) {
|
|
76756
|
+
return {
|
|
76757
|
+
type: "snarky-message:start",
|
|
76758
|
+
time: Date.now(),
|
|
76759
|
+
source: "daemon",
|
|
76760
|
+
context: {
|
|
76761
|
+
sessionId: context.sessionId,
|
|
76762
|
+
correlationId: context.correlationId,
|
|
76763
|
+
traceId: context.traceId,
|
|
76764
|
+
hook: context.hook,
|
|
76765
|
+
taskId: context.taskId
|
|
76766
|
+
},
|
|
76767
|
+
payload
|
|
76768
|
+
};
|
|
76769
|
+
},
|
|
76770
|
+
/** Emitted when snarky message generation completes. */
|
|
76771
|
+
snarkyMessageFinish(context, payload) {
|
|
76772
|
+
return {
|
|
76773
|
+
type: "snarky-message:finish",
|
|
76774
|
+
time: Date.now(),
|
|
76775
|
+
source: "daemon",
|
|
76776
|
+
context: {
|
|
76777
|
+
sessionId: context.sessionId,
|
|
76778
|
+
correlationId: context.correlationId,
|
|
76779
|
+
traceId: context.traceId,
|
|
76780
|
+
hook: context.hook,
|
|
76781
|
+
taskId: context.taskId
|
|
76782
|
+
},
|
|
76783
|
+
payload
|
|
76132
76784
|
};
|
|
76133
76785
|
},
|
|
76134
76786
|
/**
|
|
@@ -76137,7 +76789,7 @@ var require_events3 = __commonJS({
|
|
|
76137
76789
|
*/
|
|
76138
76790
|
summarySkipped(context, metadata) {
|
|
76139
76791
|
return {
|
|
76140
|
-
type: "
|
|
76792
|
+
type: "session-summary:skipped",
|
|
76141
76793
|
time: Date.now(),
|
|
76142
76794
|
source: "daemon",
|
|
76143
76795
|
context: {
|
|
@@ -76148,12 +76800,31 @@ var require_events3 = __commonJS({
|
|
|
76148
76800
|
taskId: context.taskId
|
|
76149
76801
|
},
|
|
76150
76802
|
payload: {
|
|
76151
|
-
metadata,
|
|
76803
|
+
countdown: metadata.countdown,
|
|
76804
|
+
countdown_threshold: metadata.countdown_threshold,
|
|
76152
76805
|
reason: "countdown_active"
|
|
76153
76806
|
}
|
|
76154
76807
|
};
|
|
76155
76808
|
}
|
|
76156
76809
|
};
|
|
76810
|
+
exports2.DecisionEvents = {
|
|
76811
|
+
/** Emitted when an LLM decision is recorded. */
|
|
76812
|
+
decisionRecorded(context, payload) {
|
|
76813
|
+
return {
|
|
76814
|
+
type: "decision:recorded",
|
|
76815
|
+
time: Date.now(),
|
|
76816
|
+
source: "daemon",
|
|
76817
|
+
context: {
|
|
76818
|
+
sessionId: context.sessionId,
|
|
76819
|
+
correlationId: context.correlationId,
|
|
76820
|
+
traceId: context.traceId,
|
|
76821
|
+
hook: context.hook,
|
|
76822
|
+
taskId: context.taskId
|
|
76823
|
+
},
|
|
76824
|
+
payload
|
|
76825
|
+
};
|
|
76826
|
+
}
|
|
76827
|
+
};
|
|
76157
76828
|
}
|
|
76158
76829
|
});
|
|
76159
76830
|
|
|
@@ -76173,7 +76844,7 @@ var require_persona_utils = __commonJS({
|
|
|
76173
76844
|
exports2.mergePersonaConfig = mergePersonaConfig;
|
|
76174
76845
|
exports2.getEffectiveProfile = getEffectiveProfile;
|
|
76175
76846
|
var core_1 = require_dist4();
|
|
76176
|
-
var state_js_1 =
|
|
76847
|
+
var state_js_1 = require_state5();
|
|
76177
76848
|
var types_js_1 = require_types4();
|
|
76178
76849
|
var DEFAULT_PERSONA_SITUATION = "You are watching over the shoulder of a software developer as they work.";
|
|
76179
76850
|
function buildUserProfileContext(profile) {
|
|
@@ -76315,7 +76986,7 @@ var require_update_summary = __commonJS({
|
|
|
76315
76986
|
var events_js_1 = require_events3();
|
|
76316
76987
|
var zod_1 = require_zod();
|
|
76317
76988
|
var types_js_1 = require_types4();
|
|
76318
|
-
var state_js_1 =
|
|
76989
|
+
var state_js_1 = require_state5();
|
|
76319
76990
|
var persona_utils_js_1 = require_persona_utils();
|
|
76320
76991
|
var persona_selection_js_1 = require_persona_selection();
|
|
76321
76992
|
var PROMPT_FILE = "prompts/session-summary.prompt.txt";
|
|
@@ -76368,47 +77039,47 @@ var require_update_summary = __commonJS({
|
|
|
76368
77039
|
await (0, persona_selection_js_1.ensurePersonaForSession)(sessionId, ctx);
|
|
76369
77040
|
const metrics = ctx.transcript.getMetrics();
|
|
76370
77041
|
if (metrics.turnCount === 0) {
|
|
76371
|
-
ctx.logger.
|
|
76372
|
-
sessionId,
|
|
77042
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
|
|
76373
77043
|
decision: "skipped",
|
|
76374
|
-
reason: "BulkProcessingComplete with no user turns (turnCount=0)"
|
|
76375
|
-
|
|
77044
|
+
reason: "BulkProcessingComplete with no user turns (turnCount=0)",
|
|
77045
|
+
detail: "session-summary analysis"
|
|
77046
|
+
}));
|
|
76376
77047
|
return;
|
|
76377
77048
|
}
|
|
76378
|
-
ctx.logger.
|
|
76379
|
-
sessionId,
|
|
77049
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
|
|
76380
77050
|
decision: "calling",
|
|
76381
|
-
reason: "BulkProcessingComplete - analyzing full transcript"
|
|
76382
|
-
|
|
77051
|
+
reason: "BulkProcessingComplete - analyzing full transcript",
|
|
77052
|
+
detail: "session-summary analysis"
|
|
77053
|
+
}));
|
|
76383
77054
|
const countdown2 = await loadCountdownState(summaryState, sessionId);
|
|
76384
77055
|
void performAnalysis(event, ctx, summaryState, countdown2, "user_prompt_forced");
|
|
76385
77056
|
return;
|
|
76386
77057
|
}
|
|
76387
77058
|
const countdown = await loadCountdownState(summaryState, sessionId);
|
|
76388
77059
|
if (isUserPrompt) {
|
|
76389
|
-
ctx.logger.
|
|
76390
|
-
sessionId,
|
|
77060
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
|
|
76391
77061
|
decision: "calling",
|
|
76392
|
-
reason: "UserPrompt event forces immediate analysis"
|
|
76393
|
-
|
|
77062
|
+
reason: "UserPrompt event forces immediate analysis",
|
|
77063
|
+
detail: "session-summary analysis"
|
|
77064
|
+
}));
|
|
76394
77065
|
void performAnalysis(event, ctx, summaryState, countdown, "user_prompt_forced");
|
|
76395
77066
|
return;
|
|
76396
77067
|
}
|
|
76397
77068
|
if (countdown.countdown > 0) {
|
|
76398
|
-
ctx.logger.
|
|
76399
|
-
sessionId,
|
|
77069
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
|
|
76400
77070
|
decision: "skipped",
|
|
76401
|
-
reason: `countdown not reached (${countdown.countdown} tool results remaining)
|
|
76402
|
-
|
|
77071
|
+
reason: `countdown not reached (${countdown.countdown} tool results remaining)`,
|
|
77072
|
+
detail: "session-summary analysis"
|
|
77073
|
+
}));
|
|
76403
77074
|
countdown.countdown--;
|
|
76404
77075
|
await saveCountdownState(summaryState, sessionId, countdown);
|
|
76405
77076
|
return;
|
|
76406
77077
|
}
|
|
76407
|
-
ctx.logger.
|
|
76408
|
-
sessionId,
|
|
77078
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.DecisionEvents.decisionRecorded(event.context, {
|
|
76409
77079
|
decision: "calling",
|
|
76410
|
-
reason: "countdown reached zero after ToolResult"
|
|
76411
|
-
|
|
77080
|
+
reason: "countdown reached zero after ToolResult",
|
|
77081
|
+
detail: "session-summary analysis"
|
|
77082
|
+
}));
|
|
76412
77083
|
void performAnalysis(event, ctx, summaryState, countdown, "countdown_reached");
|
|
76413
77084
|
}
|
|
76414
77085
|
async function loadCountdownState(summaryState, sessionId) {
|
|
@@ -76442,6 +77113,10 @@ var require_update_summary = __commonJS({
|
|
|
76442
77113
|
const { sessionId } = event.context;
|
|
76443
77114
|
try {
|
|
76444
77115
|
const startTime = Date.now();
|
|
77116
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.summaryStart(event.context, {
|
|
77117
|
+
reason,
|
|
77118
|
+
countdown: countdown.countdown
|
|
77119
|
+
}));
|
|
76445
77120
|
const featureConfig = ctx.config.getFeature("session-summary");
|
|
76446
77121
|
const config = { ...types_js_1.DEFAULT_SESSION_SUMMARY_CONFIG, ...featureConfig.settings };
|
|
76447
77122
|
const currentSummary = await loadCurrentSummary(summaryState, sessionId);
|
|
@@ -76545,19 +77220,28 @@ var require_update_summary = __commonJS({
|
|
|
76545
77220
|
if (sideEffects.length > 0) {
|
|
76546
77221
|
await Promise.all(sideEffects);
|
|
76547
77222
|
}
|
|
76548
|
-
(0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.
|
|
77223
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.summaryFinish(event.context, {
|
|
76549
77224
|
session_title: updatedSummary.session_title,
|
|
76550
77225
|
session_title_confidence: updatedSummary.session_title_confidence,
|
|
76551
77226
|
latest_intent: updatedSummary.latest_intent,
|
|
76552
|
-
latest_intent_confidence: updatedSummary.latest_intent_confidence
|
|
76553
|
-
}, {
|
|
76554
|
-
countdown_reset_to: newCountdown,
|
|
76555
|
-
tokens_used: tokensUsed,
|
|
77227
|
+
latest_intent_confidence: updatedSummary.latest_intent_confidence,
|
|
76556
77228
|
processing_time_ms: updatedSummary.stats?.processing_time_ms ?? 0,
|
|
76557
|
-
pivot_detected: updatedSummary.pivot_detected ?? false
|
|
76558
|
-
|
|
76559
|
-
|
|
76560
|
-
|
|
77229
|
+
pivot_detected: updatedSummary.pivot_detected ?? false
|
|
77230
|
+
}));
|
|
77231
|
+
if (currentSummary && updatedSummary.session_title !== currentSummary.session_title) {
|
|
77232
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.titleChanged(event.context, {
|
|
77233
|
+
previousValue: currentSummary.session_title,
|
|
77234
|
+
newValue: updatedSummary.session_title,
|
|
77235
|
+
confidence: updatedSummary.session_title_confidence
|
|
77236
|
+
}));
|
|
77237
|
+
}
|
|
77238
|
+
if (currentSummary && updatedSummary.latest_intent !== currentSummary.latest_intent) {
|
|
77239
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.intentChanged(event.context, {
|
|
77240
|
+
previousValue: currentSummary.latest_intent,
|
|
77241
|
+
newValue: updatedSummary.latest_intent,
|
|
77242
|
+
confidence: updatedSummary.latest_intent_confidence
|
|
77243
|
+
}));
|
|
77244
|
+
}
|
|
76561
77245
|
ctx.logger.info("Updated session summary", {
|
|
76562
77246
|
sessionId,
|
|
76563
77247
|
reason,
|
|
@@ -76623,6 +77307,7 @@ var require_update_summary = __commonJS({
|
|
|
76623
77307
|
return;
|
|
76624
77308
|
}
|
|
76625
77309
|
const provider = ctx.profileFactory.createForProfile(profileResult.profileId, llmConfig.fallbackProfile);
|
|
77310
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageStart({ sessionId }, { sessionId }));
|
|
76626
77311
|
try {
|
|
76627
77312
|
const response = await provider.complete({
|
|
76628
77313
|
messages: [{ role: "user", content: prompt }]
|
|
@@ -76633,6 +77318,7 @@ var require_update_summary = __commonJS({
|
|
|
76633
77318
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
76634
77319
|
};
|
|
76635
77320
|
await summaryState.snarkyMessage.write(sessionId, snarkyState);
|
|
77321
|
+
(0, core_1.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageFinish({ sessionId }, { generatedMessage: snarkyMessage }));
|
|
76636
77322
|
ctx.logger.debug("Generated snarky message", {
|
|
76637
77323
|
sessionId,
|
|
76638
77324
|
personaId: persona?.id ?? "none",
|
|
@@ -76741,8 +77427,10 @@ var require_on_demand_generation = __commonJS({
|
|
|
76741
77427
|
exports2.generateSnarkyMessageOnDemand = generateSnarkyMessageOnDemand;
|
|
76742
77428
|
exports2.generateResumeMessageOnDemand = generateResumeMessageOnDemand;
|
|
76743
77429
|
var types_js_1 = require_types4();
|
|
76744
|
-
var state_js_1 =
|
|
77430
|
+
var state_js_1 = require_state5();
|
|
76745
77431
|
var core_1 = require_dist4();
|
|
77432
|
+
var core_2 = require_dist4();
|
|
77433
|
+
var events_js_1 = require_events3();
|
|
76746
77434
|
var update_summary_js_1 = require_update_summary();
|
|
76747
77435
|
var persona_utils_js_1 = require_persona_utils();
|
|
76748
77436
|
var SNARKY_PROMPT_FILE = "prompts/snarky-message.prompt.txt";
|
|
@@ -76819,6 +77507,7 @@ var require_on_demand_generation = __commonJS({
|
|
|
76819
77507
|
return { success: false, error: profileResult.errorMessage };
|
|
76820
77508
|
}
|
|
76821
77509
|
const provider = ctx.profileFactory.createForProfile(profileResult.profileId, llmConfig.fallbackProfile);
|
|
77510
|
+
(0, core_2.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageStart({ sessionId }, { sessionId }));
|
|
76822
77511
|
try {
|
|
76823
77512
|
const response = await provider.complete({
|
|
76824
77513
|
messages: [{ role: "user", content: prompt }]
|
|
@@ -76829,6 +77518,7 @@ var require_on_demand_generation = __commonJS({
|
|
|
76829
77518
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
76830
77519
|
};
|
|
76831
77520
|
await summaryState.snarkyMessage.write(sessionId, snarkyState);
|
|
77521
|
+
(0, core_2.logEvent)(ctx.logger, events_js_1.SessionSummaryEvents.snarkyMessageFinish({ sessionId }, { generatedMessage: snarkyMessage }));
|
|
76832
77522
|
ctx.logger.info("Generated snarky message on-demand", {
|
|
76833
77523
|
sessionId,
|
|
76834
77524
|
personaId: persona?.id ?? "none"
|
|
@@ -77035,7 +77725,7 @@ var require_dist6 = __commonJS({
|
|
|
77035
77725
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
|
|
77036
77726
|
};
|
|
77037
77727
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
77038
|
-
exports2.SessionSummaryEvents = exports2.manifest = void 0;
|
|
77728
|
+
exports2.DecisionEvents = exports2.SessionSummaryEvents = exports2.manifest = void 0;
|
|
77039
77729
|
exports2.register = register;
|
|
77040
77730
|
var index_js_1 = require_handlers();
|
|
77041
77731
|
exports2.manifest = {
|
|
@@ -77052,11 +77742,14 @@ var require_dist6 = __commonJS({
|
|
|
77052
77742
|
exports2.default = feature;
|
|
77053
77743
|
__exportStar(require_types4(), exports2);
|
|
77054
77744
|
__exportStar(require_handlers(), exports2);
|
|
77055
|
-
__exportStar(
|
|
77745
|
+
__exportStar(require_state5(), exports2);
|
|
77056
77746
|
var events_js_1 = require_events3();
|
|
77057
77747
|
Object.defineProperty(exports2, "SessionSummaryEvents", { enumerable: true, get: function() {
|
|
77058
77748
|
return events_js_1.SessionSummaryEvents;
|
|
77059
77749
|
} });
|
|
77750
|
+
Object.defineProperty(exports2, "DecisionEvents", { enumerable: true, get: function() {
|
|
77751
|
+
return events_js_1.DecisionEvents;
|
|
77752
|
+
} });
|
|
77060
77753
|
}
|
|
77061
77754
|
});
|
|
77062
77755
|
|
|
@@ -79135,6 +79828,20 @@ var require_persona2 = __commonJS({
|
|
|
79135
79828
|
stdout.write(output + "\n");
|
|
79136
79829
|
return { exitCode, output };
|
|
79137
79830
|
}
|
|
79831
|
+
function validatePersonaExists(personaId, opts) {
|
|
79832
|
+
const personas = (0, core_1.discoverPersonas)({
|
|
79833
|
+
defaultPersonasDir: (0, core_1.getDefaultPersonasDir)(),
|
|
79834
|
+
projectRoot: opts.projectRoot,
|
|
79835
|
+
logger: opts.logger
|
|
79836
|
+
});
|
|
79837
|
+
if (!personas.has(personaId)) {
|
|
79838
|
+
const availableIds = Array.from(personas.keys()).join(", ");
|
|
79839
|
+
const errorMsg = `Persona "${personaId}" not found. Available: ${availableIds}`;
|
|
79840
|
+
opts.logger.error("Persona not found", { personaId, available: availableIds });
|
|
79841
|
+
return { result: writeJsonResponse(opts.stdout, { success: false, error: errorMsg }, 1) };
|
|
79842
|
+
}
|
|
79843
|
+
return { personas };
|
|
79844
|
+
}
|
|
79138
79845
|
function handlePersonaList(projectRoot, logger, stdout, options) {
|
|
79139
79846
|
const format3 = options.format ?? "json";
|
|
79140
79847
|
const tableWidth = options.width ?? 100;
|
|
@@ -79191,17 +79898,10 @@ var require_persona2 = __commonJS({
|
|
|
79191
79898
|
return { exitCode: 1, output: error };
|
|
79192
79899
|
}
|
|
79193
79900
|
logger.info("Setting persona", { personaId, sessionId });
|
|
79194
|
-
const
|
|
79195
|
-
|
|
79196
|
-
|
|
79197
|
-
|
|
79198
|
-
});
|
|
79199
|
-
if (!personas.has(personaId)) {
|
|
79200
|
-
const availableIds = Array.from(personas.keys()).join(", ");
|
|
79201
|
-
const errorMsg = `Persona "${personaId}" not found. Available: ${availableIds}`;
|
|
79202
|
-
logger.error("Persona not found", { personaId, available: availableIds });
|
|
79203
|
-
return writeJsonResponse(stdout, { success: false, error: errorMsg }, 1);
|
|
79204
|
-
}
|
|
79901
|
+
const validation = validatePersonaExists(personaId, { projectRoot, logger, stdout });
|
|
79902
|
+
if (validation.result)
|
|
79903
|
+
return validation.result;
|
|
79904
|
+
const personas = validation.personas;
|
|
79205
79905
|
const stateService = new core_1.StateService(projectRoot, { cache: false, logger });
|
|
79206
79906
|
const personaAccessor = new core_1.SessionStateAccessor(stateService, SessionPersonaDescriptor);
|
|
79207
79907
|
try {
|
|
@@ -79213,10 +79913,16 @@ var require_persona2 = __commonJS({
|
|
|
79213
79913
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
79214
79914
|
};
|
|
79215
79915
|
await personaAccessor.write(sessionId, newState);
|
|
79916
|
+
const personaFilePath = stateService.sessionStatePath(sessionId, "session-persona.json");
|
|
79216
79917
|
if (previousPersonaId) {
|
|
79217
|
-
logger.info("
|
|
79918
|
+
logger.info("[persona-lifecycle] PersonaSet: persona changed", {
|
|
79919
|
+
sessionId,
|
|
79920
|
+
from: previousPersonaId,
|
|
79921
|
+
to: personaId,
|
|
79922
|
+
filePath: personaFilePath
|
|
79923
|
+
});
|
|
79218
79924
|
} else {
|
|
79219
|
-
logger.info("
|
|
79925
|
+
logger.info("[persona-lifecycle] PersonaSet: persona set", { sessionId, personaId, filePath: personaFilePath });
|
|
79220
79926
|
}
|
|
79221
79927
|
return writeJsonResponse(stdout, { success: true, personaId, previousPersonaId }, 0);
|
|
79222
79928
|
} catch (err) {
|
|
@@ -79299,17 +80005,9 @@ var require_persona2 = __commonJS({
|
|
|
79299
80005
|
function handlePersonaPin(personaId, projectRoot, logger, stdout, options) {
|
|
79300
80006
|
const scope = options.scope ?? "project";
|
|
79301
80007
|
logger.info("Pinning persona", { personaId, scope });
|
|
79302
|
-
const
|
|
79303
|
-
|
|
79304
|
-
|
|
79305
|
-
logger
|
|
79306
|
-
});
|
|
79307
|
-
if (!personas.has(personaId)) {
|
|
79308
|
-
const availableIds = Array.from(personas.keys()).join(", ");
|
|
79309
|
-
const errorMsg = `Persona "${personaId}" not found. Available: ${availableIds}`;
|
|
79310
|
-
logger.error("Persona not found", { personaId, available: availableIds });
|
|
79311
|
-
return writeJsonResponse(stdout, { success: false, error: errorMsg }, 1);
|
|
79312
|
-
}
|
|
80008
|
+
const validation = validatePersonaExists(personaId, { projectRoot, logger, stdout });
|
|
80009
|
+
if (validation.result)
|
|
80010
|
+
return validation.result;
|
|
79313
80011
|
try {
|
|
79314
80012
|
const result = (0, core_1.configSet)("features.session-summary.settings.personas.pinnedPersona", personaId, {
|
|
79315
80013
|
scope,
|
|
@@ -79354,7 +80052,7 @@ var require_persona2 = __commonJS({
|
|
|
79354
80052
|
return writeJsonResponse(stdout, { success: false, error: errorMsg }, 1);
|
|
79355
80053
|
}
|
|
79356
80054
|
}
|
|
79357
|
-
function showPersonaHelp(stdout) {
|
|
80055
|
+
function showPersonaHelp(stdout, exitCode = 0) {
|
|
79358
80056
|
stdout.write(`Usage: sidekick persona <subcommand> [options]
|
|
79359
80057
|
|
|
79360
80058
|
Subcommands:
|
|
@@ -79383,7 +80081,7 @@ Examples:
|
|
|
79383
80081
|
sidekick persona clear --session-id=abc123
|
|
79384
80082
|
sidekick persona test skippy --session-id=abc123 --type=snarky
|
|
79385
80083
|
`);
|
|
79386
|
-
return { exitCode
|
|
80084
|
+
return { exitCode, output: "" };
|
|
79387
80085
|
}
|
|
79388
80086
|
async function handlePersonaCommand(subcommand, args, projectRoot, logger, stdout, options) {
|
|
79389
80087
|
const personaId = args[0];
|
|
@@ -79424,12 +80122,12 @@ Examples:
|
|
|
79424
80122
|
return showPersonaHelp(stdout);
|
|
79425
80123
|
case void 0:
|
|
79426
80124
|
stdout.write("Error: persona command requires a subcommand\n\n");
|
|
79427
|
-
return showPersonaHelp(stdout);
|
|
80125
|
+
return showPersonaHelp(stdout, 1);
|
|
79428
80126
|
default:
|
|
79429
80127
|
stdout.write(`Error: Unknown persona subcommand: ${subcommand}
|
|
79430
80128
|
|
|
79431
80129
|
`);
|
|
79432
|
-
return showPersonaHelp(stdout);
|
|
80130
|
+
return showPersonaHelp(stdout, 1);
|
|
79433
80131
|
}
|
|
79434
80132
|
}
|
|
79435
80133
|
}
|
|
@@ -83041,7 +83739,7 @@ var require_cli = __commonJS({
|
|
|
83041
83739
|
var promises_12 = require("node:fs/promises");
|
|
83042
83740
|
var node_stream_1 = require("node:stream");
|
|
83043
83741
|
var yargs_parser_1 = __importDefault2(require_build());
|
|
83044
|
-
var VERSION = true ? "0.1.
|
|
83742
|
+
var VERSION = true ? "0.1.10" : "dev";
|
|
83045
83743
|
var SANDBOX_ERROR_MESSAGE = `Error: Daemon commands cannot run in sandbox mode.
|
|
83046
83744
|
|
|
83047
83745
|
Claude Code's sandbox blocks Unix socket operations required for daemon IPC.
|
|
@@ -83537,6 +84235,7 @@ Run 'sidekick --help' for available options.
|
|
|
83537
84235
|
if (sessionId) {
|
|
83538
84236
|
await persistCliLogMetrics(runtime.stateService, sessionId, runtime.getLogCounts(), runtime.logger);
|
|
83539
84237
|
}
|
|
84238
|
+
await runtime.logger.flush();
|
|
83540
84239
|
return result;
|
|
83541
84240
|
}
|
|
83542
84241
|
}
|