@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 +79 -17
- package/dist/cli.js.map +1 -1
- package/dist/liveSignal.js +59 -0
- package/dist/liveSignal.js.map +1 -0
- package/dist/mapGeminiEvent.js +6 -2
- package/dist/mapGeminiEvent.js.map +1 -1
- package/package.json +1 -1
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
3311
|
-
exports.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
|
|
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
|
|
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
|
|
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
|
-
|
|
3806
|
+
events.push({ eventType: "agent_loop_long", severity: durationBucket === "60m+" ? "high" : "medium", metadata: withHost({ durationBucket, reason: "long_session", trigger: "inferred" }) });
|
|
3791
3807
|
}
|
|
3792
|
-
|
|
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,
|
|
3865
|
-
managementExitCode = await (0,
|
|
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,
|
|
3877
|
-
if (hookName === "AfterAgent") turnDurationMs = (0,
|
|
3878
|
-
await (
|
|
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":";AACA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
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"}
|
package/dist/mapGeminiEvent.js
CHANGED
|
@@ -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
|
-
|
|
36
|
+
events.push({ eventType: "agent_loop_long", severity: durationBucket === "60m+" ? "high" : "medium", metadata: withHost({ durationBucket, reason: "long_session", trigger: "inferred" }) });
|
|
36
37
|
}
|
|
37
|
-
|
|
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":"AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,WAAW,EAA2D,MAAM,YAAY,CAAC;AAElG;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAA6B,EAAE,KAAsB,EAAE,cAAuB;IAC3G,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1I,KAAK,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,yBAAyB,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;QACzI,KAAK,aAAa,CAAC,CAAC,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;QACjD,KAAK,YAAY,CAAC,CAAC,OAAO,aAAa,CAAC,cAAc,CAAC,CAAC;QACxD,KAAK,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3J,KAAK,WAAW,CAAC,CAAC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;QAE3J,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,yBAAyB;QACzB,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAsB;IAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAwB,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5I,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IACtJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,cAAkC;IACvD,MAAM,cAAc,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACxD,IAAI,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC7D,
|
|
1
|
+
{"version":3,"file":"mapGeminiEvent.js","sourceRoot":"","sources":["../src/mapGeminiEvent.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED