@autopilot-harness/port-gemini-cli 0.7.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Autopilot Harness contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,139 @@
1
+ import { type PhaseActionConfig, type ReviewEngine, type StateStore } from "@autopilot-harness/core";
2
+ /** Gemini BeforeAgent stdin (camelCase + snake_case). */
3
+ export interface GeminiSubmitPayload {
4
+ session_id?: string;
5
+ sessionId?: string;
6
+ prompt?: string;
7
+ cwd?: string;
8
+ transcript_path?: string;
9
+ transcriptPath?: string;
10
+ hook_event_name?: string;
11
+ hookEventName?: string;
12
+ timestamp?: string;
13
+ conversation_id?: string;
14
+ conversationId?: string;
15
+ }
16
+ /** Gemini AfterTool stdin. */
17
+ export interface GeminiEditPayload {
18
+ session_id?: string;
19
+ sessionId?: string;
20
+ conversation_id?: string;
21
+ conversationId?: string;
22
+ cwd?: string;
23
+ tool_name?: string;
24
+ toolName?: string;
25
+ tool_input?: Record<string, unknown> | string;
26
+ toolInput?: Record<string, unknown> | string;
27
+ tool_response?: Record<string, unknown>;
28
+ toolResponse?: Record<string, unknown>;
29
+ hook_event_name?: string;
30
+ hookEventName?: string;
31
+ }
32
+ /** Gemini AfterAgent stdin. */
33
+ export interface GeminiStopPayload {
34
+ session_id?: string;
35
+ sessionId?: string;
36
+ conversation_id?: string;
37
+ conversationId?: string;
38
+ cwd?: string;
39
+ transcript_path?: string;
40
+ transcriptPath?: string;
41
+ prompt?: string;
42
+ prompt_response?: string;
43
+ promptResponse?: string;
44
+ stop_hook_active?: boolean;
45
+ stopHookActive?: boolean;
46
+ hook_event_name?: string;
47
+ hookEventName?: string;
48
+ timestamp?: string;
49
+ status?: string;
50
+ error?: unknown;
51
+ message?: unknown;
52
+ reason?: unknown;
53
+ }
54
+ export interface GeminiPortConfig {
55
+ phaseActions?: PhaseActionConfig;
56
+ }
57
+ export declare const GEMINI_PLATFORM = "gemini-cli";
58
+ /**
59
+ * Public research (2026-09): MAX_TURNS=100 shared with AfterAgent retries;
60
+ * no raise knob. See plans/v0.7-gemini-cli/research-stop-cap.md.
61
+ */
62
+ export declare const GEMINI_STOP_CAP_RAISE_FOUND = false;
63
+ /** Host turn budget (MAX_TURNS) shared with AfterAgent deny→retry. */
64
+ export declare const GEMINI_AFTER_AGENT_TURN_CAP = 100;
65
+ /** Soft doctor tip — CLI with stopHookActive retry fix (#20439 era). */
66
+ export declare const GEMINI_MIN_CLI_VERSION_HINT = "0.31.0";
67
+ /**
68
+ * AfterTool matcher draft (Gemini built-in edit tools).
69
+ * Live smoke may widen; ReviewEngine dirty-arm covers shell edits on Stop.
70
+ */
71
+ export declare const GEMINI_AFTER_TOOL_MATCHER = "write_file|replace";
72
+ export declare const MAX_NEED_PICK_SLUGS = 40;
73
+ export declare const MAX_NEED_PICK_CONTEXT_CHARS = 2000;
74
+ export declare const MAX_HOOK_STDIO_CHARS = 8192;
75
+ export declare const MAX_TOOL_ARGS_JSON_CHARS = 1048576;
76
+ /** BeforeAgent stdout — emit deny or inject; never primary `block` / clearContext. */
77
+ export interface GeminiSubmitResult {
78
+ decision?: "deny" | "allow";
79
+ reason?: string;
80
+ systemMessage?: string;
81
+ hookSpecificOutput?: {
82
+ hookEventName?: string;
83
+ additionalContext?: string;
84
+ };
85
+ }
86
+ /**
87
+ * AfterAgent stdout — continue with deny+reason; hard-stop with continue:false.
88
+ * Do not put clearContext on this type (Autopilot must never clear LLM memory).
89
+ */
90
+ export interface GeminiStopResult {
91
+ decision?: "deny" | "allow";
92
+ reason?: string;
93
+ continue?: boolean;
94
+ stopReason?: string;
95
+ }
96
+ /**
97
+ * Map stop_hook_active → ReviewEngine loopCount.
98
+ * true ⇒ already in AfterAgent retry chain this turn.
99
+ */
100
+ export declare function loopCountFromStopHookActive(payload: GeminiStopPayload): number;
101
+ export declare function collectGeminiStopErrorText(payload: GeminiStopPayload): string;
102
+ export declare function normalizeGeminiStopStatus(payload: GeminiStopPayload, opts?: {
103
+ status?: "completed" | "error" | "aborted";
104
+ }): "completed" | "error" | "aborted";
105
+ export declare function buildNeedPickContext(userMessage: unknown, candidates?: ReadonlyArray<{
106
+ slug?: string;
107
+ }>): string;
108
+ /** Prefer Channel A inject (writing-hooks shape with hookEventName). */
109
+ export declare function injectNeedPickContext(userMessage: unknown, candidates?: ReadonlyArray<{
110
+ slug?: string;
111
+ }>): GeminiSubmitResult;
112
+ /** Fallback: deny discards user message (user re-submits with slug). */
113
+ export declare function denySubmit(userMessage: unknown, fallback: string): GeminiSubmitResult;
114
+ export declare function filePathsFromGeminiEdit(payload: GeminiEditPayload): string[];
115
+ /** File-mutating tools Autopilot arms (shell → ReviewEngine dirty-arm on Stop). */
116
+ export declare function isGeminiEditTool(toolName: string): boolean;
117
+ /**
118
+ * BeforeAgent → core triggers / FSM.
119
+ * Success allow → {} (Silence). Prefer inject for needPick; fallback deny.
120
+ * Harness followups (AfterAgent reason re-entry): no ON/RUN; do not clear pending.
121
+ */
122
+ export declare function handleUserPromptSubmit(store: StateStore, payload: GeminiSubmitPayload, projectRoot: string, portConfig?: GeminiPortConfig): GeminiSubmitResult;
123
+ /** Aliased export for vendor (never collide with Claude bare names). */
124
+ export declare const handleGeminiUserPromptSubmit: typeof handleUserPromptSubmit;
125
+ /** AfterTool → markCodeEdited for write_file / replace only (never deny/hide). */
126
+ export declare function handlePostToolUse(store: StateStore, payload: GeminiEditPayload, projectRoot: string): void;
127
+ export declare const handleGeminiPostToolUse: typeof handlePostToolUse;
128
+ /**
129
+ * AfterAgent → ReviewEngine.
130
+ * Continue: decision:deny + reason (primary; never clearContext; never primary block).
131
+ * Hard stop: continue:false + stopReason.
132
+ * Multi-deny across stop_hook_active=true until FSM done.
133
+ * Dirty-arm for shell edits is inside ReviewEngine.handleStop.
134
+ */
135
+ export declare function handleStop(engine: ReviewEngine, payload: GeminiStopPayload, opts?: {
136
+ status?: "completed" | "error" | "aborted";
137
+ }): GeminiStopResult;
138
+ export declare const handleGeminiStop: typeof handleStop;
139
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,456 @@
1
+ import { applyOff, applyOn, applyReplan, applyResume, applyResumeReview, applyRun, applyTrackPick, ensureAmbientReviewSession, effectiveReviewingItemId, firstUnchecked, isChannelANeedPick, isHarnessFollowupMessage, isProductCodeEdit, isRecoverOrStuckFollowupMessage, isSafeTrackSlug, isUserAbortText, loadProjectHookConfig, loadProjectReviewConfig, notePlansDirEdit, parseAdvanceNextItemId, parseChecklist, parseTrigger, } from "@autopilot-harness/core";
2
+ export const GEMINI_PLATFORM = "gemini-cli";
3
+ /**
4
+ * Public research (2026-09): MAX_TURNS=100 shared with AfterAgent retries;
5
+ * no raise knob. See plans/v0.7-gemini-cli/research-stop-cap.md.
6
+ */
7
+ export const GEMINI_STOP_CAP_RAISE_FOUND = false;
8
+ /** Host turn budget (MAX_TURNS) shared with AfterAgent deny→retry. */
9
+ export const GEMINI_AFTER_AGENT_TURN_CAP = 100;
10
+ /** Soft doctor tip — CLI with stopHookActive retry fix (#20439 era). */
11
+ export const GEMINI_MIN_CLI_VERSION_HINT = "0.31.0";
12
+ /**
13
+ * AfterTool matcher draft (Gemini built-in edit tools).
14
+ * Live smoke may widen; ReviewEngine dirty-arm covers shell edits on Stop.
15
+ */
16
+ export const GEMINI_AFTER_TOOL_MATCHER = "write_file|replace";
17
+ export const MAX_NEED_PICK_SLUGS = 40;
18
+ export const MAX_NEED_PICK_CONTEXT_CHARS = 2_000;
19
+ export const MAX_HOOK_STDIO_CHARS = 8_192;
20
+ export const MAX_TOOL_ARGS_JSON_CHARS = 1_048_576;
21
+ function sid(p) {
22
+ for (const v of [
23
+ p.session_id,
24
+ p.sessionId,
25
+ p.conversation_id,
26
+ p.conversationId,
27
+ ]) {
28
+ if (typeof v === "string") {
29
+ const t = v.trim();
30
+ // Align with StateStore.isInvalidConversationId — reject C0/DEL so we
31
+ // fail-soft as {} instead of throw→catch false-success mid-mutation.
32
+ if (t && !/[\u0000-\u001f\u007f]/.test(t))
33
+ return t;
34
+ }
35
+ }
36
+ return "";
37
+ }
38
+ function clipText(text, max = MAX_HOOK_STDIO_CHARS) {
39
+ if (text.length <= max)
40
+ return text;
41
+ return `${text.slice(0, max - 1)}…`;
42
+ }
43
+ function denyReason(message, fallback) {
44
+ const m = typeof message === "string" ? message.trim() : "";
45
+ return m || fallback;
46
+ }
47
+ /**
48
+ * Map stop_hook_active → ReviewEngine loopCount.
49
+ * true ⇒ already in AfterAgent retry chain this turn.
50
+ */
51
+ export function loopCountFromStopHookActive(payload) {
52
+ const active = payload.stop_hook_active ?? payload.stopHookActive;
53
+ return active === true ? 1 : 0;
54
+ }
55
+ export function collectGeminiStopErrorText(payload) {
56
+ if (!payload || typeof payload !== "object")
57
+ return "";
58
+ const parts = [];
59
+ try {
60
+ const push = (value) => {
61
+ if (typeof value === "string" && value.trim()) {
62
+ parts.push(value);
63
+ return;
64
+ }
65
+ if (value && typeof value === "object" && !Array.isArray(value)) {
66
+ const o = value;
67
+ for (const key of ["message", "error", "name", "stack", "detail"]) {
68
+ const nested = o[key];
69
+ if (typeof nested === "string" && nested.trim())
70
+ parts.push(nested);
71
+ }
72
+ }
73
+ };
74
+ push(payload.error);
75
+ push(payload.message);
76
+ push(payload.reason);
77
+ }
78
+ catch {
79
+ return "";
80
+ }
81
+ return clipText(parts.join("\n"));
82
+ }
83
+ export function normalizeGeminiStopStatus(payload, opts) {
84
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
85
+ return opts?.status ?? "completed";
86
+ }
87
+ const statusRaw = String(payload.status ?? "")
88
+ .toLowerCase()
89
+ .trim();
90
+ const errText = collectGeminiStopErrorText(payload);
91
+ if (statusRaw === "aborted" ||
92
+ statusRaw === "cancelled" ||
93
+ statusRaw === "canceled") {
94
+ return "aborted";
95
+ }
96
+ if (opts?.status === "aborted")
97
+ return "aborted";
98
+ if (statusRaw === "error" || statusRaw === "failed") {
99
+ if (isUserAbortText(errText))
100
+ return "aborted";
101
+ return "error";
102
+ }
103
+ if (opts?.status === "error") {
104
+ if (isUserAbortText(errText))
105
+ return "aborted";
106
+ return "error";
107
+ }
108
+ if (opts?.status === "completed")
109
+ return "completed";
110
+ if (!statusRaw && isUserAbortText(errText))
111
+ return "aborted";
112
+ // AfterAgent fires after a finished response — default completed.
113
+ return "completed";
114
+ }
115
+ export function buildNeedPickContext(userMessage, candidates) {
116
+ const fromMessage = typeof userMessage === "string" && userMessage.trim().length > 0
117
+ ? userMessage.trim()
118
+ : "";
119
+ const slugs = [
120
+ ...new Set((candidates ?? [])
121
+ .map((c) => (c && typeof c.slug === "string" ? c.slug.trim() : ""))
122
+ .filter((s) => s.length > 0 && isSafeTrackSlug(s))),
123
+ ].slice(0, MAX_NEED_PICK_SLUGS);
124
+ let ctx = fromMessage ||
125
+ (slugs.length > 0
126
+ ? `Select a plan to execute:\n\n${slugs
127
+ .map((s, i) => ` ${i + 1}. ${s}`)
128
+ .join("\n")}\n\nReply with a number or /autopilot-run <slug>.`
129
+ : "Select a plan to execute. Reply with a number or /autopilot-run <slug>.");
130
+ if (ctx.length > MAX_NEED_PICK_CONTEXT_CHARS) {
131
+ ctx = `${ctx.slice(0, MAX_NEED_PICK_CONTEXT_CHARS - 1)}…`;
132
+ }
133
+ return ctx;
134
+ }
135
+ /** Prefer Channel A inject (writing-hooks shape with hookEventName). */
136
+ export function injectNeedPickContext(userMessage, candidates) {
137
+ const ctx = buildNeedPickContext(userMessage, candidates);
138
+ return {
139
+ hookSpecificOutput: {
140
+ hookEventName: "BeforeAgent",
141
+ additionalContext: ctx,
142
+ },
143
+ };
144
+ }
145
+ /** Fallback: deny discards user message (user re-submits with slug). */
146
+ export function denySubmit(userMessage, fallback) {
147
+ return {
148
+ decision: "deny",
149
+ reason: clipText(denyReason(typeof userMessage === "string" ? userMessage : undefined, fallback), MAX_NEED_PICK_CONTEXT_CHARS + 256),
150
+ };
151
+ }
152
+ function toolInputObject(payload) {
153
+ const input = payload.tool_input ?? payload.toolInput;
154
+ if (!input)
155
+ return null;
156
+ if (typeof input === "object" && !Array.isArray(input)) {
157
+ return input;
158
+ }
159
+ if (typeof input === "string") {
160
+ if (input.length > MAX_TOOL_ARGS_JSON_CHARS)
161
+ return null;
162
+ try {
163
+ const parsed = JSON.parse(input);
164
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
165
+ return parsed;
166
+ }
167
+ }
168
+ catch {
169
+ return null;
170
+ }
171
+ }
172
+ return null;
173
+ }
174
+ export function filePathsFromGeminiEdit(payload) {
175
+ const input = toolInputObject(payload);
176
+ if (!input)
177
+ return [];
178
+ const candidates = [
179
+ input.file_path,
180
+ input.filePath,
181
+ input.path,
182
+ input.target_file,
183
+ input.targetFile,
184
+ ];
185
+ for (const c of candidates) {
186
+ if (typeof c === "string" && c.trim() && !/[\0\r\n]/.test(c)) {
187
+ return [c.trim()];
188
+ }
189
+ }
190
+ return [];
191
+ }
192
+ /** File-mutating tools Autopilot arms (shell → ReviewEngine dirty-arm on Stop). */
193
+ export function isGeminiEditTool(toolName) {
194
+ const n = toolName.trim();
195
+ return n === "write_file" || n === "replace";
196
+ }
197
+ function stampGeminiPlatform(store, conversationId, projectRoot) {
198
+ const session = store.getSession(conversationId);
199
+ if (!session || session.platform === GEMINI_PLATFORM)
200
+ return;
201
+ store.upsertSession({
202
+ conversation_id: conversationId,
203
+ project_root: session.project_root || projectRoot,
204
+ code_root: session.code_root || projectRoot,
205
+ platform: GEMINI_PLATFORM,
206
+ });
207
+ }
208
+ /**
209
+ * BeforeAgent → core triggers / FSM.
210
+ * Success allow → {} (Silence). Prefer inject for needPick; fallback deny.
211
+ * Harness followups (AfterAgent reason re-entry): no ON/RUN; do not clear pending.
212
+ */
213
+ export function handleUserPromptSubmit(store, payload, projectRoot, portConfig) {
214
+ try {
215
+ return handleUserPromptSubmitInner(store, payload, projectRoot, portConfig);
216
+ }
217
+ catch {
218
+ return {};
219
+ }
220
+ }
221
+ /** Aliased export for vendor (never collide with Claude bare names). */
222
+ export const handleGeminiUserPromptSubmit = handleUserPromptSubmit;
223
+ function handleUserPromptSubmitInner(store, payload, projectRoot, portConfig) {
224
+ const conversationId = sid(payload);
225
+ if (!conversationId)
226
+ return {};
227
+ // Never trust process.cwd alone — projectRoot is install-root from hook runner.
228
+ const prompt = typeof payload.prompt === "string" ? payload.prompt : "";
229
+ try {
230
+ store.clearPendingFollowupIf(conversationId, isRecoverOrStuckFollowupMessage);
231
+ }
232
+ catch {
233
+ /* best-effort */
234
+ }
235
+ const session = store.getSession(conversationId);
236
+ const hookCfg = loadProjectHookConfig(projectRoot);
237
+ const trigger = parseTrigger({
238
+ prompt,
239
+ conversationId,
240
+ projectRoot,
241
+ pendingAction: session?.pending_action,
242
+ triggers: hookCfg.triggers,
243
+ });
244
+ const actionConfig = {
245
+ ...portConfig?.phaseActions,
246
+ plansDir: portConfig?.phaseActions?.plansDir ?? hookCfg.plansDir,
247
+ };
248
+ const gateFallback = "Autopilot rejected this prompt. Check `npx autopilot-harness status`.";
249
+ if (trigger) {
250
+ if (trigger.kind === "off") {
251
+ applyOff(store, conversationId);
252
+ stampGeminiPlatform(store, conversationId, projectRoot);
253
+ return {};
254
+ }
255
+ if (trigger.kind === "on") {
256
+ const result = applyOn(store, conversationId, projectRoot, {
257
+ initialBrief: trigger.initialBrief,
258
+ slug: trigger.slug,
259
+ platform: GEMINI_PLATFORM,
260
+ });
261
+ if (!result.ok) {
262
+ stampGeminiPlatform(store, conversationId, projectRoot);
263
+ return denySubmit(result.userMessage, gateFallback);
264
+ }
265
+ stampGeminiPlatform(store, conversationId, projectRoot);
266
+ return {};
267
+ }
268
+ if (trigger.kind === "resume") {
269
+ const result = applyResume(store, conversationId, {
270
+ slug: trigger.slug,
271
+ });
272
+ if (!result.ok) {
273
+ stampGeminiPlatform(store, conversationId, projectRoot);
274
+ return denySubmit(result.userMessage, gateFallback);
275
+ }
276
+ stampGeminiPlatform(store, conversationId, projectRoot);
277
+ return {};
278
+ }
279
+ if (trigger.kind === "resume_review") {
280
+ applyResumeReview(store, conversationId);
281
+ stampGeminiPlatform(store, conversationId, projectRoot);
282
+ return {};
283
+ }
284
+ if (trigger.kind === "run") {
285
+ const result = applyRun(store, conversationId, projectRoot, {
286
+ slug: trigger.slug,
287
+ config: actionConfig,
288
+ platform: GEMINI_PLATFORM,
289
+ });
290
+ if (!result.ok) {
291
+ stampGeminiPlatform(store, conversationId, projectRoot);
292
+ if (isChannelANeedPick(result)) {
293
+ return injectNeedPickContext(result.userMessage, result.candidates);
294
+ }
295
+ return denySubmit(result.userMessage, gateFallback);
296
+ }
297
+ stampGeminiPlatform(store, conversationId, projectRoot);
298
+ return {};
299
+ }
300
+ if (trigger.kind === "replan") {
301
+ const result = applyReplan(store, conversationId, projectRoot, {
302
+ slug: trigger.slug,
303
+ config: actionConfig,
304
+ platform: GEMINI_PLATFORM,
305
+ });
306
+ if (!result.ok) {
307
+ stampGeminiPlatform(store, conversationId, projectRoot);
308
+ if (isChannelANeedPick(result)) {
309
+ return injectNeedPickContext(result.userMessage, result.candidates);
310
+ }
311
+ return denySubmit(result.userMessage, gateFallback);
312
+ }
313
+ stampGeminiPlatform(store, conversationId, projectRoot);
314
+ return {};
315
+ }
316
+ if (trigger.kind === "track_pick" && trigger.trackPick) {
317
+ const result = applyTrackPick(store, conversationId, projectRoot, trigger.trackPick, { config: actionConfig, platform: GEMINI_PLATFORM });
318
+ if (!result.ok) {
319
+ stampGeminiPlatform(store, conversationId, projectRoot);
320
+ if (isChannelANeedPick(result)) {
321
+ return injectNeedPickContext(result.userMessage, result.candidates);
322
+ }
323
+ return denySubmit(result.userMessage, gateFallback);
324
+ }
325
+ stampGeminiPlatform(store, conversationId, projectRoot);
326
+ return {};
327
+ }
328
+ return {};
329
+ }
330
+ // AfterAgent reason re-enters BeforeAgent as prompt — treat harness followups
331
+ // as owned (do not clear pending/chain). Do not use AfterAgent.prompt here.
332
+ if (!isHarnessFollowupMessage(prompt)) {
333
+ store.clearChainPending(conversationId);
334
+ }
335
+ stampGeminiPlatform(store, conversationId, projectRoot);
336
+ return {};
337
+ }
338
+ function armCodeEdited(store, conversationId, projectRoot) {
339
+ const cfg = loadProjectReviewConfig(projectRoot);
340
+ if (cfg.reviewScope === "project") {
341
+ ensureAmbientReviewSession(store, conversationId, projectRoot, cfg.reviewScope, GEMINI_PLATFORM);
342
+ }
343
+ stampGeminiPlatform(store, conversationId, projectRoot);
344
+ const session = store.getSession(conversationId);
345
+ const checklistPath = session?.checklist_path?.trim() ?? "";
346
+ let checklistSnap = null;
347
+ if (checklistPath) {
348
+ try {
349
+ checklistSnap = parseChecklist(checklistPath, { projectRoot });
350
+ }
351
+ catch {
352
+ /* still arm */
353
+ }
354
+ }
355
+ store.markCodeEdited(conversationId, (chain) => {
356
+ const fromPending = parseAdvanceNextItemId(chain.pending_followup);
357
+ if (checklistSnap) {
358
+ if (fromPending && effectiveReviewingItemId(checklistSnap, fromPending)) {
359
+ return fromPending;
360
+ }
361
+ return firstUnchecked(checklistSnap)?.id ?? null;
362
+ }
363
+ return fromPending;
364
+ });
365
+ }
366
+ /** AfterTool → markCodeEdited for write_file / replace only (never deny/hide). */
367
+ export function handlePostToolUse(store, payload, projectRoot) {
368
+ try {
369
+ handlePostToolUseInner(store, payload, projectRoot);
370
+ }
371
+ catch {
372
+ /* fail-open */
373
+ }
374
+ }
375
+ export const handleGeminiPostToolUse = handlePostToolUse;
376
+ function handlePostToolUseInner(store, payload, projectRoot) {
377
+ const conversationId = sid(payload);
378
+ const toolName = String(payload.tool_name ?? payload.toolName ?? "").trim();
379
+ if (!conversationId || !isGeminiEditTool(toolName))
380
+ return;
381
+ const filePaths = filePathsFromGeminiEdit(payload);
382
+ if (filePaths.length === 0) {
383
+ stampGeminiPlatform(store, conversationId, projectRoot);
384
+ return;
385
+ }
386
+ let plansDir;
387
+ try {
388
+ plansDir = loadProjectHookConfig(projectRoot).plansDir;
389
+ }
390
+ catch {
391
+ plansDir = undefined;
392
+ }
393
+ let armed = false;
394
+ for (const filePath of filePaths) {
395
+ try {
396
+ notePlansDirEdit(store, conversationId, projectRoot, filePath, plansDir);
397
+ }
398
+ catch {
399
+ /* best-effort */
400
+ }
401
+ if (!isProductCodeEdit(filePath, { projectRoot }))
402
+ continue;
403
+ if (!armed) {
404
+ armCodeEdited(store, conversationId, projectRoot);
405
+ armed = true;
406
+ }
407
+ }
408
+ if (!armed) {
409
+ stampGeminiPlatform(store, conversationId, projectRoot);
410
+ }
411
+ }
412
+ /**
413
+ * AfterAgent → ReviewEngine.
414
+ * Continue: decision:deny + reason (primary; never clearContext; never primary block).
415
+ * Hard stop: continue:false + stopReason.
416
+ * Multi-deny across stop_hook_active=true until FSM done.
417
+ * Dirty-arm for shell edits is inside ReviewEngine.handleStop.
418
+ */
419
+ export function handleStop(engine, payload, opts) {
420
+ try {
421
+ return handleStopInner(engine, payload, opts);
422
+ }
423
+ catch {
424
+ return {};
425
+ }
426
+ }
427
+ export const handleGeminiStop = handleStop;
428
+ function handleStopInner(engine, payload, opts) {
429
+ const conversationId = sid(payload);
430
+ if (!conversationId)
431
+ return {};
432
+ const status = normalizeGeminiStopStatus(payload, opts);
433
+ const transcriptRaw = payload.transcript_path ?? payload.transcriptPath;
434
+ const transcriptPath = typeof transcriptRaw === "string" && transcriptRaw.trim()
435
+ ? transcriptRaw.trim()
436
+ : undefined;
437
+ const action = engine.handleStop({
438
+ conversationId,
439
+ status,
440
+ loopCount: loopCountFromStopHookActive(payload),
441
+ transcriptPath,
442
+ platform: GEMINI_PLATFORM,
443
+ });
444
+ if (!action?.message)
445
+ return {};
446
+ const reason = clipText(denyReason(action.message, "Autopilot followup"), MAX_HOOK_STDIO_CHARS);
447
+ if (!action.loop) {
448
+ return { continue: false, stopReason: reason };
449
+ }
450
+ // Primary continue channel — never emit clearContext; never prefer block.
451
+ return {
452
+ decision: "deny",
453
+ reason,
454
+ };
455
+ }
456
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@autopilot-harness/port-gemini-cli",
3
+ "version": "0.7.0",
4
+ "description": "Autopilot harness host port for Gemini CLI hooks (BeforeAgent/AfterTool/AfterAgent; turn cap MAX_TURNS)",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/mt2007/autopilot-harness.git",
9
+ "directory": "packages/ports/gemini-cli"
10
+ },
11
+ "homepage": "https://github.com/mt2007/autopilot-harness#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/mt2007/autopilot-harness/issues"
14
+ },
15
+ "type": "module",
16
+ "main": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "dependencies": {
28
+ "@autopilot-harness/core": "0.7.0"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.8.2"
32
+ },
33
+ "engines": {
34
+ "node": ">=22"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "author": "mt2007 (https://github.com/mt2007)",
40
+ "keywords": [
41
+ "autopilot",
42
+ "harness",
43
+ "agent",
44
+ "ai",
45
+ "vibecoding",
46
+ "gemini",
47
+ "gemini-cli",
48
+ "checklist",
49
+ "code-review"
50
+ ],
51
+ "scripts": {
52
+ "build": "tsc -p tsconfig.json",
53
+ "typecheck": "tsc -p tsconfig.json --noEmit"
54
+ }
55
+ }