harnery 0.36.0 → 0.37.0
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/commander.js +4 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +87 -46
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +26 -1
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +11 -0
- package/dist/commands/diagnostics.d.ts +4 -0
- package/dist/commands/diagnostics.d.ts.map +1 -0
- package/dist/commands/diagnostics.js +229 -0
- package/dist/commands/files.d.ts +12 -0
- package/dist/commands/files.d.ts.map +1 -1
- package/dist/commands/files.js +54 -1
- package/dist/commands/governor.d.ts.map +1 -1
- package/dist/commands/governor.js +4 -0
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +71 -2
- package/dist/commands/qa-run.d.ts +4 -0
- package/dist/commands/qa-run.d.ts.map +1 -0
- package/dist/commands/qa-run.js +141 -0
- package/dist/commands/resources.d.ts +4 -0
- package/dist/commands/resources.d.ts.map +1 -0
- package/dist/commands/resources.js +29 -0
- package/dist/commands/supervisor.d.ts +4 -0
- package/dist/commands/supervisor.d.ts.map +1 -0
- package/dist/commands/supervisor.js +101 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +17 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +4 -0
- package/dist/core/agents/cli.js +7 -3
- package/dist/core/agents/health.d.ts +17 -0
- package/dist/core/agents/health.d.ts.map +1 -0
- package/dist/core/agents/health.js +109 -0
- package/dist/core/agents/mailbox.d.ts +92 -0
- package/dist/core/agents/mailbox.d.ts.map +1 -0
- package/dist/core/agents/mailbox.js +325 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts +44 -0
- package/dist/core/agents/reconcile-coordination-v3.d.ts.map +1 -0
- package/dist/core/agents/reconcile-coordination-v3.js +58 -0
- package/dist/core/agents/render/prompt-context.d.ts +5 -0
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +34 -13
- package/dist/core/agents/render/session-context.d.ts +8 -0
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +34 -3
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +50 -1
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +6 -10
- package/dist/core/agents/session-finalizer-v3.js +4 -1
- package/dist/core/artifacts/index.d.ts +26 -1
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +146 -6
- package/dist/core/config.d.ts +12 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +43 -0
- package/dist/core/diagnostics/advice.d.ts +9 -0
- package/dist/core/diagnostics/advice.d.ts.map +1 -0
- package/dist/core/diagnostics/advice.js +112 -0
- package/dist/core/diagnostics/bundle.d.ts +35 -0
- package/dist/core/diagnostics/bundle.d.ts.map +1 -0
- package/dist/core/diagnostics/bundle.js +874 -0
- package/dist/core/diagnostics/comparison.d.ts +5 -0
- package/dist/core/diagnostics/comparison.d.ts.map +1 -0
- package/dist/core/diagnostics/comparison.js +444 -0
- package/dist/core/diagnostics/contract.d.ts +245 -0
- package/dist/core/diagnostics/contract.d.ts.map +1 -0
- package/dist/core/diagnostics/contract.js +18 -0
- package/dist/core/diagnostics/identity.d.ts +3 -0
- package/dist/core/diagnostics/identity.d.ts.map +1 -0
- package/dist/core/diagnostics/identity.js +10 -0
- package/dist/core/diagnostics/index.d.ts +8 -0
- package/dist/core/diagnostics/index.d.ts.map +1 -0
- package/dist/core/diagnostics/index.js +7 -0
- package/dist/core/diagnostics/replay.d.ts +8 -0
- package/dist/core/diagnostics/replay.d.ts.map +1 -0
- package/dist/core/diagnostics/replay.js +213 -0
- package/dist/core/diagnostics/sanitize.d.ts +9 -0
- package/dist/core/diagnostics/sanitize.d.ts.map +1 -0
- package/dist/core/diagnostics/sanitize.js +84 -0
- package/dist/core/events/legacy-storage/compression.d.ts +13 -0
- package/dist/core/events/legacy-storage/compression.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/compression.js +107 -0
- package/dist/core/events/legacy-storage/index.d.ts +1 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -1
- package/dist/core/events/legacy-storage/index.js +1 -0
- package/dist/core/events/v3/archive-retention.d.ts +33 -0
- package/dist/core/events/v3/archive-retention.d.ts.map +1 -0
- package/dist/core/events/v3/archive-retention.js +195 -0
- package/dist/core/events/v3/capabilities.d.ts +1 -1
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +1 -0
- package/dist/core/events/v3/index.d.ts +1 -0
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +1 -0
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +1 -0
- package/dist/core/events/v3/producers/hook-base.d.ts +1 -1
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +13 -2
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +1 -0
- package/dist/core/events/v3/producers/recorder.d.ts +16 -0
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +88 -1
- package/dist/core/hooks/adapter/output.d.ts +8 -0
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +11 -1
- package/dist/core/hooks/cli.js +183 -192
- package/dist/core/hooks/health.d.ts +59 -0
- package/dist/core/hooks/health.d.ts.map +1 -0
- package/dist/core/hooks/health.js +84 -0
- package/dist/core/resources/contract.d.ts +90 -0
- package/dist/core/resources/contract.d.ts.map +1 -0
- package/dist/core/resources/contract.js +2 -0
- package/dist/core/resources/index.d.ts +6 -0
- package/dist/core/resources/index.d.ts.map +1 -0
- package/dist/core/resources/index.js +5 -0
- package/dist/core/resources/sampler.d.ts +27 -0
- package/dist/core/resources/sampler.d.ts.map +1 -0
- package/dist/core/resources/sampler.js +357 -0
- package/dist/core/resources/service-status.d.ts +3 -0
- package/dist/core/resources/service-status.d.ts.map +1 -0
- package/dist/core/resources/service-status.js +48 -0
- package/dist/core/resources/service.d.ts +26 -0
- package/dist/core/resources/service.d.ts.map +1 -0
- package/dist/core/resources/service.js +292 -0
- package/dist/core/resources/storage.d.ts +13 -0
- package/dist/core/resources/storage.d.ts.map +1 -0
- package/dist/core/resources/storage.js +30 -0
- package/dist/core/storage/atomic-json.d.ts +3 -0
- package/dist/core/storage/atomic-json.d.ts.map +1 -0
- package/dist/core/storage/atomic-json.js +15 -0
- package/dist/core/storage/builtins.d.ts.map +1 -1
- package/dist/core/storage/builtins.js +45 -6
- package/dist/core/storage/logger.d.ts +2 -0
- package/dist/core/storage/logger.d.ts.map +1 -1
- package/dist/core/storage/logger.js +2 -0
- package/dist/core/storage/query.d.ts +14 -0
- package/dist/core/storage/query.d.ts.map +1 -1
- package/dist/core/storage/query.js +51 -0
- package/dist/core/supervisor/activity.d.ts +4 -0
- package/dist/core/supervisor/activity.d.ts.map +1 -0
- package/dist/core/supervisor/activity.js +141 -0
- package/dist/core/supervisor/contract.d.ts +268 -0
- package/dist/core/supervisor/contract.d.ts.map +1 -0
- package/dist/core/supervisor/contract.js +35 -0
- package/dist/core/supervisor/explanations.d.ts +4 -0
- package/dist/core/supervisor/explanations.d.ts.map +1 -0
- package/dist/core/supervisor/explanations.js +71 -0
- package/dist/core/supervisor/findings.d.ts +20 -0
- package/dist/core/supervisor/findings.d.ts.map +1 -0
- package/dist/core/supervisor/findings.js +399 -0
- package/dist/core/supervisor/history.d.ts +9 -0
- package/dist/core/supervisor/history.d.ts.map +1 -0
- package/dist/core/supervisor/history.js +46 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts +14 -0
- package/dist/core/supervisor/hook-health-alerts.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-alerts.js +70 -0
- package/dist/core/supervisor/hook-health-storage.d.ts +5 -0
- package/dist/core/supervisor/hook-health-storage.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health-storage.js +24 -0
- package/dist/core/supervisor/hook-health.d.ts +72 -0
- package/dist/core/supervisor/hook-health.d.ts.map +1 -0
- package/dist/core/supervisor/hook-health.js +203 -0
- package/dist/core/supervisor/hooks.d.ts +10 -0
- package/dist/core/supervisor/hooks.d.ts.map +1 -0
- package/dist/core/supervisor/hooks.js +28 -0
- package/dist/core/supervisor/index.d.ts +15 -0
- package/dist/core/supervisor/index.d.ts.map +1 -0
- package/dist/core/supervisor/index.js +14 -0
- package/dist/core/supervisor/log-feed.d.ts +9 -0
- package/dist/core/supervisor/log-feed.d.ts.map +1 -0
- package/dist/core/supervisor/log-feed.js +103 -0
- package/dist/core/supervisor/service.d.ts +29 -0
- package/dist/core/supervisor/service.d.ts.map +1 -0
- package/dist/core/supervisor/service.js +450 -0
- package/dist/core/supervisor/services.d.ts +11 -0
- package/dist/core/supervisor/services.d.ts.map +1 -0
- package/dist/core/supervisor/services.js +155 -0
- package/dist/core/supervisor/status.d.ts +3 -0
- package/dist/core/supervisor/status.d.ts.map +1 -0
- package/dist/core/supervisor/status.js +48 -0
- package/dist/core/supervisor/storage.d.ts +30 -0
- package/dist/core/supervisor/storage.d.ts.map +1 -0
- package/dist/core/supervisor/storage.js +73 -0
- package/dist/core/supervisor/timeline.d.ts +3 -0
- package/dist/core/supervisor/timeline.d.ts.map +1 -0
- package/dist/core/supervisor/timeline.js +87 -0
- package/dist/core/workflow/admission.d.ts +23 -0
- package/dist/core/workflow/admission.d.ts.map +1 -0
- package/dist/core/workflow/admission.js +136 -0
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +77 -2
- package/dist/core/workflow/index.d.ts +3 -2
- package/dist/core/workflow/index.d.ts.map +1 -1
- package/dist/core/workflow/index.js +2 -1
- package/dist/core/workflow/proof.d.ts +2 -1
- package/dist/core/workflow/proof.d.ts.map +1 -1
- package/dist/core/workflow/proof.js +39 -1
- package/dist/core/workflow/run-state.d.ts +3 -2
- package/dist/core/workflow/run-state.d.ts.map +1 -1
- package/dist/core/workflow/run-state.js +8 -1
- package/dist/core/workflow/types.d.ts +33 -1
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/core/workflow/types.js +2 -1
- package/dist/lib/browser/client.d.ts +5 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +1 -0
- package/dist/lib/browser/index.d.ts +2 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +2 -0
- package/dist/lib/browser/qa-run-contracts.d.ts +173 -0
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -0
- package/dist/lib/browser/qa-run-contracts.js +226 -0
- package/dist/lib/browser/qa-run.d.ts +51 -0
- package/dist/lib/browser/qa-run.d.ts.map +1 -0
- package/dist/lib/browser/qa-run.js +684 -0
- package/dist/lib/coord-root-id.d.ts +9 -0
- package/dist/lib/coord-root-id.d.ts.map +1 -0
- package/dist/lib/coord-root-id.js +17 -0
- package/dist/lib/instructions/apply.d.ts +3 -1
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +74 -3
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +6 -0
- package/package.json +12 -1
- package/src/commander.ts +26 -0
- package/src/commands/agents.ts +102 -49
- package/src/commands/artifacts.ts +40 -2
- package/src/commands/browse.ts +15 -0
- package/src/commands/diagnostics.ts +271 -0
- package/src/commands/files.ts +102 -2
- package/src/commands/governor.ts +8 -0
- package/src/commands/ledger-v3.ts +82 -0
- package/src/commands/qa-run.ts +184 -0
- package/src/commands/resources.ts +38 -0
- package/src/commands/supervisor.ts +141 -0
- package/src/commands/web.ts +19 -0
- package/src/commands/workflow.ts +8 -0
- package/src/core/agents/cli.ts +7 -3
- package/src/core/agents/health.ts +142 -0
- package/src/core/agents/mailbox.ts +373 -0
- package/src/core/agents/reconcile-coordination-v3.ts +77 -0
- package/src/core/agents/render/prompt-context.ts +42 -12
- package/src/core/agents/render/session-context.ts +37 -3
- package/src/core/agents/rules/commit-conflict.ts +58 -1
- package/src/core/agents/rules/stop-hook.ts +6 -12
- package/src/core/agents/session-finalizer-v3.ts +4 -1
- package/src/core/artifacts/index.ts +196 -10
- package/src/core/config.ts +111 -2
- package/src/core/diagnostics/advice.ts +147 -0
- package/src/core/diagnostics/bundle.ts +1142 -0
- package/src/core/diagnostics/comparison.ts +565 -0
- package/src/core/diagnostics/contract.ts +311 -0
- package/src/core/diagnostics/identity.ts +11 -0
- package/src/core/diagnostics/index.ts +7 -0
- package/src/core/diagnostics/replay.ts +314 -0
- package/src/core/diagnostics/sanitize.ts +97 -0
- package/src/core/events/legacy-storage/compression.ts +130 -0
- package/src/core/events/legacy-storage/index.ts +1 -0
- package/src/core/events/v3/archive-retention.ts +251 -0
- package/src/core/events/v3/capabilities.ts +2 -0
- package/src/core/events/v3/index.ts +9 -0
- package/src/core/events/v3/live-routing.ts +1 -0
- package/src/core/events/v3/producers/hook-base.ts +14 -2
- package/src/core/events/v3/producers/intake.ts +1 -0
- package/src/core/events/v3/producers/recorder.ts +110 -1
- package/src/core/hooks/adapter/output.ts +12 -1
- package/src/core/hooks/cli.ts +192 -215
- package/src/core/hooks/health.ts +146 -0
- package/src/core/resources/contract.ts +98 -0
- package/src/core/resources/index.ts +5 -0
- package/src/core/resources/sampler.ts +458 -0
- package/src/core/resources/service-status.ts +62 -0
- package/src/core/resources/service.ts +337 -0
- package/src/core/resources/storage.ts +44 -0
- package/src/core/storage/atomic-json.ts +15 -0
- package/src/core/storage/builtins.ts +62 -6
- package/src/core/storage/logger.ts +2 -0
- package/src/core/storage/query.ts +58 -0
- package/src/core/supervisor/activity.ts +193 -0
- package/src/core/supervisor/contract.ts +312 -0
- package/src/core/supervisor/explanations.ts +104 -0
- package/src/core/supervisor/findings.ts +788 -0
- package/src/core/supervisor/history.ts +61 -0
- package/src/core/supervisor/hook-health-alerts.ts +108 -0
- package/src/core/supervisor/hook-health-storage.ts +25 -0
- package/src/core/supervisor/hook-health.ts +301 -0
- package/src/core/supervisor/hooks.ts +35 -0
- package/src/core/supervisor/index.ts +14 -0
- package/src/core/supervisor/log-feed.ts +131 -0
- package/src/core/supervisor/service.ts +511 -0
- package/src/core/supervisor/services.ts +203 -0
- package/src/core/supervisor/status.ts +59 -0
- package/src/core/supervisor/storage.ts +126 -0
- package/src/core/supervisor/timeline.ts +133 -0
- package/src/core/workflow/admission.ts +215 -0
- package/src/core/workflow/engine.ts +93 -1
- package/src/core/workflow/index.ts +10 -0
- package/src/core/workflow/proof.ts +54 -1
- package/src/core/workflow/run-state.ts +13 -1
- package/src/core/workflow/types.ts +39 -1
- package/src/lib/browser/client.ts +6 -0
- package/src/lib/browser/index.ts +29 -0
- package/src/lib/browser/qa-run-contracts.ts +380 -0
- package/src/lib/browser/qa-run.ts +784 -0
- package/src/lib/coord-root-id.ts +23 -0
- package/src/lib/instructions/apply.ts +81 -2
- package/src/lib/instructions/templates.ts +6 -0
|
@@ -141,6 +141,14 @@ interface TurnHarnessTimingV3 {
|
|
|
141
141
|
slowest_hook_ms: number;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
+
interface CursorResponseRitualV3 {
|
|
145
|
+
turn_id: `tid_${string}`;
|
|
146
|
+
native_turn_id?: string;
|
|
147
|
+
observed_at: string;
|
|
148
|
+
status_box_present: boolean;
|
|
149
|
+
status_box_present_strict: boolean;
|
|
150
|
+
}
|
|
151
|
+
|
|
144
152
|
interface PendingEventV3 {
|
|
145
153
|
source_id?: `hid_${string}`;
|
|
146
154
|
event: EventV3;
|
|
@@ -201,6 +209,10 @@ export interface HookProducerStateV3 {
|
|
|
201
209
|
current_turn_id?: `tid_${string}`;
|
|
202
210
|
/** Native turn identity retained owner-only for transcript attribution. */
|
|
203
211
|
current_native_turn_id?: string;
|
|
212
|
+
/** Latest completed assistant response for Cursor's open turn. The response
|
|
213
|
+
* body is discarded by agent-hook; only these booleans survive until Stop
|
|
214
|
+
* copies them into the authoritative turn.completed ritual observation. */
|
|
215
|
+
cursor_response_ritual?: CursorResponseRitualV3;
|
|
204
216
|
tool_call_count: number;
|
|
205
217
|
tool_call_count_turn_id?: `tid_${string}`;
|
|
206
218
|
last_event_id?: `evt_${string}`;
|
|
@@ -288,6 +300,12 @@ export type RecordHookSignalV3Result =
|
|
|
288
300
|
/** A late signal for a span already closed in memory; preserved in diagnostics, never re-opened. */
|
|
289
301
|
| { state: "suppressed"; reason: "closed_span" }
|
|
290
302
|
| { state: "ignored" }
|
|
303
|
+
| {
|
|
304
|
+
state: "observed";
|
|
305
|
+
generation_id: `gen_${string}`;
|
|
306
|
+
turn_id: `tid_${string}`;
|
|
307
|
+
observed_at: string;
|
|
308
|
+
}
|
|
291
309
|
/** Durably queued in the intake spool; a lease holder or drain hook records it. */
|
|
292
310
|
| { state: "spooled" }
|
|
293
311
|
| { state: "recorded"; event: EventV3; durability: WriteEventV3Result; recovered: boolean };
|
|
@@ -871,6 +889,51 @@ function processHookSignalLocked(
|
|
|
871
889
|
// Sample once for the native event and every span it opens or closes so
|
|
872
890
|
// their self-contained timing cannot drift by a millisecond.
|
|
873
891
|
const eventClock = signalClock(input);
|
|
892
|
+
if (input.signal === "after-agent-response") {
|
|
893
|
+
if (
|
|
894
|
+
input.adapter !== "cursor" ||
|
|
895
|
+
!state.current_turn_id ||
|
|
896
|
+
!state.current_turn_span ||
|
|
897
|
+
!input.turn_ritual
|
|
898
|
+
) {
|
|
899
|
+
writeProducerDiagnosticV3(input.coordRoot, "cursor_response_ritual_unbound", {
|
|
900
|
+
adapter: input.adapter,
|
|
901
|
+
instance_id: input.instance_id,
|
|
902
|
+
generation_id: state.generation_id,
|
|
903
|
+
signal: input.signal,
|
|
904
|
+
reason: !state.current_turn_id
|
|
905
|
+
? "no_open_turn"
|
|
906
|
+
: !state.current_turn_span
|
|
907
|
+
? "no_open_turn_span"
|
|
908
|
+
: "ritual_observation_missing",
|
|
909
|
+
});
|
|
910
|
+
publishProducerState(path, state);
|
|
911
|
+
return { state: "ignored" };
|
|
912
|
+
}
|
|
913
|
+
const observation: CursorResponseRitualV3 = {
|
|
914
|
+
turn_id: state.current_turn_id,
|
|
915
|
+
...(input.payload.turn_id ? { native_turn_id: input.payload.turn_id } : {}),
|
|
916
|
+
observed_at: eventClock.observed_at,
|
|
917
|
+
status_box_present: input.turn_ritual.status_box_present,
|
|
918
|
+
status_box_present_strict: input.turn_ritual.status_box_present_strict,
|
|
919
|
+
};
|
|
920
|
+
state.cursor_response_ritual = observation;
|
|
921
|
+
publishProducerState(path, state);
|
|
922
|
+
writeProducerDiagnosticV3(input.coordRoot, "cursor_response_ritual_observed", {
|
|
923
|
+
instance_id: state.instance_id,
|
|
924
|
+
generation_id: state.generation_id,
|
|
925
|
+
turn_id: observation.turn_id,
|
|
926
|
+
...(observation.native_turn_id ? { native_turn_id: observation.native_turn_id } : {}),
|
|
927
|
+
response_observed_at: observation.observed_at,
|
|
928
|
+
status_box_present_strict: observation.status_box_present_strict,
|
|
929
|
+
});
|
|
930
|
+
return {
|
|
931
|
+
state: "observed",
|
|
932
|
+
generation_id: state.generation_id,
|
|
933
|
+
turn_id: observation.turn_id,
|
|
934
|
+
observed_at: observation.observed_at,
|
|
935
|
+
};
|
|
936
|
+
}
|
|
874
937
|
if (input.signal === "user-prompt-submit" && !state.current_turn_span) {
|
|
875
938
|
state.current_turn_span = openSpanStateV3({
|
|
876
939
|
span_id: spanIdV3(),
|
|
@@ -1096,6 +1159,38 @@ function processHookSignalLocked(
|
|
|
1096
1159
|
// Before the signal's own event: the tool call or turn that carries the
|
|
1097
1160
|
// new effort already ran under it, so it must ride the new attestation.
|
|
1098
1161
|
maybeAttestTuningChange(input, state, path, rootId);
|
|
1162
|
+
const cursorResponseRitual =
|
|
1163
|
+
input.adapter === "cursor" &&
|
|
1164
|
+
(input.signal === "stop" || input.signal === "stop-failure") &&
|
|
1165
|
+
state.current_turn_id &&
|
|
1166
|
+
state.cursor_response_ritual?.turn_id === state.current_turn_id
|
|
1167
|
+
? state.cursor_response_ritual
|
|
1168
|
+
: undefined;
|
|
1169
|
+
const terminalTurnRitual =
|
|
1170
|
+
input.adapter === "cursor" && (input.signal === "stop" || input.signal === "stop-failure")
|
|
1171
|
+
? cursorResponseRitual
|
|
1172
|
+
? {
|
|
1173
|
+
status_box_present: cursorResponseRitual.status_box_present,
|
|
1174
|
+
status_box_present_strict: cursorResponseRitual.status_box_present_strict,
|
|
1175
|
+
session_name_required: false,
|
|
1176
|
+
session_name_present: false,
|
|
1177
|
+
}
|
|
1178
|
+
: undefined
|
|
1179
|
+
: input.turn_ritual;
|
|
1180
|
+
if (cursorResponseRitual) {
|
|
1181
|
+
writeProducerDiagnosticV3(input.coordRoot, "cursor_response_ritual_consumed", {
|
|
1182
|
+
instance_id: state.instance_id,
|
|
1183
|
+
generation_id: state.generation_id,
|
|
1184
|
+
turn_id: cursorResponseRitual.turn_id,
|
|
1185
|
+
...(cursorResponseRitual.native_turn_id
|
|
1186
|
+
? { response_native_turn_id: cursorResponseRitual.native_turn_id }
|
|
1187
|
+
: {}),
|
|
1188
|
+
...(input.payload.turn_id ? { stop_native_turn_id: input.payload.turn_id } : {}),
|
|
1189
|
+
response_observed_at: cursorResponseRitual.observed_at,
|
|
1190
|
+
stop_observed_at: eventClock.observed_at,
|
|
1191
|
+
status_box_present_strict: cursorResponseRitual.status_box_present_strict,
|
|
1192
|
+
});
|
|
1193
|
+
}
|
|
1099
1194
|
const event = normalizeHookEventV3(input.signal, eventInput.payload, {
|
|
1100
1195
|
coordRoot: input.coordRoot,
|
|
1101
1196
|
adapter: input.adapter,
|
|
@@ -1154,7 +1249,7 @@ function processHookSignalLocked(
|
|
|
1154
1249
|
child_generation_id: delegation?.child_generation_id,
|
|
1155
1250
|
agent_role: delegation?.role,
|
|
1156
1251
|
stop_remediation: input.stop_remediation,
|
|
1157
|
-
turn_ritual:
|
|
1252
|
+
turn_ritual: terminalTurnRitual,
|
|
1158
1253
|
});
|
|
1159
1254
|
if (!event) return { state: "ignored" };
|
|
1160
1255
|
if (
|
|
@@ -3258,6 +3353,8 @@ function hookSignalCapability(signal: HookSignalV3): AdapterSignalV3 {
|
|
|
3258
3353
|
return "session_end";
|
|
3259
3354
|
case "user-prompt-submit":
|
|
3260
3355
|
return "prompt";
|
|
3356
|
+
case "after-agent-response":
|
|
3357
|
+
return "assistant_reply_text";
|
|
3261
3358
|
case "stop":
|
|
3262
3359
|
case "stop-failure":
|
|
3263
3360
|
return "turn_completion";
|
|
@@ -3515,6 +3612,7 @@ function applyCommittedEvent(state: HookProducerStateV3, event: EventV3): void {
|
|
|
3515
3612
|
if (event.event_type === "turn.started") {
|
|
3516
3613
|
const nextTurnId = (event.scope as { turn_id: `tid_${string}` }).turn_id;
|
|
3517
3614
|
state.current_turn_id = nextTurnId;
|
|
3615
|
+
state.cursor_response_ritual = undefined;
|
|
3518
3616
|
state.session_start_derivation = undefined;
|
|
3519
3617
|
if (state.tool_call_count_turn_id !== nextTurnId) {
|
|
3520
3618
|
state.tool_call_count = 0;
|
|
@@ -3600,6 +3698,7 @@ function applyCommittedEvent(state: HookProducerStateV3, event: EventV3): void {
|
|
|
3600
3698
|
}
|
|
3601
3699
|
state.current_turn_id = undefined;
|
|
3602
3700
|
state.current_native_turn_id = undefined;
|
|
3701
|
+
state.cursor_response_ritual = undefined;
|
|
3603
3702
|
state.current_turn_span = undefined;
|
|
3604
3703
|
state.tool_call_count = 0;
|
|
3605
3704
|
state.tool_call_count_turn_id = undefined;
|
|
@@ -3904,6 +4003,7 @@ function readProducerState(path: string): HookProducerStateV3 {
|
|
|
3904
4003
|
"current_native_turn_id",
|
|
3905
4004
|
"current_turn_span",
|
|
3906
4005
|
"cursor_mode",
|
|
4006
|
+
"cursor_response_ritual",
|
|
3907
4007
|
"delegations",
|
|
3908
4008
|
"epoch_genesis_id",
|
|
3909
4009
|
"format",
|
|
@@ -4021,6 +4121,15 @@ function readProducerState(path: string): HookProducerStateV3 {
|
|
|
4021
4121
|
(typeof state.current_native_turn_id !== "string" ||
|
|
4022
4122
|
state.current_native_turn_id.length === 0 ||
|
|
4023
4123
|
state.current_native_turn_id.length > 512)) ||
|
|
4124
|
+
(state.cursor_response_ritual !== undefined &&
|
|
4125
|
+
(!/^tid_[a-f0-9]{64}$/.test(state.cursor_response_ritual.turn_id) ||
|
|
4126
|
+
(state.cursor_response_ritual.native_turn_id !== undefined &&
|
|
4127
|
+
(typeof state.cursor_response_ritual.native_turn_id !== "string" ||
|
|
4128
|
+
state.cursor_response_ritual.native_turn_id.length === 0 ||
|
|
4129
|
+
state.cursor_response_ritual.native_turn_id.length > 512)) ||
|
|
4130
|
+
!Number.isFinite(Date.parse(state.cursor_response_ritual.observed_at)) ||
|
|
4131
|
+
typeof state.cursor_response_ritual.status_box_present !== "boolean" ||
|
|
4132
|
+
typeof state.cursor_response_ritual.status_box_present_strict !== "boolean")) ||
|
|
4024
4133
|
(state.last_event_id !== undefined && !/^evt_[0-9a-f-]{36}$/.test(state.last_event_id)) ||
|
|
4025
4134
|
(state.last_monotonic_ns !== undefined && !/^\d+$/.test(state.last_monotonic_ns)) ||
|
|
4026
4135
|
(state.last_observed_at !== undefined &&
|
|
@@ -31,10 +31,21 @@ export type SystemEvent =
|
|
|
31
31
|
| "PreToolUse"
|
|
32
32
|
| "PostToolUse";
|
|
33
33
|
|
|
34
|
+
/**
|
|
35
|
+
* Whether this adapter can actually receive injected context for an event.
|
|
36
|
+
* Cursor's beforeSubmitPrompt hook can allow or block a turn but cannot inject
|
|
37
|
+
* model context, so anything rendered for that event is discarded. A caller
|
|
38
|
+
* that consumes state to build the text (draining a mailbox, for instance)
|
|
39
|
+
* must check this first, or the state is spent on output nobody reads.
|
|
40
|
+
*/
|
|
41
|
+
export function canReceiveContext(adapter: Adapter, event: SystemEvent): boolean {
|
|
42
|
+
return !(adapter === "cursor" && event === "UserPromptSubmit");
|
|
43
|
+
}
|
|
44
|
+
|
|
34
45
|
/** Emit a context-injection (peer table, wiring check, council pending, …). */
|
|
35
46
|
export function emitContext(adapter: Adapter, event: SystemEvent, text: string): void {
|
|
36
47
|
if (!text || text.length === 0) return;
|
|
37
|
-
if (adapter
|
|
48
|
+
if (!canReceiveContext(adapter, event)) return;
|
|
38
49
|
const json = buildContextJson(adapter, event, text);
|
|
39
50
|
process.stdout.write(`${JSON.stringify(json)}\n`);
|
|
40
51
|
}
|