@ascenda-one/gemini-hooks 0.1.21 → 0.1.23

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/cli.js CHANGED
@@ -429,6 +429,16 @@ var require_metricKeys = __commonJS({
429
429
  linesChangedBucket: { readBy: ["backend"], backendAliases: ["linesChangedBucket", "lines_changed_bucket"] },
430
430
  // ── Read by the local handoff only ──────────────────────────────────────
431
431
  activeMinutes: { readBy: ["handoff"], unit: "minutes" },
432
+ syntheticPromptLines: {
433
+ readBy: ["handoff"],
434
+ unit: "lines",
435
+ note: "Main-thread user lines the runtime wrote on the person's behalf (notifications, its own bookkeeping, slash-command wrappers, interrupt markers) and promptCount left out. Claude Code only; the receipt for the handoff's promptBasis: typed."
436
+ },
437
+ interruptedRuns: {
438
+ readBy: ["handoff"],
439
+ unit: "runs",
440
+ note: "Agent turns the person cut short with an interrupt while the turn was still going. A count per session, never a rate. Claude Code only; a handoff that counted them says so with interruptedRunsCounted, and absent means not counted, never zero."
441
+ },
432
442
  /**
433
443
  * The two halves of `activeMinutes`, and deliberately two keys.
434
444
  *
@@ -715,6 +725,11 @@ var require_out = __commonJS({
715
725
  context_compression_manual: "neutral",
716
726
  context_compression_auto: "neutral",
717
727
  editor_activity: "neutral",
728
+ // The agent finished a turn and handed back to the person. A boundary, not
729
+ // work: it closes the agent's stretch and opens the person's, which the next
730
+ // `ai_prompt_submitted` closes. Neutral so a marker sent once per turn
731
+ // doesn't weigh on any workload leg.
732
+ ai_turn_completed: "neutral",
718
733
  // Semantic (agent-observed) — see SEMANTIC_WORK_SIGNAL_EVENT_TYPES.
719
734
  approach_churn_detected: "risk",
720
735
  goal_drift_detected: "risk",
@@ -745,12 +760,12 @@ var require_payload = __commonJS({
745
760
  "use strict";
746
761
  Object.defineProperty(exports, "__esModule", { value: true });
747
762
  exports.mintIdempotencyKey = mintIdempotencyKey;
748
- exports.getString = getString2;
763
+ exports.getString = getString3;
749
764
  exports.getNumber = getNumber;
750
765
  exports.getNested = getNested;
751
766
  exports.getNestedString = getNestedString2;
752
767
  exports.getNestedNumber = getNestedNumber;
753
- exports.inferOutcome = inferOutcome2;
768
+ exports.inferOutcome = inferOutcome3;
754
769
  exports.outcomeForHook = outcomeForHook;
755
770
  exports.looksLikeCorrection = looksLikeCorrection2;
756
771
  var node_crypto_1 = __require("node:crypto");
@@ -761,7 +776,7 @@ var require_payload = __commonJS({
761
776
  throw new Error("idempotency key exceeds the wire limit");
762
777
  return key;
763
778
  }
764
- function getString2(input, keys) {
779
+ function getString3(input, keys) {
765
780
  for (const key of keys) {
766
781
  const value = input[key];
767
782
  if (typeof value === "string" && value.trim())
@@ -802,11 +817,11 @@ var require_payload = __commonJS({
802
817
  }
803
818
  return void 0;
804
819
  }
805
- function inferOutcome2(input) {
820
+ function inferOutcome3(input) {
806
821
  const exitCode = getNumber(input, ["exitCode", "exit_code", "status"]) ?? getNestedNumber(input, [["tool_response", "exitCode"], ["tool_response", "exit_code"], ["result", "exitCode"], ["result", "exit_code"]]);
807
822
  if (typeof exitCode === "number")
808
823
  return exitCode === 0 ? "success" : "failure";
809
- const error = getString2(input, ["error", "errorMessage"]) ?? getNestedString2(input, [["tool_response", "error"], ["result", "error"]]);
824
+ const error = getString3(input, ["error", "errorMessage"]) ?? getNestedString2(input, [["tool_response", "error"], ["result", "error"]]);
810
825
  if (error)
811
826
  return "failure";
812
827
  return "unknown";
@@ -3307,8 +3322,8 @@ var require_liveBus = __commonJS({
3307
3322
  Object.defineProperty(exports, "__esModule", { value: true });
3308
3323
  exports.liveBusSocketCandidates = liveBusSocketCandidates;
3309
3324
  exports.liveBusSocketPath = liveBusSocketPath;
3310
- exports.bucketPromptSize = bucketPromptSize;
3311
- exports.emitLiveSignal = emitLiveSignal;
3325
+ exports.bucketPromptSize = bucketPromptSize2;
3326
+ exports.emitLiveSignal = emitLiveSignal2;
3312
3327
  var fs = __importStar(__require("fs"));
3313
3328
  var net = __importStar(__require("net"));
3314
3329
  var os2 = __importStar(__require("os"));
@@ -3338,7 +3353,7 @@ var require_liveBus = __commonJS({
3338
3353
  }
3339
3354
  return candidates[0];
3340
3355
  }
3341
- function bucketPromptSize(text) {
3356
+ function bucketPromptSize2(text) {
3342
3357
  const length = typeof text === "string" ? text.length : 0;
3343
3358
  if (length <= 280)
3344
3359
  return "s";
@@ -3348,7 +3363,7 @@ var require_liveBus = __commonJS({
3348
3363
  return "l";
3349
3364
  return "xl";
3350
3365
  }
3351
- function emitLiveSignal(signal) {
3366
+ function emitLiveSignal2(signal) {
3352
3367
  return new Promise((resolve) => {
3353
3368
  let settled = false;
3354
3369
  const done = () => {
@@ -3742,7 +3757,7 @@ var require_out2 = __commonJS({
3742
3757
  });
3743
3758
 
3744
3759
  // src/cli.ts
3745
- var import_tool_kit2 = __toESM(require_out2(), 1);
3760
+ var import_tool_kit3 = __toESM(require_out2(), 1);
3746
3761
 
3747
3762
  // src/mapGeminiEvent.ts
3748
3763
  var import_tool_kit = __toESM(require_out2(), 1);
@@ -3786,10 +3801,12 @@ function mapBeforeAgent(input) {
3786
3801
  }
3787
3802
  function mapAfterAgent(turnDurationMs) {
3788
3803
  const durationBucket = (0, import_tool_kit.bucketDurationMs)(turnDurationMs);
3804
+ const events = [];
3789
3805
  if (durationBucket === "30-60m" || durationBucket === "60m+") {
3790
- return [{ eventType: "agent_loop_long", severity: durationBucket === "60m+" ? "high" : "medium", metadata: withHost({ durationBucket, reason: "long_session", trigger: "inferred" }) }];
3806
+ events.push({ eventType: "agent_loop_long", severity: durationBucket === "60m+" ? "high" : "medium", metadata: withHost({ durationBucket, reason: "long_session", trigger: "inferred" }) });
3791
3807
  }
3792
- return [];
3808
+ events.push({ eventType: "ai_turn_completed", severity: "low", metadata: withHost(durationBucket ? { durationBucket } : {}) });
3809
+ return events;
3793
3810
  }
3794
3811
  function mapAfterTool(input) {
3795
3812
  const toolName = getToolName(input);
@@ -3832,6 +3849,27 @@ function withHost(metadata) {
3832
3849
  return { host: GEMINI_HOST, ...metadata };
3833
3850
  }
3834
3851
 
3852
+ // src/liveSignal.ts
3853
+ var import_tool_kit2 = __toESM(require_out2(), 1);
3854
+ function liveSignalFor(hookName, input) {
3855
+ switch (hookName) {
3856
+ case "BeforeAgent": {
3857
+ const prompt = (0, import_tool_kit2.getString)(input, ["prompt"]);
3858
+ return prompt === void 0 ? { event: "prompt_submitted" } : { event: "prompt_submitted", sizeBucket: (0, import_tool_kit2.bucketPromptSize)(prompt) };
3859
+ }
3860
+ case "BeforeTool":
3861
+ return { event: "tool_call" };
3862
+ case "AfterTool":
3863
+ return (0, import_tool_kit2.inferOutcome)(input) === "failure" ? { event: "tool_failure" } : void 0;
3864
+ case "PreCompress":
3865
+ return { event: "compaction" };
3866
+ case "AfterAgent":
3867
+ return { event: "stop" };
3868
+ default:
3869
+ return void 0;
3870
+ }
3871
+ }
3872
+
3835
3873
  // src/setup.ts
3836
3874
  import * as os from "os";
3837
3875
  import * as path from "path";
@@ -3861,8 +3899,8 @@ var SETUP = {
3861
3899
 
3862
3900
  // src/cli.ts
3863
3901
  async function main() {
3864
- if ((0, import_tool_kit2.isCliAgentManagementCommand)(process.argv[2])) {
3865
- managementExitCode = await (0, import_tool_kit2.runCliAgentSetup)(process.argv.slice(2), SETUP);
3902
+ if ((0, import_tool_kit3.isCliAgentManagementCommand)(process.argv[2])) {
3903
+ managementExitCode = await (0, import_tool_kit3.runCliAgentSetup)(process.argv.slice(2), SETUP);
3866
3904
  return;
3867
3905
  }
3868
3906
  const input = await readJsonFromStdin();
@@ -3873,9 +3911,10 @@ async function main() {
3873
3911
  }
3874
3912
  const sessionId = typeof input.session_id === "string" ? input.session_id : void 0;
3875
3913
  let turnDurationMs;
3876
- if (hookName === "BeforeAgent") (0, import_tool_kit2.recordTurnStart)(GEMINI_HOST, sessionId);
3877
- if (hookName === "AfterAgent") turnDurationMs = (0, import_tool_kit2.consumeTurnDurationMs)(GEMINI_HOST, sessionId);
3878
- await (0, import_tool_kit2.deliverHookEvents)(mapGeminiEvent(hookName, input, turnDurationMs), {
3914
+ if (hookName === "BeforeAgent") (0, import_tool_kit3.recordTurnStart)(GEMINI_HOST, sessionId);
3915
+ if (hookName === "AfterAgent") turnDurationMs = (0, import_tool_kit3.consumeTurnDurationMs)(GEMINI_HOST, sessionId);
3916
+ await emitLive(hookName, input, sessionId);
3917
+ await (0, import_tool_kit3.deliverHookEvents)(mapGeminiEvent(hookName, input, turnDurationMs), {
3879
3918
  toolType: ASCENDA_TOOL_TYPE,
3880
3919
  host: GEMINI_HOST,
3881
3920
  setupCommand: `npx ${SETUP.packageName} setup`,
@@ -3883,6 +3922,29 @@ async function main() {
3883
3922
  sessionId
3884
3923
  });
3885
3924
  }
3925
+ async function emitLive(hookName, input, sessionId) {
3926
+ const body = liveSignalFor(hookName, input);
3927
+ if (!body) return;
3928
+ try {
3929
+ await (0, import_tool_kit3.emitLiveSignal)({
3930
+ // This host's own name, not the shared `cli_agent` tool type the cloud
3931
+ // path files these events under. The app keys one decaying envelope per
3932
+ // `tool/session` pair, so reporting a value shared with the other CLI
3933
+ // adapters would fuse three different agents into one stream and make
3934
+ // the concurrency gauge under-count. `ASCENDA_TOOL_TYPE` is deliberately
3935
+ // *not* honoured here for the same reason: it is the cloud tool type,
3936
+ // and on this adapter that value is the shared one.
3937
+ tool: GEMINI_HOST,
3938
+ // Concurrent sessions must count as separate streams for the X gauge.
3939
+ // Without a session id every window collapses into one, so fall back to
3940
+ // this process's parent — still per-session in practice, since the hook
3941
+ // is spawned from the session process.
3942
+ session: sessionId ?? `ppid-${process.ppid}`,
3943
+ ...body
3944
+ });
3945
+ } catch {
3946
+ }
3947
+ }
3886
3948
  var managementExitCode;
3887
3949
  async function readJsonFromStdin() {
3888
3950
  const chunks = [];
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { bucketPromptSize, getString, inferOutcome } from "@ascenda-one/tool-kit";
2
+ /**
3
+ * Maps Gemini CLI hooks onto the desktop waterline's much smaller vocabulary
4
+ * (`LiveBusEvent` in `@ascenda-one/tool-kit`;
5
+ * `docs/MACOS_LIVE_DEMAND_WATERLINE.md` in the app repo).
6
+ *
7
+ * This is **not** the telemetry mapping and shares nothing with
8
+ * `mapGeminiEvent`. That one feeds daily buckets read hours later; this one
9
+ * drives gauges, the Away Mode keep-awake assertion and the settle bell, all
10
+ * of which need to know only that agent work is happening right now.
11
+ *
12
+ * Deliberately partial, and deliberately leading-edge:
13
+ *
14
+ * - `BeforeAgent` is the turn's opening beat and `AfterAgent` its close, so
15
+ * they carry `prompt_submitted` and `stop`. Gemini's `SessionStart` and
16
+ * `SessionEnd` bracket a whole CLI run rather than a turn and add nothing
17
+ * the pair above does not already say; `SessionEnd` in particular would
18
+ * be a second `stop` immediately after the last `AfterAgent`, which the
19
+ * saver would draw as two session ends.
20
+ * - `BeforeTool`, not `AfterTool`, carries the cadence heartbeat, so the
21
+ * gauge rises as the agent starts rather than after it finishes.
22
+ * - `AfterTool` therefore speaks only when the call **failed**. Gemini has
23
+ * no separate failure hook, so the outcome is read off the payload the
24
+ * same way the telemetry mapper reads it.
25
+ * - `PreCompress` is Gemini's compaction.
26
+ * - `BeforeModel`/`AfterModel`/`BeforeToolSelection` fire per LLM round trip
27
+ * and are silent here for the same reason they are silent in the
28
+ * telemetry mapper: the tool hooks already carry that cadence, and these
29
+ * would multiply it several-fold.
30
+ *
31
+ * `undefined` means silence, which is the right answer for most hooks. An
32
+ * event the app cannot parse is worse than none, because it looks like it
33
+ * works.
34
+ */
35
+ export function liveSignalFor(hookName, input) {
36
+ switch (hookName) {
37
+ case "BeforeAgent": {
38
+ const prompt = getString(input, ["prompt"]);
39
+ // The bucket is computed here so only the bucket crosses the socket.
40
+ // Omitted when the payload carried no prompt: the aggregator falls
41
+ // back to its own middle attack height, which is a better reading than
42
+ // asserting a size we did not observe.
43
+ return prompt === undefined ? { event: "prompt_submitted" } : { event: "prompt_submitted", sizeBucket: bucketPromptSize(prompt) };
44
+ }
45
+ case "BeforeTool": return { event: "tool_call" };
46
+ case "AfterTool": return inferOutcome(input) === "failure" ? { event: "tool_failure" } : undefined;
47
+ case "PreCompress": return { event: "compaction" };
48
+ case "AfterAgent": return { event: "stop" };
49
+ default: return undefined;
50
+ }
51
+ }
52
+ /**
53
+ * `queued` is absent from every Gemini signal, and that is a measurement, not
54
+ * an omission. Gemini's hook payloads carry nothing that says a turn came out
55
+ * of the user's queue, and the field is tri-state precisely so a tool that
56
+ * cannot know says nothing rather than saying "no" (see `LiveBusSignal` and
57
+ * `LiveSignal.queued` in the app). Only the Claude Code adapter can answer.
58
+ */
59
+ //# sourceMappingURL=liveSignal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liveSignal.js","sourceRoot":"","sources":["../src/liveSignal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAOlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,aAAa,CAAC,QAA6B,EAAE,KAAsB;IACjF,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5C,qEAAqE;YACrE,mEAAmE;YACnE,uEAAuE;YACvE,uCAAuC;YACvC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QACpI,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QACjD,KAAK,WAAW,CAAC,CAAC,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACnG,KAAK,aAAa,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QACnD,KAAK,YAAY,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC5C,OAAO,CAAC,CAAC,OAAO,SAAS,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;;GAMG"}
@@ -31,10 +31,14 @@ function mapBeforeAgent(input) {
31
31
  }
32
32
  function mapAfterAgent(turnDurationMs) {
33
33
  const durationBucket = bucketDurationMs(turnDurationMs);
34
+ const events = [];
34
35
  if (durationBucket === "30-60m" || durationBucket === "60m+") {
35
- return [{ eventType: "agent_loop_long", severity: durationBucket === "60m+" ? "high" : "medium", metadata: withHost({ durationBucket, reason: "long_session", trigger: "inferred" }) }];
36
+ events.push({ eventType: "agent_loop_long", severity: durationBucket === "60m+" ? "high" : "medium", metadata: withHost({ durationBucket, reason: "long_session", trigger: "inferred" }) });
36
37
  }
37
- return [];
38
+ // Every turn ends here, long or short. Pushed last so a send that isn't
39
+ // accepted can't cost the long-loop signal ahead of it.
40
+ events.push({ eventType: "ai_turn_completed", severity: "low", metadata: withHost(durationBucket ? { durationBucket } : {}) });
41
+ return events;
38
42
  }
39
43
  function mapAfterTool(input) {
40
44
  const toolName = getToolName(input);
@@ -1 +1 @@
1
- {"version":3,"file":"mapGeminiEvent.js","sourceRoot":"","sources":["../src/mapGeminiEvent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mapGeminiEvent.js","sourceRoot":"","sources":["../src/mapGeminiEvent.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "publishConfig": { "access": "public" },
3
3
  "name": "@ascenda-one/gemini-hooks",
4
- "version": "0.1.21",
4
+ "version": "0.1.23",
5
5
  "description": "Gemini CLI hooks adapter for Ascenda AI workload telemetry",
6
6
  "repository": {
7
7
  "type": "git",