@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.
Files changed (162) hide show
  1. package/dist/events/plain-log-entry.d.ts +1 -1
  2. package/dist/events/plain-log-entry.d.ts.map +1 -1
  3. package/dist/events/plain-log-entry.js +5 -1
  4. package/dist/events/plain-log-entry.js.map +1 -1
  5. package/dist/events/wire-schema.d.ts +4 -4
  6. package/dist/lifecycle/derive-completion.d.ts +4 -0
  7. package/dist/lifecycle/derive-completion.d.ts.map +1 -1
  8. package/dist/lifecycle/derive-completion.js +14 -1
  9. package/dist/lifecycle/derive-completion.js.map +1 -1
  10. package/dist/lifecycle/git-exec.d.ts +62 -0
  11. package/dist/lifecycle/git-exec.d.ts.map +1 -0
  12. package/dist/lifecycle/git-exec.js +135 -0
  13. package/dist/lifecycle/git-exec.js.map +1 -0
  14. package/dist/lifecycle/goal-builder.d.ts +35 -0
  15. package/dist/lifecycle/goal-builder.d.ts.map +1 -0
  16. package/dist/lifecycle/goal-builder.js +56 -0
  17. package/dist/lifecycle/goal-builder.js.map +1 -0
  18. package/dist/lifecycle/goal-preconditions.d.ts +21 -0
  19. package/dist/lifecycle/goal-preconditions.d.ts.map +1 -0
  20. package/dist/lifecycle/goal-preconditions.js +33 -0
  21. package/dist/lifecycle/goal-preconditions.js.map +1 -0
  22. package/dist/lifecycle/goal-prompts.d.ts +27 -0
  23. package/dist/lifecycle/goal-prompts.d.ts.map +1 -0
  24. package/dist/lifecycle/goal-prompts.js +204 -0
  25. package/dist/lifecycle/goal-prompts.js.map +1 -0
  26. package/dist/lifecycle/goal-report.d.ts +42 -0
  27. package/dist/lifecycle/goal-report.d.ts.map +1 -0
  28. package/dist/lifecycle/goal-report.js +125 -0
  29. package/dist/lifecycle/goal-report.js.map +1 -0
  30. package/dist/lifecycle/handlers/annotate-stage.d.ts.map +1 -1
  31. package/dist/lifecycle/handlers/annotate-stage.js +27 -0
  32. package/dist/lifecycle/handlers/annotate-stage.js.map +1 -1
  33. package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts +3 -3
  34. package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts.map +1 -1
  35. package/dist/lifecycle/handlers/prepare-execution-context-handler.js +3 -25
  36. package/dist/lifecycle/handlers/prepare-execution-context-handler.js.map +1 -1
  37. package/dist/lifecycle/handlers/review-fix-stage.d.ts +9 -0
  38. package/dist/lifecycle/handlers/review-fix-stage.d.ts.map +1 -0
  39. package/dist/lifecycle/handlers/review-fix-stage.js +75 -0
  40. package/dist/lifecycle/handlers/review-fix-stage.js.map +1 -0
  41. package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
  42. package/dist/lifecycle/handlers/terminal-handlers.js +15 -3
  43. package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
  44. package/dist/lifecycle/stage-io.d.ts +0 -23
  45. package/dist/lifecycle/stage-io.d.ts.map +1 -1
  46. package/dist/lifecycle/stage-io.js +0 -11
  47. package/dist/lifecycle/stage-io.js.map +1 -1
  48. package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
  49. package/dist/lifecycle/stage-plan-builder.js +42 -49
  50. package/dist/lifecycle/stage-plan-builder.js.map +1 -1
  51. package/dist/lifecycle/stage-plan-types.d.ts +8 -8
  52. package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
  53. package/dist/lifecycle/stage-plan-types.js.map +1 -1
  54. package/dist/lifecycle/task-executor.d.ts.map +1 -1
  55. package/dist/lifecycle/task-executor.js +46 -1
  56. package/dist/lifecycle/task-executor.js.map +1 -1
  57. package/dist/lifecycle/task-runner.d.ts.map +1 -1
  58. package/dist/lifecycle/task-runner.js +3 -1
  59. package/dist/lifecycle/task-runner.js.map +1 -1
  60. package/dist/lifecycle/write-goal-lock.d.ts +29 -0
  61. package/dist/lifecycle/write-goal-lock.d.ts.map +1 -0
  62. package/dist/lifecycle/write-goal-lock.js +70 -0
  63. package/dist/lifecycle/write-goal-lock.js.map +1 -0
  64. package/dist/providers/claude-session.d.ts.map +1 -1
  65. package/dist/providers/claude-session.js +14 -0
  66. package/dist/providers/claude-session.js.map +1 -1
  67. package/dist/research/adapters/arxiv.d.ts.map +1 -1
  68. package/dist/research/adapters/arxiv.js +6 -1
  69. package/dist/research/adapters/arxiv.js.map +1 -1
  70. package/dist/tools/delegate/brief-slot.d.ts +14 -11
  71. package/dist/tools/delegate/brief-slot.d.ts.map +1 -1
  72. package/dist/tools/delegate/brief-slot.js +29 -53
  73. package/dist/tools/delegate/brief-slot.js.map +1 -1
  74. package/dist/tools/delegate/schema.d.ts +0 -4
  75. package/dist/tools/delegate/schema.d.ts.map +1 -1
  76. package/dist/tools/delegate/schema.js +3 -2
  77. package/dist/tools/delegate/schema.js.map +1 -1
  78. package/dist/tools/delegate/tool-config.d.ts.map +1 -1
  79. package/dist/tools/delegate/tool-config.js +20 -17
  80. package/dist/tools/delegate/tool-config.js.map +1 -1
  81. package/dist/tools/execute-plan/brief-slot.d.ts +11 -5
  82. package/dist/tools/execute-plan/brief-slot.d.ts.map +1 -1
  83. package/dist/tools/execute-plan/brief-slot.js +57 -13
  84. package/dist/tools/execute-plan/brief-slot.js.map +1 -1
  85. package/dist/tools/execute-plan/tool-config.d.ts.map +1 -1
  86. package/dist/tools/execute-plan/tool-config.js +18 -67
  87. package/dist/tools/execute-plan/tool-config.js.map +1 -1
  88. package/dist/tools/journal/record/brief-slot.d.ts +9 -6
  89. package/dist/tools/journal/record/brief-slot.d.ts.map +1 -1
  90. package/dist/tools/journal/record/brief-slot.js +18 -14
  91. package/dist/tools/journal/record/brief-slot.js.map +1 -1
  92. package/dist/tools/journal/record/tool-config.d.ts.map +1 -1
  93. package/dist/tools/journal/record/tool-config.js +18 -11
  94. package/dist/tools/journal/record/tool-config.js.map +1 -1
  95. package/dist/tools/retry/brief-slot.d.ts +1 -1
  96. package/dist/tools/retry/brief-slot.d.ts.map +1 -1
  97. package/dist/tools/retry/brief-slot.js +2 -1
  98. package/dist/tools/retry/brief-slot.js.map +1 -1
  99. package/dist/tools/retry/schema.d.ts +0 -1
  100. package/dist/tools/retry/schema.d.ts.map +1 -1
  101. package/dist/tools/retry/schema.js +6 -6
  102. package/dist/tools/retry/schema.js.map +1 -1
  103. package/dist/tools/retry/tool-config.d.ts.map +1 -1
  104. package/dist/tools/retry/tool-config.js +23 -28
  105. package/dist/tools/retry/tool-config.js.map +1 -1
  106. package/dist/types/goal.d.ts +47 -0
  107. package/dist/types/goal.d.ts.map +1 -0
  108. package/dist/types/goal.js +2 -0
  109. package/dist/types/goal.js.map +1 -0
  110. package/dist/types/task-spec.d.ts +11 -0
  111. package/dist/types/task-spec.d.ts.map +1 -1
  112. package/dist/types.d.ts +1 -0
  113. package/dist/types.d.ts.map +1 -1
  114. package/package.json +1 -1
  115. package/dist/lifecycle/diff-tracker.d.ts +0 -88
  116. package/dist/lifecycle/diff-tracker.d.ts.map +0 -1
  117. package/dist/lifecycle/diff-tracker.js +0 -429
  118. package/dist/lifecycle/diff-tracker.js.map +0 -1
  119. package/dist/lifecycle/handlers/compose-commit-message.d.ts +0 -15
  120. package/dist/lifecycle/handlers/compose-commit-message.d.ts.map +0 -1
  121. package/dist/lifecycle/handlers/compose-commit-message.js +0 -227
  122. package/dist/lifecycle/handlers/compose-commit-message.js.map +0 -1
  123. package/dist/lifecycle/handlers/git-commit-handler.d.ts +0 -4
  124. package/dist/lifecycle/handlers/git-commit-handler.d.ts.map +0 -1
  125. package/dist/lifecycle/handlers/git-commit-handler.js +0 -202
  126. package/dist/lifecycle/handlers/git-commit-handler.js.map +0 -1
  127. package/dist/lifecycle/handlers/journal-review-prompt.d.ts +0 -7
  128. package/dist/lifecycle/handlers/journal-review-prompt.d.ts.map +0 -1
  129. package/dist/lifecycle/handlers/journal-review-prompt.js +0 -54
  130. package/dist/lifecycle/handlers/journal-review-prompt.js.map +0 -1
  131. package/dist/lifecycle/handlers/parse-review-report.d.ts +0 -15
  132. package/dist/lifecycle/handlers/parse-review-report.d.ts.map +0 -1
  133. package/dist/lifecycle/handlers/parse-review-report.js +0 -40
  134. package/dist/lifecycle/handlers/parse-review-report.js.map +0 -1
  135. package/dist/lifecycle/handlers/quality-review-prompt.d.ts +0 -7
  136. package/dist/lifecycle/handlers/quality-review-prompt.d.ts.map +0 -1
  137. package/dist/lifecycle/handlers/quality-review-prompt.js +0 -50
  138. package/dist/lifecycle/handlers/quality-review-prompt.js.map +0 -1
  139. package/dist/lifecycle/handlers/review-stage.d.ts +0 -4
  140. package/dist/lifecycle/handlers/review-stage.d.ts.map +0 -1
  141. package/dist/lifecycle/handlers/review-stage.js +0 -277
  142. package/dist/lifecycle/handlers/review-stage.js.map +0 -1
  143. package/dist/lifecycle/handlers/rework-prompt.d.ts +0 -6
  144. package/dist/lifecycle/handlers/rework-prompt.d.ts.map +0 -1
  145. package/dist/lifecycle/handlers/rework-prompt.js +0 -18
  146. package/dist/lifecycle/handlers/rework-prompt.js.map +0 -1
  147. package/dist/lifecycle/handlers/rework-stage.d.ts +0 -4
  148. package/dist/lifecycle/handlers/rework-stage.d.ts.map +0 -1
  149. package/dist/lifecycle/handlers/rework-stage.js +0 -191
  150. package/dist/lifecycle/handlers/rework-stage.js.map +0 -1
  151. package/dist/lifecycle/handlers/spec-review-prompt.d.ts +0 -8
  152. package/dist/lifecycle/handlers/spec-review-prompt.d.ts.map +0 -1
  153. package/dist/lifecycle/handlers/spec-review-prompt.js +0 -47
  154. package/dist/lifecycle/handlers/spec-review-prompt.js.map +0 -1
  155. package/dist/lifecycle/handlers/tier-policy.d.ts +0 -11
  156. package/dist/lifecycle/handlers/tier-policy.d.ts.map +0 -1
  157. package/dist/lifecycle/handlers/tier-policy.js +0 -12
  158. package/dist/lifecycle/handlers/tier-policy.js.map +0 -1
  159. package/dist/lifecycle/repo-commit-lock.d.ts +0 -20
  160. package/dist/lifecycle/repo-commit-lock.d.ts.map +0 -1
  161. package/dist/lifecycle/repo-commit-lock.js +0 -40
  162. 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,+dAQvB,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"}
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 (7)
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;CACzC;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,CA8B3E;AAMD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,CAwB/E"}
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
- // 3. Write routes: review + commit must pass
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":"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"}
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"}