@zhixuan92/multi-model-agent-core 5.0.3 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/events/plain-log-entry.d.ts +1 -1
- package/dist/events/plain-log-entry.d.ts.map +1 -1
- package/dist/events/plain-log-entry.js +5 -1
- package/dist/events/plain-log-entry.js.map +1 -1
- package/dist/events/wire-schema.d.ts +4 -4
- package/dist/lifecycle/derive-completion.d.ts +4 -0
- package/dist/lifecycle/derive-completion.d.ts.map +1 -1
- package/dist/lifecycle/derive-completion.js +14 -1
- package/dist/lifecycle/derive-completion.js.map +1 -1
- package/dist/lifecycle/git-exec.d.ts +62 -0
- package/dist/lifecycle/git-exec.d.ts.map +1 -0
- package/dist/lifecycle/git-exec.js +135 -0
- package/dist/lifecycle/git-exec.js.map +1 -0
- package/dist/lifecycle/goal-builder.d.ts +35 -0
- package/dist/lifecycle/goal-builder.d.ts.map +1 -0
- package/dist/lifecycle/goal-builder.js +56 -0
- package/dist/lifecycle/goal-builder.js.map +1 -0
- package/dist/lifecycle/goal-preconditions.d.ts +21 -0
- package/dist/lifecycle/goal-preconditions.d.ts.map +1 -0
- package/dist/lifecycle/goal-preconditions.js +33 -0
- package/dist/lifecycle/goal-preconditions.js.map +1 -0
- package/dist/lifecycle/goal-prompts.d.ts +27 -0
- package/dist/lifecycle/goal-prompts.d.ts.map +1 -0
- package/dist/lifecycle/goal-prompts.js +204 -0
- package/dist/lifecycle/goal-prompts.js.map +1 -0
- package/dist/lifecycle/goal-report.d.ts +42 -0
- package/dist/lifecycle/goal-report.d.ts.map +1 -0
- package/dist/lifecycle/goal-report.js +125 -0
- package/dist/lifecycle/goal-report.js.map +1 -0
- package/dist/lifecycle/handlers/annotate-stage.d.ts.map +1 -1
- package/dist/lifecycle/handlers/annotate-stage.js +27 -0
- package/dist/lifecycle/handlers/annotate-stage.js.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts +3 -3
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js +3 -25
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js.map +1 -1
- package/dist/lifecycle/handlers/review-fix-stage.d.ts +9 -0
- package/dist/lifecycle/handlers/review-fix-stage.d.ts.map +1 -0
- package/dist/lifecycle/handlers/review-fix-stage.js +75 -0
- package/dist/lifecycle/handlers/review-fix-stage.js.map +1 -0
- package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/terminal-handlers.js +15 -3
- package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
- package/dist/lifecycle/stage-io.d.ts +0 -23
- package/dist/lifecycle/stage-io.d.ts.map +1 -1
- package/dist/lifecycle/stage-io.js +0 -11
- package/dist/lifecycle/stage-io.js.map +1 -1
- package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
- package/dist/lifecycle/stage-plan-builder.js +42 -49
- package/dist/lifecycle/stage-plan-builder.js.map +1 -1
- package/dist/lifecycle/stage-plan-types.d.ts +8 -8
- package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
- package/dist/lifecycle/stage-plan-types.js.map +1 -1
- package/dist/lifecycle/task-executor.d.ts.map +1 -1
- package/dist/lifecycle/task-executor.js +46 -1
- package/dist/lifecycle/task-executor.js.map +1 -1
- package/dist/lifecycle/task-runner.d.ts.map +1 -1
- package/dist/lifecycle/task-runner.js +3 -1
- package/dist/lifecycle/task-runner.js.map +1 -1
- package/dist/lifecycle/write-goal-lock.d.ts +29 -0
- package/dist/lifecycle/write-goal-lock.d.ts.map +1 -0
- package/dist/lifecycle/write-goal-lock.js +70 -0
- package/dist/lifecycle/write-goal-lock.js.map +1 -0
- package/dist/providers/claude-session.d.ts.map +1 -1
- package/dist/providers/claude-session.js +14 -0
- package/dist/providers/claude-session.js.map +1 -1
- package/dist/research/adapters/arxiv.d.ts.map +1 -1
- package/dist/research/adapters/arxiv.js +6 -1
- package/dist/research/adapters/arxiv.js.map +1 -1
- package/dist/tools/delegate/brief-slot.d.ts +14 -11
- package/dist/tools/delegate/brief-slot.d.ts.map +1 -1
- package/dist/tools/delegate/brief-slot.js +29 -53
- package/dist/tools/delegate/brief-slot.js.map +1 -1
- package/dist/tools/delegate/schema.d.ts +0 -4
- package/dist/tools/delegate/schema.d.ts.map +1 -1
- package/dist/tools/delegate/schema.js +3 -2
- package/dist/tools/delegate/schema.js.map +1 -1
- package/dist/tools/delegate/tool-config.d.ts.map +1 -1
- package/dist/tools/delegate/tool-config.js +20 -17
- package/dist/tools/delegate/tool-config.js.map +1 -1
- package/dist/tools/execute-plan/brief-slot.d.ts +11 -5
- package/dist/tools/execute-plan/brief-slot.d.ts.map +1 -1
- package/dist/tools/execute-plan/brief-slot.js +57 -13
- package/dist/tools/execute-plan/brief-slot.js.map +1 -1
- package/dist/tools/execute-plan/tool-config.d.ts.map +1 -1
- package/dist/tools/execute-plan/tool-config.js +18 -67
- package/dist/tools/execute-plan/tool-config.js.map +1 -1
- package/dist/tools/journal/record/brief-slot.d.ts +9 -6
- package/dist/tools/journal/record/brief-slot.d.ts.map +1 -1
- package/dist/tools/journal/record/brief-slot.js +18 -14
- package/dist/tools/journal/record/brief-slot.js.map +1 -1
- package/dist/tools/journal/record/tool-config.d.ts.map +1 -1
- package/dist/tools/journal/record/tool-config.js +18 -11
- package/dist/tools/journal/record/tool-config.js.map +1 -1
- package/dist/tools/retry/brief-slot.d.ts +1 -1
- package/dist/tools/retry/brief-slot.d.ts.map +1 -1
- package/dist/tools/retry/brief-slot.js +2 -1
- package/dist/tools/retry/brief-slot.js.map +1 -1
- package/dist/tools/retry/schema.d.ts +0 -1
- package/dist/tools/retry/schema.d.ts.map +1 -1
- package/dist/tools/retry/schema.js +6 -6
- package/dist/tools/retry/schema.js.map +1 -1
- package/dist/tools/retry/tool-config.d.ts.map +1 -1
- package/dist/tools/retry/tool-config.js +23 -28
- package/dist/tools/retry/tool-config.js.map +1 -1
- package/dist/types/goal.d.ts +47 -0
- package/dist/types/goal.d.ts.map +1 -0
- package/dist/types/goal.js +2 -0
- package/dist/types/goal.js.map +1 -0
- package/dist/types/task-spec.d.ts +11 -0
- package/dist/types/task-spec.d.ts.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/lifecycle/diff-tracker.d.ts +0 -88
- package/dist/lifecycle/diff-tracker.d.ts.map +0 -1
- package/dist/lifecycle/diff-tracker.js +0 -429
- package/dist/lifecycle/diff-tracker.js.map +0 -1
- package/dist/lifecycle/handlers/compose-commit-message.d.ts +0 -15
- package/dist/lifecycle/handlers/compose-commit-message.d.ts.map +0 -1
- package/dist/lifecycle/handlers/compose-commit-message.js +0 -227
- package/dist/lifecycle/handlers/compose-commit-message.js.map +0 -1
- package/dist/lifecycle/handlers/git-commit-handler.d.ts +0 -4
- package/dist/lifecycle/handlers/git-commit-handler.d.ts.map +0 -1
- package/dist/lifecycle/handlers/git-commit-handler.js +0 -202
- package/dist/lifecycle/handlers/git-commit-handler.js.map +0 -1
- package/dist/lifecycle/handlers/journal-review-prompt.d.ts +0 -7
- package/dist/lifecycle/handlers/journal-review-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/journal-review-prompt.js +0 -54
- package/dist/lifecycle/handlers/journal-review-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/parse-review-report.d.ts +0 -15
- package/dist/lifecycle/handlers/parse-review-report.d.ts.map +0 -1
- package/dist/lifecycle/handlers/parse-review-report.js +0 -40
- package/dist/lifecycle/handlers/parse-review-report.js.map +0 -1
- package/dist/lifecycle/handlers/quality-review-prompt.d.ts +0 -7
- package/dist/lifecycle/handlers/quality-review-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/quality-review-prompt.js +0 -50
- package/dist/lifecycle/handlers/quality-review-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/review-stage.d.ts +0 -4
- package/dist/lifecycle/handlers/review-stage.d.ts.map +0 -1
- package/dist/lifecycle/handlers/review-stage.js +0 -277
- package/dist/lifecycle/handlers/review-stage.js.map +0 -1
- package/dist/lifecycle/handlers/rework-prompt.d.ts +0 -6
- package/dist/lifecycle/handlers/rework-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/rework-prompt.js +0 -18
- package/dist/lifecycle/handlers/rework-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/rework-stage.d.ts +0 -4
- package/dist/lifecycle/handlers/rework-stage.d.ts.map +0 -1
- package/dist/lifecycle/handlers/rework-stage.js +0 -191
- package/dist/lifecycle/handlers/rework-stage.js.map +0 -1
- package/dist/lifecycle/handlers/spec-review-prompt.d.ts +0 -8
- package/dist/lifecycle/handlers/spec-review-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/spec-review-prompt.js +0 -47
- package/dist/lifecycle/handlers/spec-review-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/tier-policy.d.ts +0 -11
- package/dist/lifecycle/handlers/tier-policy.d.ts.map +0 -1
- package/dist/lifecycle/handlers/tier-policy.js +0 -12
- package/dist/lifecycle/handlers/tier-policy.js.map +0 -1
- package/dist/lifecycle/repo-commit-lock.d.ts +0 -20
- package/dist/lifecycle/repo-commit-lock.d.ts.map +0 -1
- package/dist/lifecycle/repo-commit-lock.js +0 -40
- package/dist/lifecycle/repo-commit-lock.js.map +0 -1
|
@@ -32,7 +32,7 @@ export declare const PlainLogEntrySchema: z.ZodObject<{
|
|
|
32
32
|
fields: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>;
|
|
33
33
|
}, z.core.$strict>;
|
|
34
34
|
export type PlainLogEntry = z.infer<typeof PlainLogEntrySchema>;
|
|
35
|
-
export declare const PROVIDER_EVENT_NAMES: readonly ["claude_session_starting", "claude_turn_started", "claude_error", "claude_turn_completed", "claude_text_emission", "claude_tool_call", "claude_session_closed", "codex_subprocess_starting", "codex_spawn_failed", "codex_subprocess_started", "codex_subprocess_exited", "codex_thread_started", "codex_turn_started", "codex_command_started", "codex_command_completed", "codex_turn_completed", "codex_turn_failed", "codex_error", "codex_agent_message", "codex_file_change"];
|
|
35
|
+
export declare const PROVIDER_EVENT_NAMES: readonly ["claude_session_starting", "claude_turn_started", "claude_error", "claude_turn_completed", "claude_text_emission", "claude_tool_call", "claude_session_closed", "claude_compaction", "codex_subprocess_starting", "codex_spawn_failed", "codex_subprocess_started", "codex_subprocess_exited", "codex_thread_started", "codex_turn_started", "codex_command_started", "codex_command_completed", "codex_turn_completed", "codex_turn_failed", "codex_error", "codex_agent_message", "codex_file_change"];
|
|
36
36
|
export type ProviderEventName = (typeof PROVIDER_EVENT_NAMES)[number];
|
|
37
37
|
/** Per-event field shapes are NOT pre-declared — `mapProviderEventToPlainEntry`
|
|
38
38
|
* passes through all primitive fields from the raw event payload (object-valued
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plain-log-entry.d.ts","sourceRoot":"","sources":["../../src/events/plain-log-entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;EAQ3B,CAAC;AAGH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;kBAIrB,CAAC;AACZ,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"plain-log-entry.d.ts","sourceRoot":"","sources":["../../src/events/plain-log-entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;EAQ3B,CAAC;AAGH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;kBAIrB,CAAC;AACZ,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,oBAAoB,ofAYvB,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE;;;;;GAKG;AAEH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,GAAG,OAAO,EAC5B,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,aAAa,CAUf"}
|
|
@@ -16,9 +16,13 @@ export const PlainLogEntrySchema = z.object({
|
|
|
16
16
|
fields: z.record(z.string(), FieldValue),
|
|
17
17
|
}).strict();
|
|
18
18
|
export const PROVIDER_EVENT_NAMES = [
|
|
19
|
-
// Claude (
|
|
19
|
+
// Claude (8)
|
|
20
20
|
'claude_session_starting', 'claude_turn_started', 'claude_error',
|
|
21
21
|
'claude_turn_completed', 'claude_text_emission', 'claude_tool_call', 'claude_session_closed',
|
|
22
|
+
// Compaction observability (5.1.0, goal mode): emitted on the SDK's
|
|
23
|
+
// compact_boundary system message so long goal-set runs are no longer
|
|
24
|
+
// blind to context compaction. Observe-only — carries {trigger, preTokens, postTokens}.
|
|
25
|
+
'claude_compaction',
|
|
22
26
|
// Codex (13)
|
|
23
27
|
'codex_subprocess_starting', 'codex_spawn_failed', 'codex_subprocess_started', 'codex_subprocess_exited',
|
|
24
28
|
'codex_thread_started', 'codex_turn_started', 'codex_command_started', 'codex_command_completed',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plain-log-entry.js","sourceRoot":"","sources":["../../src/events/plain-log-entry.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,gBAAgB,EAAC,gBAAgB;IACjC,eAAe,EAAC,kBAAkB,EAAC,iBAAiB;IACpD,iBAAiB,EAAC,cAAc;IAChC,iBAAiB;IACjB,sBAAsB,EAAC,sBAAsB;IAC7C,gBAAgB;IAChB,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC;CACzC,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,aAAa;IACb,yBAAyB,EAAC,qBAAqB,EAAC,cAAc;IAC9D,uBAAuB,EAAC,sBAAsB,EAAC,kBAAkB,EAAC,uBAAuB;IACzF,aAAa;IACb,2BAA2B,EAAC,oBAAoB,EAAC,0BAA0B,EAAC,yBAAyB;IACrG,sBAAsB,EAAC,oBAAoB,EAAC,uBAAuB,EAAC,yBAAyB;IAC7F,sBAAsB,EAAC,mBAAmB,EAAC,aAAa,EAAC,qBAAqB,EAAC,mBAAmB;CAC1F,CAAC;AAGX;;;;;GAKG;AAEH,MAAM,UAAU,4BAA4B,CAC1C,QAA4B,EAC5B,KAAwB,EACxB,SAAkC;IAElC,MAAM,MAAM,GAAqD,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACrF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3F,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;AAC1E,CAAC"}
|
|
1
|
+
{"version":3,"file":"plain-log-entry.js","sourceRoot":"","sources":["../../src/events/plain-log-entry.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,gBAAgB,EAAC,gBAAgB;IACjC,eAAe,EAAC,kBAAkB,EAAC,iBAAiB;IACpD,iBAAiB,EAAC,cAAc;IAChC,iBAAiB;IACjB,sBAAsB,EAAC,sBAAsB;IAC7C,gBAAgB;IAChB,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC;CACzC,CAAC,CAAC,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,aAAa;IACb,yBAAyB,EAAC,qBAAqB,EAAC,cAAc;IAC9D,uBAAuB,EAAC,sBAAsB,EAAC,kBAAkB,EAAC,uBAAuB;IACzF,oEAAoE;IACpE,sEAAsE;IACtE,wFAAwF;IACxF,mBAAmB;IACnB,aAAa;IACb,2BAA2B,EAAC,oBAAoB,EAAC,0BAA0B,EAAC,yBAAyB;IACrG,sBAAsB,EAAC,oBAAoB,EAAC,uBAAuB,EAAC,yBAAyB;IAC7F,sBAAsB,EAAC,mBAAmB,EAAC,aAAa,EAAC,qBAAqB,EAAC,mBAAmB;CAC1F,CAAC;AAGX;;;;;GAKG;AAEH,MAAM,UAAU,4BAA4B,CAC1C,QAA4B,EAC5B,KAAwB,EACxB,SAAkC;IAElC,MAAM,MAAM,GAAqD,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACrF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3F,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;AAC1E,CAAC"}
|
|
@@ -394,12 +394,12 @@ export declare const TaskCompletedEventSchema: z.ZodObject<{
|
|
|
394
394
|
research: "research";
|
|
395
395
|
review: "review";
|
|
396
396
|
delegate: "delegate";
|
|
397
|
+
"execute-plan": "execute-plan";
|
|
398
|
+
"journal-record": "journal-record";
|
|
397
399
|
audit: "audit";
|
|
398
400
|
debug: "debug";
|
|
399
401
|
investigate: "investigate";
|
|
400
|
-
"execute-plan": "execute-plan";
|
|
401
402
|
retry: "retry";
|
|
402
|
-
"journal-record": "journal-record";
|
|
403
403
|
"journal-recall": "journal-recall";
|
|
404
404
|
"register-context-block": "register-context-block";
|
|
405
405
|
}>;
|
|
@@ -719,12 +719,12 @@ export declare const ValidatedTaskCompletedEventSchema: z.ZodObject<{
|
|
|
719
719
|
research: "research";
|
|
720
720
|
review: "review";
|
|
721
721
|
delegate: "delegate";
|
|
722
|
+
"execute-plan": "execute-plan";
|
|
723
|
+
"journal-record": "journal-record";
|
|
722
724
|
audit: "audit";
|
|
723
725
|
debug: "debug";
|
|
724
726
|
investigate: "investigate";
|
|
725
|
-
"execute-plan": "execute-plan";
|
|
726
727
|
retry: "retry";
|
|
727
|
-
"journal-record": "journal-record";
|
|
728
728
|
"journal-recall": "journal-recall";
|
|
729
729
|
"register-context-block": "register-context-block";
|
|
730
730
|
}>;
|
|
@@ -13,6 +13,10 @@ export interface CompletionInputs {
|
|
|
13
13
|
unaddressedFindingIds: string[] | undefined;
|
|
14
14
|
commitKind: 'committed' | 'no_op' | undefined;
|
|
15
15
|
criteriaSucceeded: string[] | undefined;
|
|
16
|
+
/** Goal mode (write routes): commits in baseSha..HEAD. When defined, the
|
|
17
|
+
* goal branch applies — completion = implement advanced AND ≥1 commit
|
|
18
|
+
* (the agent self-commits; there is no MMA review verdict / commit gate). */
|
|
19
|
+
goalCommitCount?: number;
|
|
16
20
|
}
|
|
17
21
|
export interface CompletionResult {
|
|
18
22
|
completed: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-completion.d.ts","sourceRoot":"","sources":["../../src/lifecycle/derive-completion.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAM1D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,gBAAgB,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1D,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,WAAW,GAAG,MAAM,CAAC;IAC7D,aAAa,EAAE,UAAU,GAAG,UAAU,GAAG,kBAAkB,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5G,gBAAgB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,aAAa,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,qBAAqB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5C,UAAU,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9C,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"derive-completion.d.ts","sourceRoot":"","sources":["../../src/lifecycle/derive-completion.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAM1D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,gBAAgB,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1D,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,WAAW,GAAG,MAAM,CAAC;IAC7D,aAAa,EAAE,UAAU,GAAG,UAAU,GAAG,kBAAkB,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5G,gBAAgB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,aAAa,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,qBAAqB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5C,UAAU,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9C,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC;;kFAE8E;IAC9E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAwC3E;AAMD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,CA2B/E"}
|
|
@@ -22,7 +22,17 @@ export function deriveCompletion(inputs) {
|
|
|
22
22
|
reasons.push('no successful criteria');
|
|
23
23
|
return { completed: implementOk && criteriaOk, reasons };
|
|
24
24
|
}
|
|
25
|
-
//
|
|
25
|
+
// 3a. Goal-mode write routes: the agent self-commits and there is no MMA
|
|
26
|
+
// review verdict / commit gate. Completion = implementer advanced AND at
|
|
27
|
+
// least one commit landed in baseSha..HEAD (mirrors the status truth table:
|
|
28
|
+
// failed only on zero commits).
|
|
29
|
+
if (inputs.goalCommitCount !== undefined) {
|
|
30
|
+
const committed = inputs.goalCommitCount > 0;
|
|
31
|
+
if (!committed)
|
|
32
|
+
reasons.push('no commits landed');
|
|
33
|
+
return { completed: implementOk && committed, reasons };
|
|
34
|
+
}
|
|
35
|
+
// 3. Write routes (legacy non-goal): review + commit must pass
|
|
26
36
|
const reviewOk = inputs.reviewPolicy === 'none' ||
|
|
27
37
|
inputs.reviewVerdict === 'approved' ||
|
|
28
38
|
(inputs.reviewVerdict === 'changes_required' &&
|
|
@@ -61,6 +71,9 @@ export function extractCompletionInputs(state) {
|
|
|
61
71
|
unaddressedFindingIds: state.unaddressedFindingIds ?? last?.unaddressedFindingIds,
|
|
62
72
|
commitKind,
|
|
63
73
|
criteriaSucceeded: last?.criteriaSucceeded,
|
|
74
|
+
...(state.goalCommitCount !== undefined && {
|
|
75
|
+
goalCommitCount: state.goalCommitCount,
|
|
76
|
+
}),
|
|
64
77
|
};
|
|
65
78
|
}
|
|
66
79
|
//# sourceMappingURL=derive-completion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-completion.js","sourceRoot":"","sources":["../../src/lifecycle/derive-completion.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,gEAAgE;AAChE,oDAAoD;AACpD,8DAA8D;AAC9D,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,cAAc;AAId,MAAM,WAAW,GAA2B,IAAI,GAAG,CAAC;IAClD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB;CACpE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"derive-completion.js","sourceRoot":"","sources":["../../src/lifecycle/derive-completion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export interface GitResult {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
code: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Run a git subcommand in `cwd`. Never throws — a non-zero exit (or spawn
|
|
8
|
+
* failure) is returned as `{ code, stderr }`. Shared by the goal-set executor
|
|
9
|
+
* (preconditions, baseSha capture, git-log report) so git plumbing lives in one
|
|
10
|
+
* place rather than inline in a handler.
|
|
11
|
+
*/
|
|
12
|
+
export declare function gitC(cwd: string, args: string[]): Promise<GitResult>;
|
|
13
|
+
/** True when `cwd` is inside a git work-tree. */
|
|
14
|
+
export declare function isInsideWorkTree(cwd: string): Promise<boolean>;
|
|
15
|
+
/** Resolved HEAD sha, or null when HEAD is unborn / unresolvable. */
|
|
16
|
+
export declare function currentHead(cwd: string): Promise<string | null>;
|
|
17
|
+
/**
|
|
18
|
+
* True when the work-tree has no uncommitted changes (tracked or untracked).
|
|
19
|
+
* Uses `git status --porcelain` — empty output means clean.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isCleanWorkTree(cwd: string): Promise<boolean>;
|
|
22
|
+
/** True when `ancestor` is an ancestor of (or equal to) `descendant`. */
|
|
23
|
+
export declare function isAncestor(cwd: string, ancestor: string, descendant: string): Promise<boolean>;
|
|
24
|
+
/** Number of commits in `base..HEAD` (0 when none / base unresolved). */
|
|
25
|
+
export declare function commitCount(cwd: string, base: string): Promise<number>;
|
|
26
|
+
export interface GitLogCommit {
|
|
27
|
+
sha: string;
|
|
28
|
+
subject: string;
|
|
29
|
+
filesChanged: string[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Structured commit list for `base..HEAD`, oldest-first. Subjects + changed
|
|
33
|
+
* files only (no patch bodies) so the payload stays bounded — see the spec's
|
|
34
|
+
* git-log-format note. Returns [] when base is unresolved or there are none.
|
|
35
|
+
*/
|
|
36
|
+
export declare function gitLogCommits(cwd: string, base: string): Promise<GitLogCommit[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Render `base..HEAD` as `git log --stat`-style text for the phase-2 handoff,
|
|
39
|
+
* truncated to `maxBytes` with a marker. Subjects + per-commit file lists, no
|
|
40
|
+
* patch body.
|
|
41
|
+
*/
|
|
42
|
+
export declare function renderGitLogStat(cwd: string, base: string, maxBytes?: number): Promise<{
|
|
43
|
+
text: string;
|
|
44
|
+
truncated: boolean;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Render the UNCOMMITTED working-tree state for the phase-2 prompt: `git status
|
|
48
|
+
* --short` plus a `--stat` of staged+unstaged changes (no patch body). This is
|
|
49
|
+
* what lets the review-fix tier see work the implementer wrote but did NOT
|
|
50
|
+
* commit — without it, an implementer that under-commits leaves phase 2 blind.
|
|
51
|
+
* Returns '(clean working tree)' when there are no uncommitted changes.
|
|
52
|
+
*/
|
|
53
|
+
export declare function renderWorkingTreeStatus(cwd: string, maxBytes?: number): Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Ensure a committer identity is resolvable for the agent's own `git commit`
|
|
56
|
+
* calls. The agent commits in its own subprocess, so env overrides won't reach
|
|
57
|
+
* it — instead, when the repo/global config has no identity, set a goal-set
|
|
58
|
+
* identity in the **local repo config** so the agent's commits inherit it.
|
|
59
|
+
* Returns true when it set one, false when an identity already existed.
|
|
60
|
+
*/
|
|
61
|
+
export declare function ensureGitIdentity(cwd: string, goalId: string): Promise<boolean>;
|
|
62
|
+
//# sourceMappingURL=git-exec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-exec.d.ts","sourceRoot":"","sources":["../../src/lifecycle/git-exec.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAY1E;AAED,iDAAiD;AACjD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpE;AAED,qEAAqE;AACrE,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKrE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGnE;AAED,yEAAyE;AACzE,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIpG;AAED,yEAAyE;AACzE,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK5E;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAkBtF;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAa,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAOtI;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAShG;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileP = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Run a git subcommand in `cwd`. Never throws — a non-zero exit (or spawn
|
|
6
|
+
* failure) is returned as `{ code, stderr }`. Shared by the goal-set executor
|
|
7
|
+
* (preconditions, baseSha capture, git-log report) so git plumbing lives in one
|
|
8
|
+
* place rather than inline in a handler.
|
|
9
|
+
*/
|
|
10
|
+
export async function gitC(cwd, args) {
|
|
11
|
+
try {
|
|
12
|
+
const { stdout, stderr } = await execFileP('git', ['-C', cwd, ...args], { windowsHide: true });
|
|
13
|
+
return { stdout, stderr, code: 0 };
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
const e = err;
|
|
17
|
+
return {
|
|
18
|
+
stdout: e.stdout ?? '',
|
|
19
|
+
stderr: e.stderr ?? e.message ?? String(err),
|
|
20
|
+
code: typeof e.code === 'number' ? e.code : 1,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** True when `cwd` is inside a git work-tree. */
|
|
25
|
+
export async function isInsideWorkTree(cwd) {
|
|
26
|
+
const r = await gitC(cwd, ['rev-parse', '--is-inside-work-tree']);
|
|
27
|
+
return r.code === 0 && r.stdout.trim() === 'true';
|
|
28
|
+
}
|
|
29
|
+
/** Resolved HEAD sha, or null when HEAD is unborn / unresolvable. */
|
|
30
|
+
export async function currentHead(cwd) {
|
|
31
|
+
const r = await gitC(cwd, ['rev-parse', 'HEAD']);
|
|
32
|
+
if (r.code !== 0)
|
|
33
|
+
return null;
|
|
34
|
+
const sha = r.stdout.trim();
|
|
35
|
+
return sha.length > 0 ? sha : null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* True when the work-tree has no uncommitted changes (tracked or untracked).
|
|
39
|
+
* Uses `git status --porcelain` — empty output means clean.
|
|
40
|
+
*/
|
|
41
|
+
export async function isCleanWorkTree(cwd) {
|
|
42
|
+
const r = await gitC(cwd, ['status', '--porcelain']);
|
|
43
|
+
return r.code === 0 && r.stdout.trim() === '';
|
|
44
|
+
}
|
|
45
|
+
/** True when `ancestor` is an ancestor of (or equal to) `descendant`. */
|
|
46
|
+
export async function isAncestor(cwd, ancestor, descendant) {
|
|
47
|
+
if (ancestor === descendant)
|
|
48
|
+
return true;
|
|
49
|
+
const r = await gitC(cwd, ['merge-base', '--is-ancestor', ancestor, descendant]);
|
|
50
|
+
return r.code === 0;
|
|
51
|
+
}
|
|
52
|
+
/** Number of commits in `base..HEAD` (0 when none / base unresolved). */
|
|
53
|
+
export async function commitCount(cwd, base) {
|
|
54
|
+
const r = await gitC(cwd, ['rev-list', '--count', `${base}..HEAD`]);
|
|
55
|
+
if (r.code !== 0)
|
|
56
|
+
return 0;
|
|
57
|
+
const n = Number.parseInt(r.stdout.trim(), 10);
|
|
58
|
+
return Number.isFinite(n) ? n : 0;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Structured commit list for `base..HEAD`, oldest-first. Subjects + changed
|
|
62
|
+
* files only (no patch bodies) so the payload stays bounded — see the spec's
|
|
63
|
+
* git-log-format note. Returns [] when base is unresolved or there are none.
|
|
64
|
+
*/
|
|
65
|
+
export async function gitLogCommits(cwd, base) {
|
|
66
|
+
// %x00 record sep, %x1e field sep: sha, subject. Then --name-only file lines.
|
|
67
|
+
const r = await gitC(cwd, [
|
|
68
|
+
'log', '--reverse', '--name-only', '--no-color',
|
|
69
|
+
'--pretty=format:%x1e%H%x1f%s', `${base}..HEAD`,
|
|
70
|
+
]);
|
|
71
|
+
if (r.code !== 0 || r.stdout.trim() === '')
|
|
72
|
+
return [];
|
|
73
|
+
const commits = [];
|
|
74
|
+
const records = r.stdout.split('\x1e').filter((s) => s.length > 0);
|
|
75
|
+
for (const rec of records) {
|
|
76
|
+
const nlIdx = rec.indexOf('\n');
|
|
77
|
+
const header = nlIdx === -1 ? rec : rec.slice(0, nlIdx);
|
|
78
|
+
const [sha, subject] = header.split('\x1f');
|
|
79
|
+
const fileBlock = nlIdx === -1 ? '' : rec.slice(nlIdx + 1);
|
|
80
|
+
const filesChanged = fileBlock.split('\n').map((l) => l.trim()).filter((l) => l.length > 0);
|
|
81
|
+
commits.push({ sha: (sha ?? '').trim(), subject: (subject ?? '').trim(), filesChanged });
|
|
82
|
+
}
|
|
83
|
+
return commits;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Render `base..HEAD` as `git log --stat`-style text for the phase-2 handoff,
|
|
87
|
+
* truncated to `maxBytes` with a marker. Subjects + per-commit file lists, no
|
|
88
|
+
* patch body.
|
|
89
|
+
*/
|
|
90
|
+
export async function renderGitLogStat(cwd, base, maxBytes = 128 * 1024) {
|
|
91
|
+
const r = await gitC(cwd, ['log', '--stat', '--no-patch', '--no-color', `${base}..HEAD`]);
|
|
92
|
+
const full = r.code === 0 ? r.stdout : '';
|
|
93
|
+
if (Buffer.byteLength(full, 'utf8') <= maxBytes)
|
|
94
|
+
return { text: full, truncated: false };
|
|
95
|
+
// Truncate on a UTF-8-safe boundary.
|
|
96
|
+
const buf = Buffer.from(full, 'utf8').subarray(0, maxBytes);
|
|
97
|
+
return { text: buf.toString('utf8') + '\n…[git_log_truncated]…\n', truncated: true };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Render the UNCOMMITTED working-tree state for the phase-2 prompt: `git status
|
|
101
|
+
* --short` plus a `--stat` of staged+unstaged changes (no patch body). This is
|
|
102
|
+
* what lets the review-fix tier see work the implementer wrote but did NOT
|
|
103
|
+
* commit — without it, an implementer that under-commits leaves phase 2 blind.
|
|
104
|
+
* Returns '(clean working tree)' when there are no uncommitted changes.
|
|
105
|
+
*/
|
|
106
|
+
export async function renderWorkingTreeStatus(cwd, maxBytes = 64 * 1024) {
|
|
107
|
+
const status = await gitC(cwd, ['status', '--short']);
|
|
108
|
+
if (status.code !== 0)
|
|
109
|
+
return '(working-tree status unavailable)';
|
|
110
|
+
if (status.stdout.trim() === '')
|
|
111
|
+
return '(clean working tree — nothing uncommitted)';
|
|
112
|
+
const stat = await gitC(cwd, ['diff', 'HEAD', '--stat', '--no-color']);
|
|
113
|
+
const text = `Uncommitted changes (git status --short):\n${status.stdout}\n` +
|
|
114
|
+
(stat.code === 0 && stat.stdout.trim() ? `\nDiff stat vs HEAD:\n${stat.stdout}` : '');
|
|
115
|
+
if (Buffer.byteLength(text, 'utf8') <= maxBytes)
|
|
116
|
+
return text;
|
|
117
|
+
return Buffer.from(text, 'utf8').subarray(0, maxBytes).toString('utf8') + '\n…[truncated]…\n';
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Ensure a committer identity is resolvable for the agent's own `git commit`
|
|
121
|
+
* calls. The agent commits in its own subprocess, so env overrides won't reach
|
|
122
|
+
* it — instead, when the repo/global config has no identity, set a goal-set
|
|
123
|
+
* identity in the **local repo config** so the agent's commits inherit it.
|
|
124
|
+
* Returns true when it set one, false when an identity already existed.
|
|
125
|
+
*/
|
|
126
|
+
export async function ensureGitIdentity(cwd, goalId) {
|
|
127
|
+
const name = await gitC(cwd, ['config', 'user.name']);
|
|
128
|
+
const email = await gitC(cwd, ['config', 'user.email']);
|
|
129
|
+
if (name.code === 0 && name.stdout.trim() && email.code === 0 && email.stdout.trim())
|
|
130
|
+
return false;
|
|
131
|
+
await gitC(cwd, ['config', 'user.name', `MMA Goal ${goalId}`]);
|
|
132
|
+
await gitC(cwd, ['config', 'user.email', 'noreply@mmagent.local']);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=git-exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-exec.js","sourceRoot":"","sources":["../../src/lifecycle/git-exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Goal, GoalPhase, GoalSource, GoalReviewPolicy } from '../types/goal.js';
|
|
2
|
+
import type { ToolMode, SandboxPolicy } from '../types/task-spec.js';
|
|
3
|
+
export interface TaskInput {
|
|
4
|
+
heading: string;
|
|
5
|
+
body: string;
|
|
6
|
+
/** 1-based plan-phase; defaults to 1 (single checkpoint). */
|
|
7
|
+
phase?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface AssembleGoalArgs {
|
|
10
|
+
source: GoalSource;
|
|
11
|
+
cwd: string;
|
|
12
|
+
tasks: TaskInput[];
|
|
13
|
+
/** Phase tiers. [implement] or [implement, review-fix]. */
|
|
14
|
+
phases: GoalPhase[];
|
|
15
|
+
reviewPolicy: GoalReviewPolicy;
|
|
16
|
+
tools: ToolMode;
|
|
17
|
+
sandboxPolicy: SandboxPolicy;
|
|
18
|
+
skills?: string[];
|
|
19
|
+
contextBlockIds?: string[];
|
|
20
|
+
goalId?: string;
|
|
21
|
+
/** Route-specific procedure prepended to both phase prompts. */
|
|
22
|
+
preamble?: string;
|
|
23
|
+
/** Operator's per-task wall-clock budget (config.defaults.timeoutMs); the phase
|
|
24
|
+
* deadline scales off it. Falls back to PER_TASK_DEFAULT_MS when unset. */
|
|
25
|
+
perTaskTimeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare function assembleGoal(args: AssembleGoalArgs): Goal;
|
|
28
|
+
/**
|
|
29
|
+
* Map a goal into the single TaskSpec the executor dispatches. The implement
|
|
30
|
+
* prompt is materialized into `prompt`; phase-1 tier becomes `agentType`;
|
|
31
|
+
* `reviewPolicy` collapses to the lifecycle's none/full axis (the review-fix
|
|
32
|
+
* stage only distinguishes none vs run).
|
|
33
|
+
*/
|
|
34
|
+
export declare function goalToTaskSpec(goal: Goal, implementPrompt: string, timeoutMs: number): import('../types.js').TaskSpec;
|
|
35
|
+
//# sourceMappingURL=goal-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-builder.d.ts","sourceRoot":"","sources":["../../src/lifecycle/goal-builder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGrE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,2DAA2D;IAC3D,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,KAAK,EAAE,QAAQ,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;gFAC4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CA2BzD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,aAAa,EAAE,QAAQ,CAchC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Shared Goal assembler. Each write route's briefSlot derives its task list +
|
|
2
|
+
// tiers + reviewPolicy and calls assembleGoal, which renders the planText and
|
|
3
|
+
// fills the Goal. This is the single construction point — adding a write route
|
|
4
|
+
// means a new briefSlot calling this, nothing else.
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
import { renderPlanText, derivePhaseTimeoutMs, GOAL_IDLE_STALL_MS } from './goal-prompts.js';
|
|
7
|
+
export function assembleGoal(args) {
|
|
8
|
+
const goalTasks = args.tasks.map((t, i) => ({
|
|
9
|
+
n: i + 1,
|
|
10
|
+
heading: t.heading.trim() || `task ${i + 1}`,
|
|
11
|
+
body: t.body,
|
|
12
|
+
phase: t.phase ?? 1,
|
|
13
|
+
}));
|
|
14
|
+
const phaseCount = new Set(goalTasks.map((t) => t.phase)).size;
|
|
15
|
+
// reviewPolicy='none' collapses to phase-1 only (configured phase-1 tier).
|
|
16
|
+
const phases = args.reviewPolicy === 'none' ? [args.phases[0]] : args.phases;
|
|
17
|
+
return {
|
|
18
|
+
goalId: args.goalId ?? randomUUID(),
|
|
19
|
+
cwd: args.cwd,
|
|
20
|
+
source: args.source,
|
|
21
|
+
tasks: goalTasks,
|
|
22
|
+
phaseCount,
|
|
23
|
+
planText: renderPlanText(goalTasks, phaseCount),
|
|
24
|
+
...(args.preamble && { preamble: args.preamble }),
|
|
25
|
+
phases,
|
|
26
|
+
reviewPolicy: args.reviewPolicy,
|
|
27
|
+
sandboxPolicy: args.sandboxPolicy,
|
|
28
|
+
tools: args.tools,
|
|
29
|
+
...(args.skills && args.skills.length > 0 && { skills: args.skills }),
|
|
30
|
+
...(args.contextBlockIds && args.contextBlockIds.length > 0 && { contextBlockIds: args.contextBlockIds }),
|
|
31
|
+
goalPhaseTimeoutMs: derivePhaseTimeoutMs(goalTasks.length, args.perTaskTimeoutMs),
|
|
32
|
+
goalIdleStallMs: GOAL_IDLE_STALL_MS,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Map a goal into the single TaskSpec the executor dispatches. The implement
|
|
37
|
+
* prompt is materialized into `prompt`; phase-1 tier becomes `agentType`;
|
|
38
|
+
* `reviewPolicy` collapses to the lifecycle's none/full axis (the review-fix
|
|
39
|
+
* stage only distinguishes none vs run).
|
|
40
|
+
*/
|
|
41
|
+
export function goalToTaskSpec(goal, implementPrompt, timeoutMs) {
|
|
42
|
+
return {
|
|
43
|
+
prompt: implementPrompt,
|
|
44
|
+
goal,
|
|
45
|
+
agentType: goal.phases[0].tier,
|
|
46
|
+
reviewPolicy: goal.reviewPolicy === 'none' ? 'none' : 'full',
|
|
47
|
+
cwd: goal.cwd,
|
|
48
|
+
tools: goal.tools,
|
|
49
|
+
sandboxPolicy: goal.sandboxPolicy,
|
|
50
|
+
timeoutMs: goal.goalPhaseTimeoutMs ?? timeoutMs,
|
|
51
|
+
...(goal.goalIdleStallMs !== undefined && { idleStallMs: goal.goalIdleStallMs }),
|
|
52
|
+
...(goal.skills && { skills: goal.skills }),
|
|
53
|
+
...(goal.contextBlockIds && { contextBlockIds: goal.contextBlockIds }),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=goal-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-builder.js","sourceRoot":"","sources":["../../src/lifecycle/goal-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Goal } from '../types/goal.js';
|
|
2
|
+
export type GoalPreconditionCode = 'empty_plan' | 'plan_too_large' | 'not_a_git_repo' | 'dirty_working_tree';
|
|
3
|
+
export type GoalPreconditionResult = {
|
|
4
|
+
ok: true;
|
|
5
|
+
baseSha: string;
|
|
6
|
+
} | {
|
|
7
|
+
ok: false;
|
|
8
|
+
code: GoalPreconditionCode;
|
|
9
|
+
message: string;
|
|
10
|
+
};
|
|
11
|
+
/** Synchronous build-time guards (no git): empty plan, oversized plan. */
|
|
12
|
+
export declare function checkGoalShape(goal: Goal): {
|
|
13
|
+
ok: true;
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
code: GoalPreconditionCode;
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
/** Git preconditions + baseSha capture. Run inside withWriteGoalLock. */
|
|
20
|
+
export declare function checkGitPreconditions(goal: Goal): Promise<GoalPreconditionResult>;
|
|
21
|
+
//# sourceMappingURL=goal-preconditions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-preconditions.d.ts","sourceRoot":"","sources":["../../src/lifecycle/goal-preconditions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAC5B,YAAY,GACZ,gBAAgB,GAChB,gBAAgB,GAChB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CASpH;AAED,yEAAyE;AACzE,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAcvF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Hard-fail preconditions for a write goal-set, plus baseSha capture. ALL of
|
|
2
|
+
// this runs INSIDE withWriteGoalLock so the clean-tree-at-baseSha guarantee
|
|
3
|
+
// holds against other serialized goal-sets on the same repo.
|
|
4
|
+
import { isInsideWorkTree, currentHead, isCleanWorkTree, ensureGitIdentity } from './git-exec.js';
|
|
5
|
+
import { MAX_PLAN_TEXT_BYTES } from './goal-prompts.js';
|
|
6
|
+
/** Synchronous build-time guards (no git): empty plan, oversized plan. */
|
|
7
|
+
export function checkGoalShape(goal) {
|
|
8
|
+
if (!goal.tasks || goal.tasks.length === 0) {
|
|
9
|
+
return { ok: false, code: 'empty_plan', message: 'goal has no tasks' };
|
|
10
|
+
}
|
|
11
|
+
const bytes = Buffer.byteLength(goal.planText, 'utf8');
|
|
12
|
+
if (bytes > MAX_PLAN_TEXT_BYTES) {
|
|
13
|
+
return { ok: false, code: 'plan_too_large', message: `planText ${bytes}B exceeds ${MAX_PLAN_TEXT_BYTES}B` };
|
|
14
|
+
}
|
|
15
|
+
return { ok: true };
|
|
16
|
+
}
|
|
17
|
+
/** Git preconditions + baseSha capture. Run inside withWriteGoalLock. */
|
|
18
|
+
export async function checkGitPreconditions(goal) {
|
|
19
|
+
const cwd = goal.cwd;
|
|
20
|
+
if (!(await isInsideWorkTree(cwd))) {
|
|
21
|
+
return { ok: false, code: 'not_a_git_repo', message: `${cwd} is not inside a git work-tree` };
|
|
22
|
+
}
|
|
23
|
+
const head = await currentHead(cwd);
|
|
24
|
+
if (!head) {
|
|
25
|
+
return { ok: false, code: 'not_a_git_repo', message: `${cwd} has no resolvable HEAD (unborn branch)` };
|
|
26
|
+
}
|
|
27
|
+
if (!(await isCleanWorkTree(cwd))) {
|
|
28
|
+
return { ok: false, code: 'dirty_working_tree', message: `${cwd} has uncommitted changes; goal mode requires a clean tree` };
|
|
29
|
+
}
|
|
30
|
+
await ensureGitIdentity(cwd, goal.goalId);
|
|
31
|
+
return { ok: true, baseSha: head };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=goal-preconditions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-preconditions.js","sourceRoot":"","sources":["../../src/lifecycle/goal-preconditions.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,6DAA6D;AAC7D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAaxD,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,IAAU;IACvC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IACzE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvD,IAAI,KAAK,GAAG,mBAAmB,EAAE,CAAC;QAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,KAAK,aAAa,mBAAmB,GAAG,EAAE,CAAC;IAC9G,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAU;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,IAAI,CAAC,CAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,GAAG,gCAAgC,EAAE,CAAC;IAChG,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,GAAG,yCAAyC,EAAE,CAAC;IACzG,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,GAAG,GAAG,2DAA2D,EAAE,CAAC;IAC/H,CAAC;IACD,MAAM,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Goal, GoalTask } from '../types/goal.js';
|
|
2
|
+
export declare const PER_TASK_DEFAULT_MS = 600000;
|
|
3
|
+
export declare const GOAL_IDLE_STALL_MS: number;
|
|
4
|
+
export declare const MAX_PLAN_TEXT_BYTES: number;
|
|
5
|
+
export declare const MAX_GIT_LOG_BYTES: number;
|
|
6
|
+
/**
|
|
7
|
+
* Per-phase wall-clock for a goal-set of `taskCount` tasks. Scales with the task
|
|
8
|
+
* count off the operator's configured per-task budget (`config.defaults.timeoutMs`),
|
|
9
|
+
* falling back to PER_TASK_DEFAULT_MS only when no config timeout is set. A goal
|
|
10
|
+
* runs all N tasks in one send, so the phase budget is N × the per-task budget.
|
|
11
|
+
*/
|
|
12
|
+
export declare function derivePhaseTimeoutMs(taskCount: number, perTaskMs?: number): number;
|
|
13
|
+
/** First non-empty line of `text`, trimmed to `max` chars (heading derivation). */
|
|
14
|
+
export declare function firstLine(text: string, max?: number): string;
|
|
15
|
+
/** Render the goal's tasks into one prompt body with PHASE + [task N] markers. */
|
|
16
|
+
export declare function renderPlanText(tasks: GoalTask[], phaseCount: number): string;
|
|
17
|
+
/** Phase-1 implement prompt over the whole plan. */
|
|
18
|
+
export declare function implementGoalPrompt(goal: Goal): string;
|
|
19
|
+
/**
|
|
20
|
+
* Phase-2 review-fix prompt. You are the COMPLETION GUARANTOR, not just a
|
|
21
|
+
* reviewer of commits. The implementer (a cheaper tier) attempted every task but
|
|
22
|
+
* may have left some incomplete, wrong, OR done-but-uncommitted. Your job is to
|
|
23
|
+
* make sure EVERY task ends up correctly implemented AND committed — walking the
|
|
24
|
+
* tasks one by one against both the commit log and the uncommitted working tree.
|
|
25
|
+
*/
|
|
26
|
+
export declare function reviewFixGoalPrompt(goal: Goal, gitLog: string, workingTree: string): string;
|
|
27
|
+
//# sourceMappingURL=goal-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goal-prompts.d.ts","sourceRoot":"","sources":["../../src/lifecycle/goal-prompts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAC3C,eAAO,MAAM,kBAAkB,QAAiC,CAAC;AACjE,eAAO,MAAM,mBAAmB,QAAa,CAAC;AAC9C,eAAO,MAAM,iBAAiB,QAAa,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlF;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,CAIxD;AAqDD,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAW5E;AA8CD,oDAAoD;AACpD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAsBtD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAiD3F"}
|