instar 1.3.236 → 1.3.237

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.
Files changed (43) hide show
  1. package/dist/core/ParallelActivityIndex.d.ts +62 -0
  2. package/dist/core/ParallelActivityIndex.d.ts.map +1 -0
  3. package/dist/core/ParallelActivityIndex.js +129 -0
  4. package/dist/core/ParallelActivityIndex.js.map +1 -0
  5. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  6. package/dist/core/PostUpdateMigrator.js +16 -0
  7. package/dist/core/PostUpdateMigrator.js.map +1 -1
  8. package/dist/monitoring/GeminiLoopDriver.d.ts +112 -0
  9. package/dist/monitoring/GeminiLoopDriver.d.ts.map +1 -0
  10. package/dist/monitoring/GeminiLoopDriver.js +111 -0
  11. package/dist/monitoring/GeminiLoopDriver.js.map +1 -0
  12. package/dist/monitoring/ParallelWorkOverlap.d.ts +59 -0
  13. package/dist/monitoring/ParallelWorkOverlap.d.ts.map +1 -0
  14. package/dist/monitoring/ParallelWorkOverlap.js +86 -0
  15. package/dist/monitoring/ParallelWorkOverlap.js.map +1 -0
  16. package/dist/monitoring/ParallelWorkSentinel.d.ts +59 -0
  17. package/dist/monitoring/ParallelWorkSentinel.d.ts.map +1 -0
  18. package/dist/monitoring/ParallelWorkSentinel.js +79 -0
  19. package/dist/monitoring/ParallelWorkSentinel.js.map +1 -0
  20. package/dist/providers/adapters/gemini-cli/transport/geminiSpawn.d.ts +14 -0
  21. package/dist/providers/adapters/gemini-cli/transport/geminiSpawn.d.ts.map +1 -1
  22. package/dist/providers/adapters/gemini-cli/transport/geminiSpawn.js +16 -0
  23. package/dist/providers/adapters/gemini-cli/transport/geminiSpawn.js.map +1 -1
  24. package/dist/scaffold/templates.d.ts.map +1 -1
  25. package/dist/scaffold/templates.js +4 -0
  26. package/dist/scaffold/templates.js.map +1 -1
  27. package/dist/server/AgentServer.d.ts +1 -0
  28. package/dist/server/AgentServer.d.ts.map +1 -1
  29. package/dist/server/AgentServer.js +30 -0
  30. package/dist/server/AgentServer.js.map +1 -1
  31. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  32. package/dist/server/CapabilityIndex.js +9 -0
  33. package/dist/server/CapabilityIndex.js.map +1 -1
  34. package/dist/server/routes.d.ts +2 -0
  35. package/dist/server/routes.d.ts.map +1 -1
  36. package/dist/server/routes.js +17 -0
  37. package/dist/server/routes.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/data/builtin-manifest.json +64 -64
  40. package/src/scaffold/templates.ts +4 -0
  41. package/upgrades/1.3.237.md +82 -0
  42. package/upgrades/side-effects/gemini-multi-turn-loop-driver.md +56 -0
  43. package/upgrades/side-effects/parallel-activity-coherence.md +85 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * GeminiLoopDriver (need-gem-002) — multi-turn re-prompt engine for the Gemini
3
+ * mentee.
4
+ *
5
+ * A one-shot `gemini -p` runs one turn and exits, so a gemini mentee is bounded
6
+ * to one-shot tasks (the #1 maiden-voyage lesson). Unlike Claude/codex — which
7
+ * run as persistent hook-capable sessions and re-prompt via the autonomous Stop
8
+ * hook — gemini runs as one-shots, so the loop is driven EXTERNALLY: each turn
9
+ * re-spawns `gemini -m <model> -r <handle> -p "<nudge>"`, and gemini restores the
10
+ * session's full context natively (empirically proven, gemini-cli 0.25.2). That
11
+ * means the driver re-prompts with only the next instruction — never the
12
+ * accumulated transcript — which is the quota-efficient design that respects the
13
+ * no-overspend / subscription-auth rule.
14
+ *
15
+ * This is increment 1: the pure engine. Every side effect is INJECTED (the
16
+ * gemini spawn, the budget gate, the session-handle capture, sleep, clock), so
17
+ * the loop logic is fully unit-testable with zero real gemini calls / zero
18
+ * quota. Lifecycle invocation (a route / the apprenticeship machinery calling
19
+ * `run()`, plus the real `--list-sessions` handle parser) is increment 2.
20
+ *
21
+ * Spec: docs/specs/gemini-multi-turn-loop-driver.md
22
+ */
23
+ /** Outcome of a single gemini spawn (subset of GeminiSpawnResult the loop needs). */
24
+ export interface GeminiLoopSpawnResult {
25
+ exitCode: number | null;
26
+ stdout: string;
27
+ stderr: string;
28
+ truncated: boolean;
29
+ }
30
+ /**
31
+ * Injected gemini spawn. Receives the FULL argv (already including `-m`, and on
32
+ * resume turns `-r <handle>`) and runs gemini, returning the result. The real
33
+ * impl wraps `spawnGeminiAndWait` + `buildGeminiChildEnv` (which strips every
34
+ * billing env var → subscription auth is structural). A wiring-integrity test
35
+ * asserts the real driver routes through that transport, never a raw spawn.
36
+ */
37
+ export type GeminiLoopSpawn = (argv: string[]) => Promise<GeminiLoopSpawnResult>;
38
+ /**
39
+ * Injected budget gate — checked BEFORE every turn (including turn 1). `ok:false`
40
+ * halts the loop immediately (no spawn). The real impl reuses the existing
41
+ * QuotaTracker / autonomous can-start budget accounting; the engine stays
42
+ * number-agnostic so the §6 guardrail values live entirely in config/wiring.
43
+ */
44
+ export type GeminiLoopBudgetGate = () => {
45
+ ok: boolean;
46
+ reason?: string;
47
+ };
48
+ /**
49
+ * Capture the stable session handle created by turn 1 (the real impl parses
50
+ * `gemini --list-sessions` for the newest row in the loop's dedicated cwd).
51
+ * Returns `null` when the handle cannot be resolved — in which case the loop
52
+ * ABORTS rather than silently falling back to `latest` (which could resume a
53
+ * foreign session). Injected so the engine never depends on parsing in tests.
54
+ */
55
+ export type GeminiLoopHandleCapture = (turn1: GeminiLoopSpawnResult) => Promise<string | null>;
56
+ export interface GeminiLoopDriverDeps {
57
+ spawn: GeminiLoopSpawn;
58
+ captureHandle: GeminiLoopHandleCapture;
59
+ budgetGate?: GeminiLoopBudgetGate;
60
+ /** Injectable for tests (default: real timer). */
61
+ sleep?: (ms: number) => Promise<void>;
62
+ /** Injectable clock (default: Date.now). */
63
+ now?: () => number;
64
+ }
65
+ export interface GeminiLoopRunOptions {
66
+ model: string;
67
+ /** The goal / framing for turn 1. */
68
+ goalPrompt: string;
69
+ /** Hard cap on total turns (including turn 1). Clamped to >= 1. */
70
+ maxTurns: number;
71
+ /** Token the mentee emits when the goal is complete. Default GEMINI_LOOP_DONE. */
72
+ doneSentinel?: string;
73
+ /** Continuation instruction sent on turns 2..N (context is already resumed). */
74
+ continuationPrompt?: string;
75
+ /** Min ms between turn spawns (anti-spin). Default 0. */
76
+ minTurnIntervalMs?: number;
77
+ }
78
+ export interface GeminiLoopTurn {
79
+ turn: number;
80
+ argv: string[];
81
+ exitCode: number | null;
82
+ stdout: string;
83
+ stderr: string;
84
+ truncated: boolean;
85
+ /** True when the doneSentinel appeared in this turn's stdout. */
86
+ done: boolean;
87
+ }
88
+ export type GeminiLoopStopReason = 'done-sentinel' | 'max-turns' | 'budget-halt' | 'spawn-failure' | 'handle-capture-failure';
89
+ export interface GeminiLoopResult {
90
+ sessionHandle: string | null;
91
+ turns: GeminiLoopTurn[];
92
+ stopReason: GeminiLoopStopReason;
93
+ /** stdout of the last spawned turn ('' if none ran). */
94
+ finalOutput: string;
95
+ /** Reason text from the budget gate when stopReason === 'budget-halt'. */
96
+ haltReason?: string;
97
+ }
98
+ export declare const DEFAULT_DONE_SENTINEL = "GEMINI_LOOP_DONE";
99
+ export declare class GeminiLoopDriver {
100
+ private readonly spawn;
101
+ private readonly captureHandle;
102
+ private readonly budgetGate;
103
+ private readonly sleep;
104
+ constructor(deps: GeminiLoopDriverDeps);
105
+ /**
106
+ * Drive a multi-turn gemini task to one of: done-sentinel, max-turns,
107
+ * budget-halt, spawn-failure, or handle-capture-failure. Pure orchestration —
108
+ * no I/O except via the injected deps.
109
+ */
110
+ run(opts: GeminiLoopRunOptions): Promise<GeminiLoopResult>;
111
+ }
112
+ //# sourceMappingURL=GeminiLoopDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiLoopDriver.d.ts","sourceRoot":"","sources":["../../src/monitoring/GeminiLoopDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,qFAAqF;AACrF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG,CACpC,KAAK,EAAE,qBAAqB,KACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5B,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,eAAe,CAAC;IACvB,aAAa,EAAE,uBAAuB,CAAC;IACvC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,kDAAkD;IAClD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,oBAAoB,GAC5B,eAAe,GACf,WAAW,GACX,aAAa,GACb,eAAe,GACf,wBAAwB,CAAC;AAE7B,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,EAAE,oBAAoB,CAAC;IACjC,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAMxD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;gBAE1C,IAAI,EAAE,oBAAoB;IAOtC;;;;OAIG;IACG,GAAG,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA4EjE"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * GeminiLoopDriver (need-gem-002) — multi-turn re-prompt engine for the Gemini
3
+ * mentee.
4
+ *
5
+ * A one-shot `gemini -p` runs one turn and exits, so a gemini mentee is bounded
6
+ * to one-shot tasks (the #1 maiden-voyage lesson). Unlike Claude/codex — which
7
+ * run as persistent hook-capable sessions and re-prompt via the autonomous Stop
8
+ * hook — gemini runs as one-shots, so the loop is driven EXTERNALLY: each turn
9
+ * re-spawns `gemini -m <model> -r <handle> -p "<nudge>"`, and gemini restores the
10
+ * session's full context natively (empirically proven, gemini-cli 0.25.2). That
11
+ * means the driver re-prompts with only the next instruction — never the
12
+ * accumulated transcript — which is the quota-efficient design that respects the
13
+ * no-overspend / subscription-auth rule.
14
+ *
15
+ * This is increment 1: the pure engine. Every side effect is INJECTED (the
16
+ * gemini spawn, the budget gate, the session-handle capture, sleep, clock), so
17
+ * the loop logic is fully unit-testable with zero real gemini calls / zero
18
+ * quota. Lifecycle invocation (a route / the apprenticeship machinery calling
19
+ * `run()`, plus the real `--list-sessions` handle parser) is increment 2.
20
+ *
21
+ * Spec: docs/specs/gemini-multi-turn-loop-driver.md
22
+ */
23
+ import { buildGeminiOneShotArgv, buildGeminiResumeArgv, } from '../providers/adapters/gemini-cli/transport/geminiSpawn.js';
24
+ export const DEFAULT_DONE_SENTINEL = 'GEMINI_LOOP_DONE';
25
+ const DEFAULT_CONTINUATION = 'Continue toward the goal. If the goal is now fully complete, end your reply ' +
26
+ `with the exact token ${DEFAULT_DONE_SENTINEL} on its own line.`;
27
+ export class GeminiLoopDriver {
28
+ spawn;
29
+ captureHandle;
30
+ budgetGate;
31
+ sleep;
32
+ constructor(deps) {
33
+ this.spawn = deps.spawn;
34
+ this.captureHandle = deps.captureHandle;
35
+ this.budgetGate = deps.budgetGate ?? (() => ({ ok: true }));
36
+ this.sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
37
+ }
38
+ /**
39
+ * Drive a multi-turn gemini task to one of: done-sentinel, max-turns,
40
+ * budget-halt, spawn-failure, or handle-capture-failure. Pure orchestration —
41
+ * no I/O except via the injected deps.
42
+ */
43
+ async run(opts) {
44
+ const maxTurns = Math.max(1, Math.floor(opts.maxTurns));
45
+ const doneSentinel = opts.doneSentinel ?? DEFAULT_DONE_SENTINEL;
46
+ const continuation = opts.continuationPrompt ?? DEFAULT_CONTINUATION;
47
+ const minInterval = Math.max(0, opts.minTurnIntervalMs ?? 0);
48
+ const turns = [];
49
+ // --- Turn 1 (one-shot; establishes the session) ---
50
+ const gate0 = this.budgetGate();
51
+ if (!gate0.ok) {
52
+ return {
53
+ sessionHandle: null,
54
+ turns,
55
+ stopReason: 'budget-halt',
56
+ finalOutput: '',
57
+ haltReason: gate0.reason,
58
+ };
59
+ }
60
+ const argv1 = buildGeminiOneShotArgv(opts.model, opts.goalPrompt);
61
+ const r1 = await this.spawn(argv1);
62
+ const done1 = r1.stdout.includes(doneSentinel);
63
+ turns.push({ turn: 1, argv: argv1, ...r1, done: done1 });
64
+ if (r1.exitCode !== 0) {
65
+ return { sessionHandle: null, turns, stopReason: 'spawn-failure', finalOutput: r1.stdout };
66
+ }
67
+ if (done1) {
68
+ return { sessionHandle: null, turns, stopReason: 'done-sentinel', finalOutput: r1.stdout };
69
+ }
70
+ // --- Capture the stable handle (abort, never fall back to 'latest') ---
71
+ const handle = await this.captureHandle(r1);
72
+ if (!handle) {
73
+ return {
74
+ sessionHandle: null,
75
+ turns,
76
+ stopReason: 'handle-capture-failure',
77
+ finalOutput: r1.stdout,
78
+ };
79
+ }
80
+ // --- Turns 2..maxTurns (resume by stable handle) ---
81
+ let lastOutput = r1.stdout;
82
+ for (let turn = 2; turn <= maxTurns; turn++) {
83
+ const gate = this.budgetGate();
84
+ if (!gate.ok) {
85
+ return {
86
+ sessionHandle: handle,
87
+ turns,
88
+ stopReason: 'budget-halt',
89
+ finalOutput: lastOutput,
90
+ haltReason: gate.reason,
91
+ };
92
+ }
93
+ if (minInterval > 0) {
94
+ await this.sleep(minInterval);
95
+ }
96
+ const argv = buildGeminiResumeArgv(opts.model, handle, continuation);
97
+ const r = await this.spawn(argv);
98
+ const done = r.stdout.includes(doneSentinel);
99
+ turns.push({ turn, argv, ...r, done });
100
+ lastOutput = r.stdout;
101
+ if (r.exitCode !== 0) {
102
+ return { sessionHandle: handle, turns, stopReason: 'spawn-failure', finalOutput: r.stdout };
103
+ }
104
+ if (done) {
105
+ return { sessionHandle: handle, turns, stopReason: 'done-sentinel', finalOutput: r.stdout };
106
+ }
107
+ }
108
+ return { sessionHandle: handle, turns, stopReason: 'max-turns', finalOutput: lastOutput };
109
+ }
110
+ }
111
+ //# sourceMappingURL=GeminiLoopDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiLoopDriver.js","sourceRoot":"","sources":["../../src/monitoring/GeminiLoopDriver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * ParallelWorkOverlap — the pure cross-topic overlap detector that the
3
+ * ParallelWorkSentinel (Phase B) runs on a cadence (docs/specs/parallel-activity-coherence.md).
4
+ *
5
+ * Convergence hardened this against false-positive nudges (a noisy councilor gets
6
+ * muted, which is worse than silence). The containment lives HERE, in pure logic:
7
+ * - ACTIVITY GATE: only topics worked within a recent window are compared (a dormant
8
+ * overlap is not a live duplication risk — mirrors BurnDetector's activity gate).
9
+ * - SPECIFICITY: overlap rests on shared HIGH-SPECIFICITY tags (entities/files/identifiers,
10
+ * already filtered of boilerplate by extractTags) and requires ≥ minSharedSpecific of
11
+ * them — never on generic words. Rarer shared tags weigh more (IDF over the candidate set).
12
+ * - SELF-EXCLUSION: a topic never matches itself.
13
+ * - SIGNATURE: the sorted shared-tag SET — the dedup key the sentinel uses (with hysteresis)
14
+ * so a slowly-evolving focus does not re-nag and a genuinely new overlap is not suppressed.
15
+ *
16
+ * This module is PURE (no I/O, no time except the injected nowMs) so it is exhaustively
17
+ * unit-testable. The stateful dedup/cooldown/cadence/nudge lives in the sentinel.
18
+ */
19
+ /** The subset of a TopicActivity this detector needs (structurally compatible with ParallelActivityIndex output). */
20
+ export interface OverlapCandidate {
21
+ topicId: number;
22
+ tags: string[];
23
+ updatedAt: number | null;
24
+ running?: boolean;
25
+ }
26
+ export interface OverlapPair {
27
+ /** Lower topicId first (stable pair key). */
28
+ topicA: number;
29
+ topicB: number;
30
+ /** The high-specificity tokens both topics share (the genuine overlap). */
31
+ sharedTags: string[];
32
+ /** IDF-weighted overlap strength over the candidate set; higher = rarer shared tokens. */
33
+ score: number;
34
+ /** Sorted sharedTags joined — the dedup signature (the sentinel keys cooldown on the PAIR, hysteresis on this). */
35
+ signature: string;
36
+ }
37
+ export interface DetectOverlapsOptions {
38
+ nowMs: number;
39
+ /** Only compare topics whose updatedAt is within this window (default 4h). Null updatedAt ⇒ excluded. */
40
+ activityWindowMs?: number;
41
+ /** Require at least this many shared high-specificity tags (default 1). */
42
+ minSharedSpecific?: number;
43
+ /** When true, at least ONE side of each pair must be currently running (default true — we nudge live work). */
44
+ requireRunning?: boolean;
45
+ }
46
+ /**
47
+ * Detect overlapping work across topics. Returns one OverlapPair per genuinely-overlapping
48
+ * pair, strongest first. Pure: same inputs → same output.
49
+ */
50
+ export declare function detectOverlaps(candidates: OverlapCandidate[], opts: DetectOverlapsOptions): OverlapPair[];
51
+ /** Stable pair key for sentinel-side cooldown (survives focus edits / signature drift). */
52
+ export declare function pairKey(topicA: number, topicB: number): string;
53
+ /**
54
+ * Hysteresis: should a NEW overlap signature for an already-nudged pair re-fire? Only when
55
+ * the shared-tag set has changed materially (Jaccard(old,new) < threshold) — so a one-token
56
+ * focus tweak does not re-nag, but a genuinely different overlap does.
57
+ */
58
+ export declare function signatureChangedMaterially(oldSig: string, newSig: string, jaccardThreshold?: number): boolean;
59
+ //# sourceMappingURL=ParallelWorkOverlap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParallelWorkOverlap.d.ts","sourceRoot":"","sources":["../../src/monitoring/ParallelWorkOverlap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,qHAAqH;AACrH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,mHAAmH;IACnH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+GAA+G;IAC/G,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,gBAAgB,EAAE,EAC9B,IAAI,EAAE,qBAAqB,GAC1B,WAAW,EAAE,CAqCf;AAED,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,SAAM,GAAG,OAAO,CAU1G"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * ParallelWorkOverlap — the pure cross-topic overlap detector that the
3
+ * ParallelWorkSentinel (Phase B) runs on a cadence (docs/specs/parallel-activity-coherence.md).
4
+ *
5
+ * Convergence hardened this against false-positive nudges (a noisy councilor gets
6
+ * muted, which is worse than silence). The containment lives HERE, in pure logic:
7
+ * - ACTIVITY GATE: only topics worked within a recent window are compared (a dormant
8
+ * overlap is not a live duplication risk — mirrors BurnDetector's activity gate).
9
+ * - SPECIFICITY: overlap rests on shared HIGH-SPECIFICITY tags (entities/files/identifiers,
10
+ * already filtered of boilerplate by extractTags) and requires ≥ minSharedSpecific of
11
+ * them — never on generic words. Rarer shared tags weigh more (IDF over the candidate set).
12
+ * - SELF-EXCLUSION: a topic never matches itself.
13
+ * - SIGNATURE: the sorted shared-tag SET — the dedup key the sentinel uses (with hysteresis)
14
+ * so a slowly-evolving focus does not re-nag and a genuinely new overlap is not suppressed.
15
+ *
16
+ * This module is PURE (no I/O, no time except the injected nowMs) so it is exhaustively
17
+ * unit-testable. The stateful dedup/cooldown/cadence/nudge lives in the sentinel.
18
+ */
19
+ const DEFAULT_WINDOW_MS = 4 * 60 * 60 * 1000; // 4h
20
+ /**
21
+ * Detect overlapping work across topics. Returns one OverlapPair per genuinely-overlapping
22
+ * pair, strongest first. Pure: same inputs → same output.
23
+ */
24
+ export function detectOverlaps(candidates, opts) {
25
+ const windowMs = opts.activityWindowMs ?? DEFAULT_WINDOW_MS;
26
+ const minShared = opts.minSharedSpecific ?? 1;
27
+ const requireRunning = opts.requireRunning ?? true;
28
+ const cutoff = opts.nowMs - windowMs;
29
+ // Activity gate: only recently-worked topics with at least one specific tag.
30
+ const active = candidates.filter((c) => c.updatedAt !== null && c.updatedAt >= cutoff && c.tags.length > 0);
31
+ // IDF: a tag shared by FEW topics is more meaningful than one shared by many.
32
+ const docFreq = new Map();
33
+ for (const c of active)
34
+ for (const t of new Set(c.tags))
35
+ docFreq.set(t, (docFreq.get(t) ?? 0) + 1);
36
+ const idf = (tag) => {
37
+ const df = docFreq.get(tag) ?? 1;
38
+ return Math.log(1 + active.length / df); // rarer ⇒ higher
39
+ };
40
+ const pairs = [];
41
+ for (let i = 0; i < active.length; i++) {
42
+ for (let j = i + 1; j < active.length; j++) {
43
+ const a = active[i];
44
+ const b = active[j];
45
+ if (a.topicId === b.topicId)
46
+ continue; // self-exclusion (defensive)
47
+ if (requireRunning && !a.running && !b.running)
48
+ continue;
49
+ const bTags = new Set(b.tags);
50
+ const shared = [...new Set(a.tags)].filter((t) => bTags.has(t));
51
+ if (shared.length < minShared)
52
+ continue;
53
+ const score = shared.reduce((s, t) => s + idf(t), 0);
54
+ const sorted = [...shared].sort();
55
+ const [topicA, topicB] = a.topicId < b.topicId ? [a.topicId, b.topicId] : [b.topicId, a.topicId];
56
+ pairs.push({ topicA, topicB, sharedTags: sorted, score, signature: sorted.join('|') });
57
+ }
58
+ }
59
+ pairs.sort((x, y) => y.score - x.score);
60
+ return pairs;
61
+ }
62
+ /** Stable pair key for sentinel-side cooldown (survives focus edits / signature drift). */
63
+ export function pairKey(topicA, topicB) {
64
+ return topicA < topicB ? `${topicA}:${topicB}` : `${topicB}:${topicA}`;
65
+ }
66
+ /**
67
+ * Hysteresis: should a NEW overlap signature for an already-nudged pair re-fire? Only when
68
+ * the shared-tag set has changed materially (Jaccard(old,new) < threshold) — so a one-token
69
+ * focus tweak does not re-nag, but a genuinely different overlap does.
70
+ */
71
+ export function signatureChangedMaterially(oldSig, newSig, jaccardThreshold = 0.6) {
72
+ if (oldSig === newSig)
73
+ return false;
74
+ const a = new Set(oldSig ? oldSig.split('|') : []);
75
+ const b = new Set(newSig ? newSig.split('|') : []);
76
+ if (a.size === 0 && b.size === 0)
77
+ return false;
78
+ let inter = 0;
79
+ for (const t of a)
80
+ if (b.has(t))
81
+ inter++;
82
+ const union = a.size + b.size - inter;
83
+ const jaccard = union === 0 ? 1 : inter / union;
84
+ return jaccard < jaccardThreshold;
85
+ }
86
+ //# sourceMappingURL=ParallelWorkOverlap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParallelWorkOverlap.js","sourceRoot":"","sources":["../../src/monitoring/ParallelWorkOverlap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * ParallelWorkSentinel — the proactive overlap councilor (Parallel-Work Awareness
3
+ * Phase B; docs/specs/parallel-activity-coherence.md, Part 2).
4
+ *
5
+ * On a cadence it reads the cross-topic activity index, runs the pure overlap detector,
6
+ * and — for genuinely-fresh overlaps — emits ONE 'overlap' nudge so the agent learns its
7
+ * other hand is already on the same work (the willpower-trap fix: the signal comes TO the
8
+ * agent, it doesn't rely on the agent remembering to query). SIGNAL-ONLY — it never gates,
9
+ * blocks, or mutates anything.
10
+ *
11
+ * Convergence-mandated containment (a noisy councilor gets muted, which is worse than
12
+ * silence), all enforced here statefully on top of the pure detector's containment:
13
+ * - PAIR-KEYED COOLDOWN: at most one nudge per (topicA,topicB) per `nudgeCooldownMs`
14
+ * (default 60min) — survives focus edits, so responding to a nudge can't re-trigger it.
15
+ * - SIGNATURE HYSTERESIS: within the cooldown, a re-nudge only fires if the shared-tag SET
16
+ * changed materially (a genuinely new overlap), not on a one-token focus tweak.
17
+ * - It is the LEASE-HOLDER's job to run this (the caller gates ticks on holdsLease) so the
18
+ * same overlap isn't nudged twice from two machines.
19
+ *
20
+ * Ships DARK (the route/config default is enabled:false) — graduate after it's proven quiet.
21
+ */
22
+ import { EventEmitter } from 'node:events';
23
+ import { type OverlapCandidate, type OverlapPair } from './ParallelWorkOverlap.js';
24
+ export interface ParallelWorkSentinelOptions {
25
+ /** Pull the current cross-topic activities (e.g. ParallelActivityIndex.activities()). */
26
+ getActivities: (nowMs: number) => OverlapCandidate[];
27
+ /** Min ms between nudges for the same topic pair (default 60min). */
28
+ nudgeCooldownMs?: number;
29
+ /** Only compare topics worked within this window (passed to the detector; default 4h). */
30
+ activityWindowMs?: number;
31
+ /** Require ≥ this many shared high-specificity tags (default 1). */
32
+ minSharedSpecific?: number;
33
+ /** Audit sink for every transition (detected/nudged/deduped) — default-on housekeeping. */
34
+ audit?: (event: ParallelWorkAuditEvent) => void;
35
+ }
36
+ export interface ParallelWorkAuditEvent {
37
+ kind: 'nudged' | 'deduped-cooldown' | 'deduped-hysteresis';
38
+ pair: OverlapPair;
39
+ atMs: number;
40
+ }
41
+ /** Emitted to the agent when a fresh overlap is found. The one user-facing signal. */
42
+ export interface OverlapNudge {
43
+ pair: OverlapPair;
44
+ atMs: number;
45
+ message: string;
46
+ }
47
+ export interface ParallelWorkSentinelEvents {
48
+ overlap: [nudge: OverlapNudge];
49
+ }
50
+ export declare class ParallelWorkSentinel extends EventEmitter {
51
+ private readonly opts;
52
+ private readonly state;
53
+ constructor(opts: ParallelWorkSentinelOptions);
54
+ /** Run one cadence tick. Pure-ish: side effects are the emitted nudges + the audit sink. */
55
+ tick(nowMs: number): OverlapNudge[];
56
+ /** Test/inspection helper: how many pairs are being tracked for dedup. */
57
+ trackedPairCount(): number;
58
+ }
59
+ //# sourceMappingURL=ParallelWorkSentinel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParallelWorkSentinel.d.ts","sourceRoot":"","sources":["../../src/monitoring/ParallelWorkSentinel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,2BAA2B;IAC1C,yFAAyF;IACzF,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;IACrD,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2FAA2F;IAC3F,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,QAAQ,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;IAC3D,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sFAAsF;AACtF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;CAChC;AAED,qBAAa,oBAAqB,SAAQ,YAAY;IAGxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;gBAEzB,IAAI,EAAE,2BAA2B;IAI9D,4FAA4F;IAC5F,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IA6CnC,0EAA0E;IAC1E,gBAAgB,IAAI,MAAM;CAG3B"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * ParallelWorkSentinel — the proactive overlap councilor (Parallel-Work Awareness
3
+ * Phase B; docs/specs/parallel-activity-coherence.md, Part 2).
4
+ *
5
+ * On a cadence it reads the cross-topic activity index, runs the pure overlap detector,
6
+ * and — for genuinely-fresh overlaps — emits ONE 'overlap' nudge so the agent learns its
7
+ * other hand is already on the same work (the willpower-trap fix: the signal comes TO the
8
+ * agent, it doesn't rely on the agent remembering to query). SIGNAL-ONLY — it never gates,
9
+ * blocks, or mutates anything.
10
+ *
11
+ * Convergence-mandated containment (a noisy councilor gets muted, which is worse than
12
+ * silence), all enforced here statefully on top of the pure detector's containment:
13
+ * - PAIR-KEYED COOLDOWN: at most one nudge per (topicA,topicB) per `nudgeCooldownMs`
14
+ * (default 60min) — survives focus edits, so responding to a nudge can't re-trigger it.
15
+ * - SIGNATURE HYSTERESIS: within the cooldown, a re-nudge only fires if the shared-tag SET
16
+ * changed materially (a genuinely new overlap), not on a one-token focus tweak.
17
+ * - It is the LEASE-HOLDER's job to run this (the caller gates ticks on holdsLease) so the
18
+ * same overlap isn't nudged twice from two machines.
19
+ *
20
+ * Ships DARK (the route/config default is enabled:false) — graduate after it's proven quiet.
21
+ */
22
+ import { EventEmitter } from 'node:events';
23
+ import { detectOverlaps, pairKey, signatureChangedMaterially, } from './ParallelWorkOverlap.js';
24
+ export class ParallelWorkSentinel extends EventEmitter {
25
+ opts;
26
+ state = new Map();
27
+ constructor(opts) {
28
+ super();
29
+ this.opts = opts;
30
+ }
31
+ /** Run one cadence tick. Pure-ish: side effects are the emitted nudges + the audit sink. */
32
+ tick(nowMs) {
33
+ const activities = this.opts.getActivities(nowMs);
34
+ const pairs = detectOverlaps(activities, {
35
+ nowMs,
36
+ activityWindowMs: this.opts.activityWindowMs,
37
+ minSharedSpecific: this.opts.minSharedSpecific,
38
+ requireRunning: true,
39
+ });
40
+ const cooldown = this.opts.nudgeCooldownMs ?? 60 * 60 * 1000;
41
+ const fired = [];
42
+ for (const pair of pairs) {
43
+ const key = pairKey(pair.topicA, pair.topicB);
44
+ const prev = this.state.get(key);
45
+ if (prev) {
46
+ const withinCooldown = nowMs - prev.lastNudgedMs < cooldown;
47
+ if (withinCooldown && !signatureChangedMaterially(prev.lastSignature, pair.signature)) {
48
+ this.opts.audit?.({ kind: 'deduped-hysteresis', pair, atMs: nowMs });
49
+ // refresh the stored signature (track drift) but do NOT re-nudge
50
+ this.state.set(key, { lastSignature: pair.signature, lastNudgedMs: prev.lastNudgedMs });
51
+ continue;
52
+ }
53
+ if (withinCooldown && signatureChangedMaterially(prev.lastSignature, pair.signature)) {
54
+ // Material change but still inside the cooldown window: suppress, record drift.
55
+ this.opts.audit?.({ kind: 'deduped-cooldown', pair, atMs: nowMs });
56
+ this.state.set(key, { lastSignature: pair.signature, lastNudgedMs: prev.lastNudgedMs });
57
+ continue;
58
+ }
59
+ }
60
+ // Fresh (never nudged, or past cooldown) → nudge.
61
+ this.state.set(key, { lastSignature: pair.signature, lastNudgedMs: nowMs });
62
+ const nudge = {
63
+ pair,
64
+ atMs: nowMs,
65
+ message: `Heads up: topics ${pair.topicA} and ${pair.topicB} look like overlapping work ` +
66
+ `(shared: ${pair.sharedTags.join(', ')}). You may be duplicating — worth aligning before you go further.`,
67
+ };
68
+ this.opts.audit?.({ kind: 'nudged', pair, atMs: nowMs });
69
+ this.emit('overlap', nudge);
70
+ fired.push(nudge);
71
+ }
72
+ return fired;
73
+ }
74
+ /** Test/inspection helper: how many pairs are being tracked for dedup. */
75
+ trackedPairCount() {
76
+ return this.state.size;
77
+ }
78
+ }
79
+ //# sourceMappingURL=ParallelWorkSentinel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParallelWorkSentinel.js","sourceRoot":"","sources":["../../src/monitoring/ParallelWorkSentinel.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,20 @@ export declare const DEFAULT_MAX_OUTPUT_BYTES: number;
36
36
  * `--sandbox read-only` pin at the call site.)
37
37
  */
38
38
  export declare function buildGeminiOneShotArgv(model: string, prompt: string): string[];
39
+ /**
40
+ * Argv for a RESUME turn — continue an existing gemini session by its stable
41
+ * handle (a session UUID, or `latest`/index per `gemini --resume`).
42
+ *
43
+ * Empirically proven (gemini-cli 0.25.2, 2026-06-04): `gemini -m <model> -r
44
+ * <uuid> -p "<next>"` restores the full prior context of that session across a
45
+ * SEPARATE process invocation — so a multi-turn driver re-prompts with only the
46
+ * next instruction, never the accumulated transcript (the quota-efficient path;
47
+ * see `docs/specs/gemini-multi-turn-loop-driver.md`). The explicit `-m` is kept
48
+ * because it ALSO bypasses gemini-cli's flaky pre-turn ModelRouterService
49
+ * classifier (`generateJson` can exhaust retries on invalid-content and kill the
50
+ * turn pre-generation); mirroring `buildGeminiOneShotArgv` keeps that bypass.
51
+ */
52
+ export declare function buildGeminiResumeArgv(model: string, sessionHandle: string, prompt: string): string[];
39
53
  /**
40
54
  * The Google/Gemini billing-capable vars that are UNCONDITIONALLY deleted
41
55
  * from the child env, regardless of allowlist contents. Any of these present
@@ -1 +1 @@
1
- {"version":3,"file":"geminiSpawn.d.ts","sourceRoot":"","sources":["../../../../../src/providers/adapters/gemini-cli/transport/geminiSpawn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH;qDACqD;AACrD,eAAO,MAAM,wBAAwB,QAAkB,CAAC;AAExD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9E;AAyCD;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,sIAM1B,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,MAAM,CAAC,UAAwB,GACzC,MAAM,CAAC,UAAU,CAiBnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAsG5B"}
1
+ {"version":3,"file":"geminiSpawn.d.ts","sourceRoot":"","sources":["../../../../../src/providers/adapters/gemini-cli/transport/geminiSpawn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH;qDACqD;AACrD,eAAO,MAAM,wBAAwB,QAAkB,CAAC;AAExD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,MAAM,EAAE,CAEV;AAyCD;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,sIAM1B,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,MAAM,CAAC,UAAwB,GACzC,MAAM,CAAC,UAAU,CAiBnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAsG5B"}
@@ -39,6 +39,22 @@ export const DEFAULT_MAX_OUTPUT_BYTES = 8 * 1024 * 1024;
39
39
  export function buildGeminiOneShotArgv(model, prompt) {
40
40
  return ['-m', model, '--approval-mode', 'default', '-p', prompt];
41
41
  }
42
+ /**
43
+ * Argv for a RESUME turn — continue an existing gemini session by its stable
44
+ * handle (a session UUID, or `latest`/index per `gemini --resume`).
45
+ *
46
+ * Empirically proven (gemini-cli 0.25.2, 2026-06-04): `gemini -m <model> -r
47
+ * <uuid> -p "<next>"` restores the full prior context of that session across a
48
+ * SEPARATE process invocation — so a multi-turn driver re-prompts with only the
49
+ * next instruction, never the accumulated transcript (the quota-efficient path;
50
+ * see `docs/specs/gemini-multi-turn-loop-driver.md`). The explicit `-m` is kept
51
+ * because it ALSO bypasses gemini-cli's flaky pre-turn ModelRouterService
52
+ * classifier (`generateJson` can exhaust retries on invalid-content and kill the
53
+ * turn pre-generation); mirroring `buildGeminiOneShotArgv` keeps that bypass.
54
+ */
55
+ export function buildGeminiResumeArgv(model, sessionHandle, prompt) {
56
+ return ['-m', model, '-r', sessionHandle, '--approval-mode', 'default', '-p', prompt];
57
+ }
42
58
  /**
43
59
  * Rule-1a analog — env allowlist for Gemini child processes.
44
60
  *
@@ -1 +1 @@
1
- {"version":3,"file":"geminiSpawn.js","sourceRoot":"","sources":["../../../../../src/providers/adapters/gemini-cli/transport/geminiSpawn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"geminiSpawn.js","sourceRoot":"","sources":["../../../../../src/providers/adapters/gemini-cli/transport/geminiSpawn.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CAiwCR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CAuSR"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CAqwCR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CAuSR"}