agentix-cli 0.140.0 → 0.141.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 (127) hide show
  1. package/dist/{App-RJRJLBCF.js → App-A6YSBIEL.js} +2 -2
  2. package/dist/{ChatApp-YTGLBN47.js → ChatApp-Q7UHDR5P.js} +2 -2
  3. package/dist/{absorb-eval-DZ6SCGT7.js → absorb-eval-WTKVCJXT.js} +2 -2
  4. package/dist/{agent-G32GSRUE.js → agent-DHCLFYIQ.js} +2 -2
  5. package/dist/{board-dashboard-HOZVSYMJ.js → board-dashboard-6K34ZQB5.js} +4 -4
  6. package/dist/{chunk-EBYG3NS3.js → chunk-27UKZZTZ.js} +2 -2
  7. package/dist/{chunk-GPDVETDE.js → chunk-6DZSDM35.js} +2 -2
  8. package/dist/{chunk-FUGDD6UW.js → chunk-6MARQ33D.js} +2 -2
  9. package/dist/chunk-CELYB3UW.js +174 -0
  10. package/dist/chunk-CELYB3UW.js.map +1 -0
  11. package/dist/{chunk-4ZKXEUQP.js → chunk-COWWOA7H.js} +2 -2
  12. package/dist/{chunk-IOT5REOO.js → chunk-CV7ISZKU.js} +2 -2
  13. package/dist/{chunk-BGKIKZMZ.js → chunk-HPGMY6YB.js} +2 -2
  14. package/dist/chunk-HW5FTKTU.js +54 -0
  15. package/dist/{chunk-TF5356HW.js.map → chunk-HW5FTKTU.js.map} +1 -1
  16. package/dist/{chunk-2JQSWX7U.js → chunk-HYOXWAQP.js} +3 -3
  17. package/dist/chunk-HYOXWAQP.js.map +1 -0
  18. package/dist/{chunk-O6KRXVN7.js → chunk-I6P3BKWJ.js} +2 -2
  19. package/dist/{chunk-ZKNSNSV2.js → chunk-JLM6CXIH.js} +2 -2
  20. package/dist/{chunk-HYVRS3G3.js → chunk-L7OTWV5X.js} +282 -272
  21. package/dist/chunk-L7OTWV5X.js.map +1 -0
  22. package/dist/{chunk-2NTRAVHC.js → chunk-LYSCMFAM.js} +2 -2
  23. package/dist/{chunk-PILE2SH3.js → chunk-MSRFTAWH.js} +2 -2
  24. package/dist/{chunk-EVQQZNZY.js → chunk-MT5QTEUL.js} +2 -2
  25. package/dist/{chunk-P5G6EYBL.js → chunk-MWB33O72.js} +2 -2
  26. package/dist/{chunk-C5ABUPRU.js → chunk-NJHNV4QP.js} +2 -2
  27. package/dist/{chunk-YVRQ7KWB.js → chunk-OG44FK7T.js} +2 -2
  28. package/dist/{chunk-GG6K5ZL6.js → chunk-OW2AND54.js} +2 -2
  29. package/dist/{chunk-OCTWRSOI.js → chunk-S5DS2V3X.js} +2 -2
  30. package/dist/{chunk-PPT2MXQY.js → chunk-T7LDVJMP.js} +3 -3
  31. package/dist/{chunk-Z46SZWMO.js → chunk-UJRJUSDY.js} +2 -2
  32. package/dist/{chunk-E47LEY5I.js → chunk-UVJUURNO.js} +2 -2
  33. package/dist/{chunk-QHXKELKQ.js → chunk-VJC372D6.js} +2 -2
  34. package/dist/{chunk-U72JN4YF.js → chunk-W4JLZJHU.js} +2 -2
  35. package/dist/{chunk-QSQWVQLD.js → chunk-YDPXS6T4.js} +2 -2
  36. package/dist/cli.js +1 -1
  37. package/dist/{client-B275LQZY.js → client-T5BDAOBA.js} +2 -2
  38. package/dist/config-PCTNYBE3.js +2 -0
  39. package/dist/{config-mutate-BYRF4RJT.js → config-mutate-2WZOX6Y6.js} +2 -2
  40. package/dist/config-mutator-M65NF7SF.js +2 -0
  41. package/dist/{contributions-SQVBSENQ.js → contributions-HVCHGNPO.js} +2 -2
  42. package/dist/{doctor-L6XMYZPY.js → doctor-NHEMFVQG.js} +2 -2
  43. package/dist/{follow-up-tool-C72BXO4B.js → follow-up-tool-7ENUC5TI.js} +2 -2
  44. package/dist/{hub-5OSJMIOO.js → hub-KTS6KFMG.js} +2 -2
  45. package/dist/index.d.ts +317 -0
  46. package/dist/index.js +1 -1
  47. package/dist/{program-QJKOF3OJ.js → program-QQ6N3PVM.js} +241 -236
  48. package/dist/program-QQ6N3PVM.js.map +1 -0
  49. package/dist/{promote-C65WVH5K.js → promote-CGF5G6PE.js} +2 -2
  50. package/dist/{query-3LO5OP6O.js → query-AJVLRTTT.js} +2 -2
  51. package/dist/{query-settings-TWT6XZNV.js → query-settings-GF3CRGHA.js} +2 -2
  52. package/dist/registry-HYQ3N4B6.js +2 -0
  53. package/dist/{request-planner-D6XVDOJN.js → request-planner-4KQSVQHO.js} +2 -2
  54. package/dist/{review-candidates-6BQ25RIY.js → review-candidates-KC3AJDAL.js} +2 -2
  55. package/dist/{routing-KBNYAPTC.js → routing-5VGAZXNZ.js} +2 -2
  56. package/dist/schedule-tool-XETP3D45.js +2 -0
  57. package/dist/{scheduler-R6N7FT27.js → scheduler-UZNAC46U.js} +2 -2
  58. package/dist/{seat-5AF4CN52.js → seat-BTSSQDZX.js} +2 -2
  59. package/dist/{select-TJZXA74W.js → select-MYLQ3QGJ.js} +2 -2
  60. package/dist/{set-enabled-RQPZBVZP.js → set-enabled-QJ4GM624.js} +2 -2
  61. package/dist/{tool-2RJYOQE7.js → tool-HTPNTSCA.js} +2 -2
  62. package/dist/{tool-C7Z56DOT.js → tool-HZHMB5Q3.js} +2 -2
  63. package/dist/{wiki-3DX53GJ4.js → wiki-ZWFSQ5SL.js} +2 -2
  64. package/dist/wiki-enrich-HQCWHX6Z.js +2 -0
  65. package/package.json +1 -1
  66. package/dist/chunk-2JQSWX7U.js.map +0 -1
  67. package/dist/chunk-GQOMV52Y.js +0 -160
  68. package/dist/chunk-GQOMV52Y.js.map +0 -1
  69. package/dist/chunk-HYVRS3G3.js.map +0 -1
  70. package/dist/chunk-TF5356HW.js +0 -54
  71. package/dist/config-PYDMLFAM.js +0 -2
  72. package/dist/config-mutator-LZSY6S4H.js +0 -2
  73. package/dist/program-QJKOF3OJ.js.map +0 -1
  74. package/dist/registry-YI7NLDAL.js +0 -2
  75. package/dist/schedule-tool-GDUREPVN.js +0 -2
  76. package/dist/wiki-enrich-KQNC45FM.js +0 -2
  77. /package/dist/{App-RJRJLBCF.js.map → App-A6YSBIEL.js.map} +0 -0
  78. /package/dist/{ChatApp-YTGLBN47.js.map → ChatApp-Q7UHDR5P.js.map} +0 -0
  79. /package/dist/{absorb-eval-DZ6SCGT7.js.map → absorb-eval-WTKVCJXT.js.map} +0 -0
  80. /package/dist/{agent-G32GSRUE.js.map → agent-DHCLFYIQ.js.map} +0 -0
  81. /package/dist/{board-dashboard-HOZVSYMJ.js.map → board-dashboard-6K34ZQB5.js.map} +0 -0
  82. /package/dist/{chunk-EBYG3NS3.js.map → chunk-27UKZZTZ.js.map} +0 -0
  83. /package/dist/{chunk-GPDVETDE.js.map → chunk-6DZSDM35.js.map} +0 -0
  84. /package/dist/{chunk-FUGDD6UW.js.map → chunk-6MARQ33D.js.map} +0 -0
  85. /package/dist/{chunk-4ZKXEUQP.js.map → chunk-COWWOA7H.js.map} +0 -0
  86. /package/dist/{chunk-IOT5REOO.js.map → chunk-CV7ISZKU.js.map} +0 -0
  87. /package/dist/{chunk-BGKIKZMZ.js.map → chunk-HPGMY6YB.js.map} +0 -0
  88. /package/dist/{chunk-O6KRXVN7.js.map → chunk-I6P3BKWJ.js.map} +0 -0
  89. /package/dist/{chunk-ZKNSNSV2.js.map → chunk-JLM6CXIH.js.map} +0 -0
  90. /package/dist/{chunk-2NTRAVHC.js.map → chunk-LYSCMFAM.js.map} +0 -0
  91. /package/dist/{chunk-PILE2SH3.js.map → chunk-MSRFTAWH.js.map} +0 -0
  92. /package/dist/{chunk-EVQQZNZY.js.map → chunk-MT5QTEUL.js.map} +0 -0
  93. /package/dist/{chunk-P5G6EYBL.js.map → chunk-MWB33O72.js.map} +0 -0
  94. /package/dist/{chunk-C5ABUPRU.js.map → chunk-NJHNV4QP.js.map} +0 -0
  95. /package/dist/{chunk-YVRQ7KWB.js.map → chunk-OG44FK7T.js.map} +0 -0
  96. /package/dist/{chunk-GG6K5ZL6.js.map → chunk-OW2AND54.js.map} +0 -0
  97. /package/dist/{chunk-OCTWRSOI.js.map → chunk-S5DS2V3X.js.map} +0 -0
  98. /package/dist/{chunk-PPT2MXQY.js.map → chunk-T7LDVJMP.js.map} +0 -0
  99. /package/dist/{chunk-Z46SZWMO.js.map → chunk-UJRJUSDY.js.map} +0 -0
  100. /package/dist/{chunk-E47LEY5I.js.map → chunk-UVJUURNO.js.map} +0 -0
  101. /package/dist/{chunk-QHXKELKQ.js.map → chunk-VJC372D6.js.map} +0 -0
  102. /package/dist/{chunk-U72JN4YF.js.map → chunk-W4JLZJHU.js.map} +0 -0
  103. /package/dist/{chunk-QSQWVQLD.js.map → chunk-YDPXS6T4.js.map} +0 -0
  104. /package/dist/{client-B275LQZY.js.map → client-T5BDAOBA.js.map} +0 -0
  105. /package/dist/{config-PYDMLFAM.js.map → config-PCTNYBE3.js.map} +0 -0
  106. /package/dist/{config-mutate-BYRF4RJT.js.map → config-mutate-2WZOX6Y6.js.map} +0 -0
  107. /package/dist/{config-mutator-LZSY6S4H.js.map → config-mutator-M65NF7SF.js.map} +0 -0
  108. /package/dist/{contributions-SQVBSENQ.js.map → contributions-HVCHGNPO.js.map} +0 -0
  109. /package/dist/{doctor-L6XMYZPY.js.map → doctor-NHEMFVQG.js.map} +0 -0
  110. /package/dist/{follow-up-tool-C72BXO4B.js.map → follow-up-tool-7ENUC5TI.js.map} +0 -0
  111. /package/dist/{hub-5OSJMIOO.js.map → hub-KTS6KFMG.js.map} +0 -0
  112. /package/dist/{promote-C65WVH5K.js.map → promote-CGF5G6PE.js.map} +0 -0
  113. /package/dist/{query-3LO5OP6O.js.map → query-AJVLRTTT.js.map} +0 -0
  114. /package/dist/{query-settings-TWT6XZNV.js.map → query-settings-GF3CRGHA.js.map} +0 -0
  115. /package/dist/{registry-YI7NLDAL.js.map → registry-HYQ3N4B6.js.map} +0 -0
  116. /package/dist/{request-planner-D6XVDOJN.js.map → request-planner-4KQSVQHO.js.map} +0 -0
  117. /package/dist/{review-candidates-6BQ25RIY.js.map → review-candidates-KC3AJDAL.js.map} +0 -0
  118. /package/dist/{routing-KBNYAPTC.js.map → routing-5VGAZXNZ.js.map} +0 -0
  119. /package/dist/{schedule-tool-GDUREPVN.js.map → schedule-tool-XETP3D45.js.map} +0 -0
  120. /package/dist/{scheduler-R6N7FT27.js.map → scheduler-UZNAC46U.js.map} +0 -0
  121. /package/dist/{seat-5AF4CN52.js.map → seat-BTSSQDZX.js.map} +0 -0
  122. /package/dist/{select-TJZXA74W.js.map → select-MYLQ3QGJ.js.map} +0 -0
  123. /package/dist/{set-enabled-RQPZBVZP.js.map → set-enabled-QJ4GM624.js.map} +0 -0
  124. /package/dist/{tool-2RJYOQE7.js.map → tool-HTPNTSCA.js.map} +0 -0
  125. /package/dist/{tool-C7Z56DOT.js.map → tool-HZHMB5Q3.js.map} +0 -0
  126. /package/dist/{wiki-3DX53GJ4.js.map → wiki-ZWFSQ5SL.js.map} +0 -0
  127. /package/dist/{wiki-enrich-KQNC45FM.js.map → wiki-enrich-HQCWHX6Z.js.map} +0 -0
@@ -1,2 +1,2 @@
1
- import{a}from"./chunk-U72JN4YF.js";import"./chunk-4ZKXEUQP.js";import"./chunk-OWNQ2FD4.js";import"./chunk-KEXBEUSU.js";import"./chunk-ROLSSYXE.js";import"./chunk-Z46SZWMO.js";import"./chunk-WPNRDEHW.js";import"./chunk-PILE2SH3.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-QOYAX2FT.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-TF5356HW.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{a as WikiHub};
2
- //# sourceMappingURL=hub-5OSJMIOO.js.map
1
+ import{a}from"./chunk-W4JLZJHU.js";import"./chunk-COWWOA7H.js";import"./chunk-OWNQ2FD4.js";import"./chunk-KEXBEUSU.js";import"./chunk-ROLSSYXE.js";import"./chunk-UJRJUSDY.js";import"./chunk-WPNRDEHW.js";import"./chunk-MSRFTAWH.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-QOYAX2FT.js";import"./chunk-2PJKGZWP.js";import"./chunk-7I7IEX4S.js";import"./chunk-HW5FTKTU.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";export{a as WikiHub};
2
+ //# sourceMappingURL=hub-KTS6KFMG.js.map
package/dist/index.d.ts CHANGED
@@ -5565,6 +5565,227 @@ declare const daemonConfigSchema: z.ZodObject<{
5565
5565
  composeTimeoutSeconds?: number | undefined;
5566
5566
  } | undefined;
5567
5567
  }>>;
5568
+ /** Quality gates for agent-written changes (#987). Each is off by default. */
5569
+ quality: z.ZodDefault<z.ZodObject<{
5570
+ /** Spec-first tests (#992): for an issue that names a pilot path and
5571
+ * goes to a Claude cloud session, a separate test agent writes tests
5572
+ * from the issue text only and pushes them to `spec-tests/issue-N` for
5573
+ * the coding session to merge. See src/agents/spec-tests.ts. */
5574
+ specTests: z.ZodDefault<z.ZodObject<{
5575
+ enabled: z.ZodDefault<z.ZodBoolean>;
5576
+ /** Path prefixes; an issue that names one of them is in the pilot. */
5577
+ paths: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
5578
+ /** The test agent's name: the spec-test commit's author. Must not be
5579
+ * the coding agent's id. */
5580
+ agent: z.ZodDefault<z.ZodString>;
5581
+ /** Model for the test agent. Unset: the `claude` CLI default. */
5582
+ model: z.ZodOptional<z.ZodString>;
5583
+ /** USD cap for one issue's test agent run; it stops when spent. */
5584
+ maxCostPerIssue: z.ZodDefault<z.ZodNumber>;
5585
+ /** Minutes cap for one issue's test agent run. */
5586
+ maxMinutes: z.ZodDefault<z.ZodNumber>;
5587
+ }, "strip", z.ZodTypeAny, {
5588
+ enabled: boolean;
5589
+ agent: string;
5590
+ paths: string[];
5591
+ maxMinutes: number;
5592
+ maxCostPerIssue: number;
5593
+ model?: string | undefined;
5594
+ }, {
5595
+ model?: string | undefined;
5596
+ enabled?: boolean | undefined;
5597
+ agent?: string | undefined;
5598
+ paths?: string[] | undefined;
5599
+ maxMinutes?: number | undefined;
5600
+ maxCostPerIssue?: number | undefined;
5601
+ }>>;
5602
+ /** Canary soak (#993): `agentx daemon deploy` only ships a commit that
5603
+ * has run on this (local) daemon for soakMinutes without new trouble.
5604
+ * Judged from the boot log and task history (src/daemon/canary-soak). */
5605
+ canary: z.ZodDefault<z.ZodObject<{
5606
+ /** Deploy reads only this key from the raw file (no .env, no
5607
+ * validation), so only a literal `true` turns the gate on. */
5608
+ enabled: z.ZodDefault<z.ZodBoolean>;
5609
+ soakMinutes: z.ZodDefault<z.ZodNumber>;
5610
+ thresholds: z.ZodDefault<z.ZodObject<{
5611
+ /** Clean restarts allowed during the soak (not counting the one
5612
+ * that started it). */
5613
+ maxRestarts: z.ZodDefault<z.ZodNumber>;
5614
+ /** Unclean stops (crash, kill) allowed during the soak. */
5615
+ maxCrashes: z.ZodDefault<z.ZodNumber>;
5616
+ /** Failed or timed-out tasks allowed during the soak (stopped ones
5617
+ * do not count). */
5618
+ maxFailedTasks: z.ZodDefault<z.ZodNumber>;
5619
+ /** Largest rise in the share of failed tasks vs the previous
5620
+ * release, as a fraction (0.1 = 10 percentage points). */
5621
+ maxErrorRateIncrease: z.ZodDefault<z.ZodNumber>;
5622
+ /** Fewer tasks than this during the soak skips the rate check. */
5623
+ minTasksForRate: z.ZodDefault<z.ZodNumber>;
5624
+ }, "strip", z.ZodTypeAny, {
5625
+ maxRestarts: number;
5626
+ maxCrashes: number;
5627
+ maxFailedTasks: number;
5628
+ maxErrorRateIncrease: number;
5629
+ minTasksForRate: number;
5630
+ }, {
5631
+ maxRestarts?: number | undefined;
5632
+ maxCrashes?: number | undefined;
5633
+ maxFailedTasks?: number | undefined;
5634
+ maxErrorRateIncrease?: number | undefined;
5635
+ minTasksForRate?: number | undefined;
5636
+ }>>;
5637
+ }, "strip", z.ZodTypeAny, {
5638
+ enabled: boolean;
5639
+ soakMinutes: number;
5640
+ thresholds: {
5641
+ maxRestarts: number;
5642
+ maxCrashes: number;
5643
+ maxFailedTasks: number;
5644
+ maxErrorRateIncrease: number;
5645
+ minTasksForRate: number;
5646
+ };
5647
+ }, {
5648
+ enabled?: boolean | undefined;
5649
+ soakMinutes?: number | undefined;
5650
+ thresholds?: {
5651
+ maxRestarts?: number | undefined;
5652
+ maxCrashes?: number | undefined;
5653
+ maxFailedTasks?: number | undefined;
5654
+ maxErrorRateIncrease?: number | undefined;
5655
+ minTasksForRate?: number | undefined;
5656
+ } | undefined;
5657
+ }>>;
5658
+ /** Pre-merge review gate (#990): a different agent, in a fresh
5659
+ * session, checks an agent's pull request against its linked issue
5660
+ * and posts the commit status `agentx/review` on the head commit. */
5661
+ reviewGate: z.ZodDefault<z.ZodObject<{
5662
+ enabled: z.ZodDefault<z.ZodBoolean>;
5663
+ mode: z.ZodDefault<z.ZodEnum<["advisory", "required"]>>;
5664
+ reviewer: z.ZodDefault<z.ZodObject<{
5665
+ /** The agent that reviews. Must not be the agent that wrote the PR. */
5666
+ agent: z.ZodOptional<z.ZodString>;
5667
+ /** Model for the review. Unset: the reviewer agent's own model. Pick
5668
+ * one that differs from the author agent's model when you can. */
5669
+ model: z.ZodOptional<z.ZodString>;
5670
+ }, "strip", z.ZodTypeAny, {
5671
+ model?: string | undefined;
5672
+ agent?: string | undefined;
5673
+ }, {
5674
+ model?: string | undefined;
5675
+ agent?: string | undefined;
5676
+ }>>;
5677
+ /** Only PRs that change a file matching one of these globs are
5678
+ * reviewed (`*` within a folder, `**` across folders). Empty: all. */
5679
+ paths: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
5680
+ /** Review cost above this many US dollars ends as `error`. 0: no limit. */
5681
+ maxCostPerReview: z.ZodDefault<z.ZodNumber>;
5682
+ /** Review time above this many minutes ends as `error`. */
5683
+ maxMinutes: z.ZodDefault<z.ZodNumber>;
5684
+ /** Most reviewer runs one PR gets in 24 hours. Each failure comment can
5685
+ * bring a fix push and each push a review; past the limit the status
5686
+ * is `error` and a person takes over. 0: no limit. */
5687
+ maxReviewsPerPrPerDay: z.ZodDefault<z.ZodNumber>;
5688
+ /** How long to wait for other CI checks to finish before reviewing. */
5689
+ ciWaitMinutes: z.ZodDefault<z.ZodNumber>;
5690
+ /** Diffs longer than this many kilobytes are cut, and the reviewer is
5691
+ * told the diff is incomplete. */
5692
+ maxDiffKb: z.ZodDefault<z.ZodNumber>;
5693
+ }, "strip", z.ZodTypeAny, {
5694
+ enabled: boolean;
5695
+ mode: "required" | "advisory";
5696
+ reviewer: {
5697
+ model?: string | undefined;
5698
+ agent?: string | undefined;
5699
+ };
5700
+ paths: string[];
5701
+ maxCostPerReview: number;
5702
+ maxMinutes: number;
5703
+ maxReviewsPerPrPerDay: number;
5704
+ ciWaitMinutes: number;
5705
+ maxDiffKb: number;
5706
+ }, {
5707
+ enabled?: boolean | undefined;
5708
+ mode?: "required" | "advisory" | undefined;
5709
+ reviewer?: {
5710
+ model?: string | undefined;
5711
+ agent?: string | undefined;
5712
+ } | undefined;
5713
+ paths?: string[] | undefined;
5714
+ maxCostPerReview?: number | undefined;
5715
+ maxMinutes?: number | undefined;
5716
+ maxReviewsPerPrPerDay?: number | undefined;
5717
+ ciWaitMinutes?: number | undefined;
5718
+ maxDiffKb?: number | undefined;
5719
+ }>>;
5720
+ }, "strip", z.ZodTypeAny, {
5721
+ specTests: {
5722
+ enabled: boolean;
5723
+ agent: string;
5724
+ paths: string[];
5725
+ maxMinutes: number;
5726
+ maxCostPerIssue: number;
5727
+ model?: string | undefined;
5728
+ };
5729
+ canary: {
5730
+ enabled: boolean;
5731
+ soakMinutes: number;
5732
+ thresholds: {
5733
+ maxRestarts: number;
5734
+ maxCrashes: number;
5735
+ maxFailedTasks: number;
5736
+ maxErrorRateIncrease: number;
5737
+ minTasksForRate: number;
5738
+ };
5739
+ };
5740
+ reviewGate: {
5741
+ enabled: boolean;
5742
+ mode: "required" | "advisory";
5743
+ reviewer: {
5744
+ model?: string | undefined;
5745
+ agent?: string | undefined;
5746
+ };
5747
+ paths: string[];
5748
+ maxCostPerReview: number;
5749
+ maxMinutes: number;
5750
+ maxReviewsPerPrPerDay: number;
5751
+ ciWaitMinutes: number;
5752
+ maxDiffKb: number;
5753
+ };
5754
+ }, {
5755
+ specTests?: {
5756
+ model?: string | undefined;
5757
+ enabled?: boolean | undefined;
5758
+ agent?: string | undefined;
5759
+ paths?: string[] | undefined;
5760
+ maxMinutes?: number | undefined;
5761
+ maxCostPerIssue?: number | undefined;
5762
+ } | undefined;
5763
+ canary?: {
5764
+ enabled?: boolean | undefined;
5765
+ soakMinutes?: number | undefined;
5766
+ thresholds?: {
5767
+ maxRestarts?: number | undefined;
5768
+ maxCrashes?: number | undefined;
5769
+ maxFailedTasks?: number | undefined;
5770
+ maxErrorRateIncrease?: number | undefined;
5771
+ minTasksForRate?: number | undefined;
5772
+ } | undefined;
5773
+ } | undefined;
5774
+ reviewGate?: {
5775
+ enabled?: boolean | undefined;
5776
+ mode?: "required" | "advisory" | undefined;
5777
+ reviewer?: {
5778
+ model?: string | undefined;
5779
+ agent?: string | undefined;
5780
+ } | undefined;
5781
+ paths?: string[] | undefined;
5782
+ maxCostPerReview?: number | undefined;
5783
+ maxMinutes?: number | undefined;
5784
+ maxReviewsPerPrPerDay?: number | undefined;
5785
+ ciWaitMinutes?: number | undefined;
5786
+ maxDiffKb?: number | undefined;
5787
+ } | undefined;
5788
+ }>>;
5568
5789
  /** How a daemon stop treats runs still in flight. */
5569
5790
  shutdown: z.ZodDefault<z.ZodObject<{
5570
5791
  /** Wait this long for runs to finish before cutting them off (they are
@@ -8848,6 +9069,41 @@ declare const daemonConfigSchema: z.ZodObject<{
8848
9069
  };
8849
9070
  forwardTo?: string | undefined;
8850
9071
  };
9072
+ quality: {
9073
+ specTests: {
9074
+ enabled: boolean;
9075
+ agent: string;
9076
+ paths: string[];
9077
+ maxMinutes: number;
9078
+ maxCostPerIssue: number;
9079
+ model?: string | undefined;
9080
+ };
9081
+ canary: {
9082
+ enabled: boolean;
9083
+ soakMinutes: number;
9084
+ thresholds: {
9085
+ maxRestarts: number;
9086
+ maxCrashes: number;
9087
+ maxFailedTasks: number;
9088
+ maxErrorRateIncrease: number;
9089
+ minTasksForRate: number;
9090
+ };
9091
+ };
9092
+ reviewGate: {
9093
+ enabled: boolean;
9094
+ mode: "required" | "advisory";
9095
+ reviewer: {
9096
+ model?: string | undefined;
9097
+ agent?: string | undefined;
9098
+ };
9099
+ paths: string[];
9100
+ maxCostPerReview: number;
9101
+ maxMinutes: number;
9102
+ maxReviewsPerPrPerDay: number;
9103
+ ciWaitMinutes: number;
9104
+ maxDiffKb: number;
9105
+ };
9106
+ };
8851
9107
  shutdown: {
8852
9108
  restart: {
8853
9109
  windowWaitMinutes: number;
@@ -9902,6 +10158,41 @@ declare const daemonConfigSchema: z.ZodObject<{
9902
10158
  composeTimeoutSeconds?: number | undefined;
9903
10159
  } | undefined;
9904
10160
  } | undefined;
10161
+ quality?: {
10162
+ specTests?: {
10163
+ model?: string | undefined;
10164
+ enabled?: boolean | undefined;
10165
+ agent?: string | undefined;
10166
+ paths?: string[] | undefined;
10167
+ maxMinutes?: number | undefined;
10168
+ maxCostPerIssue?: number | undefined;
10169
+ } | undefined;
10170
+ canary?: {
10171
+ enabled?: boolean | undefined;
10172
+ soakMinutes?: number | undefined;
10173
+ thresholds?: {
10174
+ maxRestarts?: number | undefined;
10175
+ maxCrashes?: number | undefined;
10176
+ maxFailedTasks?: number | undefined;
10177
+ maxErrorRateIncrease?: number | undefined;
10178
+ minTasksForRate?: number | undefined;
10179
+ } | undefined;
10180
+ } | undefined;
10181
+ reviewGate?: {
10182
+ enabled?: boolean | undefined;
10183
+ mode?: "required" | "advisory" | undefined;
10184
+ reviewer?: {
10185
+ model?: string | undefined;
10186
+ agent?: string | undefined;
10187
+ } | undefined;
10188
+ paths?: string[] | undefined;
10189
+ maxCostPerReview?: number | undefined;
10190
+ maxMinutes?: number | undefined;
10191
+ maxReviewsPerPrPerDay?: number | undefined;
10192
+ ciWaitMinutes?: number | undefined;
10193
+ maxDiffKb?: number | undefined;
10194
+ } | undefined;
10195
+ } | undefined;
9905
10196
  shutdown?: {
9906
10197
  restart?: {
9907
10198
  allowBy?: string | undefined;
@@ -10862,6 +11153,10 @@ declare class AgentXDaemon {
10862
11153
  private taskRunPrune?;
10863
11154
  private webhooks;
10864
11155
  private github?;
11156
+ /** Pre-merge review gate (#990). Built with the GitHub channel; does
11157
+ * nothing while quality.reviewGate.enabled is false. */
11158
+ private reviewGate?;
11159
+ private reviewLedger;
10865
11160
  private webrtc?;
10866
11161
  private botManager?;
10867
11162
  /** Agents watching the phone camera (#325); needs channels.webrtc. */
@@ -10920,6 +11215,10 @@ declare class AgentXDaemon {
10920
11215
  constructor(configPath?: string);
10921
11216
  start(): Promise<void>;
10922
11217
  stop(): Promise<void>;
11218
+ /** The review gate (#990): the reviewer runs as its own agent in a fresh
11219
+ * session keyed by the reviewed commit, so it never resumes the
11220
+ * author's conversation or an earlier review. */
11221
+ private buildReviewGate;
10923
11222
  /** Deliver a notice to the owner through the channel router: the
10924
11223
  * address it was given, else notifications.channel (push or ntfy). */
10925
11224
  private ownerSender;
@@ -11756,6 +12055,13 @@ interface AgentTask {
11756
12055
  * that pattern without requiring callers to invent unique
11757
12056
  * chatIds. */
11758
12057
  freshSession?: boolean;
12058
+ /** A run that must see only its own message (the review gate, #990).
12059
+ * The registry pushes nothing from the agent's other chats, its memory,
12060
+ * wiki, patterns or landscape; a claude-code run starts with no MCP
12061
+ * server, no built-in tool and Claude Code's auto-memory off; and the
12062
+ * run is held at autonomy `report`, so a tier or peer that cannot
12063
+ * enforce that refuses it instead of running it with its usual tools. */
12064
+ isolated?: boolean;
11759
12065
  /** Transcript held by a client that owns the conversation (OpenCode).
11760
12066
  * Seeds an empty AgentX session the same way a channel adapter's
11761
12067
  * seedHistory does, so a new or rotated session starts with it. */
@@ -15136,6 +15442,8 @@ declare class AgentRegistry {
15136
15442
  /** Claude cloud sessions this node launched (#622), by issue. Created on
15137
15443
  * first use so a fleet with the setting off never touches the file. */
15138
15444
  private cloudSessions?;
15445
+ /** Spec-test runs (#992), one per issue. Created on first use. */
15446
+ private specTests?;
15139
15447
  /** The context each running task was started with, by RunningTask id.
15140
15448
  * Kept apart from RunningTask because /agents serialises that, and a
15141
15449
  * context can carry a whole conversation history. Read by A2A
@@ -15273,6 +15581,15 @@ declare class AgentRegistry {
15273
15581
  * it on the trace. Null means: run locally, the reason is logged and on
15274
15582
  * the trace. */
15275
15583
  private runCloudSession;
15584
+ private specTestSettings;
15585
+ private specTestStore;
15586
+ /** The spec-test input for a new cloud session on an issue (#992), or
15587
+ * null when the test agent does not run (the reason is logged unless the
15588
+ * setting is off). Reads the whole issue with `gh`: the channel's task
15589
+ * text carries only its first 500 characters. */
15590
+ private planSpecTests;
15591
+ /** Runs the test agent in the background, beside the coding session. */
15592
+ private startSpecTests;
15276
15593
  /** The answer for a run whose HTTP caller left before it got a slot
15277
15594
  * (#822). Logged so the dropped request is visible on the node. */
15278
15595
  private callerGone;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{a as St,b as kt,c as vt,d as xt,e as $t,f as Ct,g as Pt,h as bt,la as Tt,ma as Mt}from"./chunk-HYVRS3G3.js";import"./chunk-2JQSWX7U.js";import"./chunk-GTJIKXDB.js";import"./chunk-FUGDD6UW.js";import"./chunk-S2GAEH2F.js";import"./chunk-7LN4VKDU.js";import"./chunk-IMLAPB7G.js";import"./chunk-ZVP6GB4G.js";import"./chunk-MRIVENBY.js";import"./chunk-UNIXYV3U.js";import"./chunk-AKWBDCMU.js";import"./chunk-PPUN7YHA.js";import"./chunk-VZLIBDLH.js";import"./chunk-EKJG63EJ.js";import"./chunk-QSQWVQLD.js";import"./chunk-EMGB23H5.js";import"./chunk-JAML6222.js";import"./chunk-YMX3QCV7.js";import"./chunk-JWDJMFU6.js";import"./chunk-5HLD66CW.js";import"./chunk-IS2IWRP7.js";import"./chunk-LQE73AZR.js";import"./chunk-2D3RYIDU.js";import"./chunk-Y4CYQV7G.js";import"./chunk-3W2BHUGM.js";import"./chunk-SHEUCITK.js";import"./chunk-A5GYG56I.js";import"./chunk-2AXFYDWF.js";import"./chunk-AQASR6KR.js";import{ca as yt,m as lt,n as ct,o as dt,p as mt,q as pt}from"./chunk-GQOMV52Y.js";import"./chunk-O6KRXVN7.js";import"./chunk-QSKG754X.js";import"./chunk-MEFPXHQJ.js";import{a as L}from"./chunk-UG2OF2EI.js";import{A as D,B as z,C as V,a as ye,b as we,c as Se,d as Ae,e as Ie,f as Oe,g as Ne,h as He,i as je,j as Ue,k as _e,l as I,m as q,n as Be,o as qe,p as Ye,q as O,r as ze,s as Ve,t as Xe,u as x,v as Y,w as Qe,x as Ze,y as et,z as wt}from"./chunk-OCTWRSOI.js";import{a as B,b as M,c as F}from"./chunk-SFQUP3BP.js";import"./chunk-6TTGRTDO.js";import"./chunk-GG6K5ZL6.js";import"./chunk-SZDACK6O.js";import"./chunk-VE3SSOQX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import{s as ut}from"./chunk-GPDVETDE.js";import"./chunk-QHXKELKQ.js";import"./chunk-3UOTLMXD.js";import"./chunk-36AXN6ZB.js";import"./chunk-PE5V2LI7.js";import"./chunk-GQ76J72O.js";import"./chunk-ILEC3IAV.js";import"./chunk-J3SOEFRE.js";import"./chunk-SIU6STB2.js";import"./chunk-X5C5W3E4.js";import"./chunk-GV7S5BAX.js";import"./chunk-GSX4NK2N.js";import"./chunk-VWTBHLMX.js";import"./chunk-U72JN4YF.js";import{a as ht}from"./chunk-4ZKXEUQP.js";import"./chunk-OWNQ2FD4.js";import"./chunk-KEXBEUSU.js";import"./chunk-ROLSSYXE.js";import"./chunk-PPT2MXQY.js";import"./chunk-SKSYII3K.js";import{f as gt,g as ft}from"./chunk-Z46SZWMO.js";import"./chunk-WPNRDEHW.js";import"./chunk-MWNCS57L.js";import"./chunk-4LWFJ4MZ.js";import"./chunk-BIJHMWXK.js";import"./chunk-2NTRAVHC.js";import{j as it,k as rt,l as at}from"./chunk-PILE2SH3.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-MYVHVJWZ.js";import"./chunk-6TURWSMN.js";import"./chunk-AV7T3SYT.js";import"./chunk-Y5MFVVTM.js";import"./chunk-QD6IICK7.js";import"./chunk-QOYAX2FT.js";import{a as ke,b as ve,c as xe,d as $e,e as Ce,f as Pe,g as be,h as Te,i as Me,j as Re,l as Ee,m as Ge,o as T,p as W}from"./chunk-2PJKGZWP.js";import{a as m,b as G}from"./chunk-7I7IEX4S.js";import{b as Fe,c as Le,d as A,e as De}from"./chunk-JHCI6XCJ.js";import{a as Ke,b as Je,e as We}from"./chunk-DSYKYZMT.js";import{Ba as nt,ra as tt,ta as st,ua as ot}from"./chunk-TF5356HW.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";W();G();import{execa as Rt}from"execa";import{existsSync as se,promises as X}from"fs";import S from"path";import ie from"node-fetch";async function Et(o,e){let t=o.split("/");if(t.length<2)throw new Error(`Invalid skill package ID: ${o}. Expected format: owner/repo`);let s=t[0],i=t[1],n=t[2];try{let a=n?`${s}/${i}/${n}`:`${s}/${i}`;await Rt("npx",["-y","skills","add",a],{cwd:e,stdio:"pipe"}),m.success(`Installed skill package: ${o}`);let r=S.resolve(e,".skills",`${s}_${i}`);if(se(r))return await ne(r,o);let d=S.resolve(e,".skills");return se(d)?await ne(d,o):[]}catch{return m.info(`Fetching skills directly from GitHub: ${s}/${i}`),await Gt(s,i,n,e)}}async function Gt(o,e,t,s){let i=[];try{let n=`https://api.github.com/repos/${o}/${e}/git/trees/main?recursive=1`,a=await ie(n);if(!a.ok)throw new Error(`GitHub API error: ${a.status}`);let d=(await a.json()).tree.filter(p=>p.type==="blob"&&p.path.endsWith("SKILL.md"));if(t){let p=d.find(f=>f.path.includes(`/${t}/`)||f.path===`${t}/SKILL.md`);if(p){let f=await oe(o,e,p.path,s);f&&i.push(f)}}else for(let p of d){let f=await oe(o,e,p.path,s);f&&i.push(f)}}catch(n){m.error(`Failed to fetch skills from GitHub: ${n.message}`)}return i}async function oe(o,e,t,s){try{let i=`https://raw.githubusercontent.com/${o}/${e}/main/${t}`,n=await ie(i);if(!n.ok)return null;let a=await n.text(),r=A(a);if(r){r.source="remote",r.packageId=`${o}/${e}`;let d=S.dirname(t),p=S.resolve(s,".skills",`${o}_${e}`,d);await X.mkdir(p,{recursive:!0}),await X.writeFile(S.resolve(p,"SKILL.md"),a),r.path=S.resolve(p,"SKILL.md")}return r}catch{return null}}async function ne(o,e){let t=[],{default:s}=await import("fast-glob"),i=await s.glob("**/SKILL.md",{cwd:o,deep:5});for(let n of i)try{let a=S.resolve(o,n),r=await X.readFile(a,"utf8"),d=A(r);d&&(d.source="remote",d.path=a,d.packageId=e,t.push(d))}catch{}return t}async function At(o,e,t,s,i){let n=["---",`name: ${o}`,`description: ${e}`];if(s?.length){n.push("tags:");for(let a of s)n.push(` - ${a}`)}if(i?.length){n.push("globs:");for(let a of i)n.push(` - ${a}`)}return n.push("---"),`${n.join(`
1
+ import{a as St,b as kt,c as vt,d as xt,e as $t,f as Ct,g as Pt,h as bt,la as Tt,ma as Mt}from"./chunk-L7OTWV5X.js";import"./chunk-HYOXWAQP.js";import"./chunk-GTJIKXDB.js";import"./chunk-6MARQ33D.js";import"./chunk-S2GAEH2F.js";import"./chunk-7LN4VKDU.js";import"./chunk-IMLAPB7G.js";import"./chunk-ZVP6GB4G.js";import"./chunk-MRIVENBY.js";import"./chunk-UNIXYV3U.js";import"./chunk-AKWBDCMU.js";import"./chunk-PPUN7YHA.js";import"./chunk-VZLIBDLH.js";import"./chunk-EKJG63EJ.js";import"./chunk-YDPXS6T4.js";import"./chunk-EMGB23H5.js";import"./chunk-JAML6222.js";import"./chunk-YMX3QCV7.js";import"./chunk-JWDJMFU6.js";import"./chunk-5HLD66CW.js";import"./chunk-IS2IWRP7.js";import"./chunk-LQE73AZR.js";import"./chunk-2D3RYIDU.js";import"./chunk-Y4CYQV7G.js";import"./chunk-3W2BHUGM.js";import"./chunk-SHEUCITK.js";import"./chunk-A5GYG56I.js";import"./chunk-2AXFYDWF.js";import"./chunk-AQASR6KR.js";import{m as lt,n as ct,na as yt,o as dt,p as mt,q as pt}from"./chunk-CELYB3UW.js";import"./chunk-I6P3BKWJ.js";import"./chunk-QSKG754X.js";import"./chunk-MEFPXHQJ.js";import{a as L}from"./chunk-UG2OF2EI.js";import{A as D,B as z,C as V,a as ye,b as we,c as Se,d as Ae,e as Ie,f as Oe,g as Ne,h as He,i as je,j as Ue,k as _e,l as I,m as q,n as Be,o as qe,p as Ye,q as O,r as ze,s as Ve,t as Xe,u as x,v as Y,w as Qe,x as Ze,y as et,z as wt}from"./chunk-S5DS2V3X.js";import{a as B,b as M,c as F}from"./chunk-SFQUP3BP.js";import"./chunk-6TTGRTDO.js";import"./chunk-OW2AND54.js";import"./chunk-SZDACK6O.js";import"./chunk-VE3SSOQX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import{s as ut}from"./chunk-6DZSDM35.js";import"./chunk-VJC372D6.js";import"./chunk-3UOTLMXD.js";import"./chunk-36AXN6ZB.js";import"./chunk-PE5V2LI7.js";import"./chunk-GQ76J72O.js";import"./chunk-ILEC3IAV.js";import"./chunk-J3SOEFRE.js";import"./chunk-SIU6STB2.js";import"./chunk-X5C5W3E4.js";import"./chunk-GV7S5BAX.js";import"./chunk-GSX4NK2N.js";import"./chunk-VWTBHLMX.js";import"./chunk-W4JLZJHU.js";import{a as ht}from"./chunk-COWWOA7H.js";import"./chunk-OWNQ2FD4.js";import"./chunk-KEXBEUSU.js";import"./chunk-ROLSSYXE.js";import"./chunk-T7LDVJMP.js";import"./chunk-SKSYII3K.js";import{f as gt,g as ft}from"./chunk-UJRJUSDY.js";import"./chunk-WPNRDEHW.js";import"./chunk-MWNCS57L.js";import"./chunk-4LWFJ4MZ.js";import"./chunk-BIJHMWXK.js";import"./chunk-LYSCMFAM.js";import{j as it,k as rt,l as at}from"./chunk-MSRFTAWH.js";import"./chunk-72SZI2UW.js";import"./chunk-FCPTN6NF.js";import"./chunk-MCI3DIWW.js";import"./chunk-MYVHVJWZ.js";import"./chunk-6TURWSMN.js";import"./chunk-AV7T3SYT.js";import"./chunk-Y5MFVVTM.js";import"./chunk-QD6IICK7.js";import"./chunk-QOYAX2FT.js";import{a as ke,b as ve,c as xe,d as $e,e as Ce,f as Pe,g as be,h as Te,i as Me,j as Re,l as Ee,m as Ge,o as T,p as W}from"./chunk-2PJKGZWP.js";import{a as m,b as G}from"./chunk-7I7IEX4S.js";import{b as Fe,c as Le,d as A,e as De}from"./chunk-JHCI6XCJ.js";import{a as Ke,b as Je,e as We}from"./chunk-DSYKYZMT.js";import{Ca as nt,sa as tt,ua as st,va as ot}from"./chunk-HW5FTKTU.js";import"./chunk-BRK6M6LA.js";import"./chunk-UIBUZ2N3.js";import"./chunk-2QNT5JDS.js";import"./chunk-RGDKHYY2.js";import"./chunk-QIJLFPWE.js";W();G();import{execa as Rt}from"execa";import{existsSync as se,promises as X}from"fs";import S from"path";import ie from"node-fetch";async function Et(o,e){let t=o.split("/");if(t.length<2)throw new Error(`Invalid skill package ID: ${o}. Expected format: owner/repo`);let s=t[0],i=t[1],n=t[2];try{let a=n?`${s}/${i}/${n}`:`${s}/${i}`;await Rt("npx",["-y","skills","add",a],{cwd:e,stdio:"pipe"}),m.success(`Installed skill package: ${o}`);let r=S.resolve(e,".skills",`${s}_${i}`);if(se(r))return await ne(r,o);let d=S.resolve(e,".skills");return se(d)?await ne(d,o):[]}catch{return m.info(`Fetching skills directly from GitHub: ${s}/${i}`),await Gt(s,i,n,e)}}async function Gt(o,e,t,s){let i=[];try{let n=`https://api.github.com/repos/${o}/${e}/git/trees/main?recursive=1`,a=await ie(n);if(!a.ok)throw new Error(`GitHub API error: ${a.status}`);let d=(await a.json()).tree.filter(p=>p.type==="blob"&&p.path.endsWith("SKILL.md"));if(t){let p=d.find(f=>f.path.includes(`/${t}/`)||f.path===`${t}/SKILL.md`);if(p){let f=await oe(o,e,p.path,s);f&&i.push(f)}}else for(let p of d){let f=await oe(o,e,p.path,s);f&&i.push(f)}}catch(n){m.error(`Failed to fetch skills from GitHub: ${n.message}`)}return i}async function oe(o,e,t,s){try{let i=`https://raw.githubusercontent.com/${o}/${e}/main/${t}`,n=await ie(i);if(!n.ok)return null;let a=await n.text(),r=A(a);if(r){r.source="remote",r.packageId=`${o}/${e}`;let d=S.dirname(t),p=S.resolve(s,".skills",`${o}_${e}`,d);await X.mkdir(p,{recursive:!0}),await X.writeFile(S.resolve(p,"SKILL.md"),a),r.path=S.resolve(p,"SKILL.md")}return r}catch{return null}}async function ne(o,e){let t=[],{default:s}=await import("fast-glob"),i=await s.glob("**/SKILL.md",{cwd:o,deep:5});for(let n of i)try{let a=S.resolve(o,n),r=await X.readFile(a,"utf8"),d=A(r);d&&(d.source="remote",d.path=a,d.packageId=e,t.push(d))}catch{}return t}async function At(o,e,t,s,i){let n=["---",`name: ${o}`,`description: ${e}`];if(s?.length){n.push("tags:");for(let a of s)n.push(` - ${a}`)}if(i?.length){n.push("globs:");for(let a of i)n.push(` - ${a}`)}return n.push("---"),`${n.join(`
2
2
  `)}
3
3
 
4
4
  ${t}`}async function It(o){let{loadLocalSkills:e}=await import("./loader-YFVSSYSL.js");return e(o)}async function Ot(o,e,t,s,i){let a=[{role:"system",content:`You are a skill author for the Agent Skills ecosystem (skills.sh).