agent-dealer 0.1.0 → 0.1.2

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.
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
  export * from "./runtime.js";
3
3
  export * from "./agents.js";
4
+ export * from "./budget.js";
4
5
  export * from "./execution.js";
5
6
  export declare const RunStatus: z.ZodEnum<["queued", "plan_pending", "plan_approved", "running", "review", "done", "failed", "cancelled"]>;
6
7
  export type RunStatus = z.infer<typeof RunStatus>;
@@ -561,6 +562,64 @@ export declare const CreateRunInput: z.ZodObject<{
561
562
  agentId: z.ZodString;
562
563
  planModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
563
564
  executeModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
565
+ budget: z.ZodOptional<z.ZodObject<{
566
+ plan: z.ZodOptional<z.ZodObject<{
567
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
568
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
569
+ }, "strip", z.ZodTypeAny, {
570
+ maxTurns?: number | null | undefined;
571
+ maxBudgetUsd?: number | null | undefined;
572
+ }, {
573
+ maxTurns?: number | null | undefined;
574
+ maxBudgetUsd?: number | null | undefined;
575
+ }>>;
576
+ execute: z.ZodOptional<z.ZodObject<{
577
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
578
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
579
+ }, "strip", z.ZodTypeAny, {
580
+ maxTurns?: number | null | undefined;
581
+ maxBudgetUsd?: number | null | undefined;
582
+ }, {
583
+ maxTurns?: number | null | undefined;
584
+ maxBudgetUsd?: number | null | undefined;
585
+ }>>;
586
+ reflect: z.ZodOptional<z.ZodObject<{
587
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
588
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
589
+ }, "strip", z.ZodTypeAny, {
590
+ maxTurns?: number | null | undefined;
591
+ maxBudgetUsd?: number | null | undefined;
592
+ }, {
593
+ maxTurns?: number | null | undefined;
594
+ maxBudgetUsd?: number | null | undefined;
595
+ }>>;
596
+ }, "strip", z.ZodTypeAny, {
597
+ plan?: {
598
+ maxTurns?: number | null | undefined;
599
+ maxBudgetUsd?: number | null | undefined;
600
+ } | undefined;
601
+ execute?: {
602
+ maxTurns?: number | null | undefined;
603
+ maxBudgetUsd?: number | null | undefined;
604
+ } | undefined;
605
+ reflect?: {
606
+ maxTurns?: number | null | undefined;
607
+ maxBudgetUsd?: number | null | undefined;
608
+ } | undefined;
609
+ }, {
610
+ plan?: {
611
+ maxTurns?: number | null | undefined;
612
+ maxBudgetUsd?: number | null | undefined;
613
+ } | undefined;
614
+ execute?: {
615
+ maxTurns?: number | null | undefined;
616
+ maxBudgetUsd?: number | null | undefined;
617
+ } | undefined;
618
+ reflect?: {
619
+ maxTurns?: number | null | undefined;
620
+ maxBudgetUsd?: number | null | undefined;
621
+ } | undefined;
622
+ }>>;
564
623
  }, "strip", z.ZodTypeAny, {
565
624
  status: "queued" | "plan_pending" | "plan_approved";
566
625
  title: string;
@@ -572,6 +631,20 @@ export declare const CreateRunInput: z.ZodObject<{
572
631
  planModel?: string | null | undefined;
573
632
  executeModel?: string | null | undefined;
574
633
  acceptanceCriteria?: string | undefined;
634
+ budget?: {
635
+ plan?: {
636
+ maxTurns?: number | null | undefined;
637
+ maxBudgetUsd?: number | null | undefined;
638
+ } | undefined;
639
+ execute?: {
640
+ maxTurns?: number | null | undefined;
641
+ maxBudgetUsd?: number | null | undefined;
642
+ } | undefined;
643
+ reflect?: {
644
+ maxTurns?: number | null | undefined;
645
+ maxBudgetUsd?: number | null | undefined;
646
+ } | undefined;
647
+ } | undefined;
575
648
  }, {
576
649
  title: string;
577
650
  agentId: string;
@@ -583,6 +656,20 @@ export declare const CreateRunInput: z.ZodObject<{
583
656
  planModel?: string | null | undefined;
584
657
  executeModel?: string | null | undefined;
585
658
  acceptanceCriteria?: string | undefined;
659
+ budget?: {
660
+ plan?: {
661
+ maxTurns?: number | null | undefined;
662
+ maxBudgetUsd?: number | null | undefined;
663
+ } | undefined;
664
+ execute?: {
665
+ maxTurns?: number | null | undefined;
666
+ maxBudgetUsd?: number | null | undefined;
667
+ } | undefined;
668
+ reflect?: {
669
+ maxTurns?: number | null | undefined;
670
+ maxBudgetUsd?: number | null | undefined;
671
+ } | undefined;
672
+ } | undefined;
586
673
  }>;
587
674
  export type CreateRunInput = z.infer<typeof CreateRunInput>;
588
675
  export declare const AgentConfigInput: z.ZodObject<{
@@ -591,18 +678,104 @@ export declare const AgentConfigInput: z.ZodObject<{
591
678
  playbookId: z.ZodOptional<z.ZodString>;
592
679
  planModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
593
680
  executeModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
681
+ budget: z.ZodOptional<z.ZodObject<{
682
+ plan: z.ZodOptional<z.ZodObject<{
683
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
684
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
685
+ }, "strip", z.ZodTypeAny, {
686
+ maxTurns?: number | null | undefined;
687
+ maxBudgetUsd?: number | null | undefined;
688
+ }, {
689
+ maxTurns?: number | null | undefined;
690
+ maxBudgetUsd?: number | null | undefined;
691
+ }>>;
692
+ execute: z.ZodOptional<z.ZodObject<{
693
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
694
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
695
+ }, "strip", z.ZodTypeAny, {
696
+ maxTurns?: number | null | undefined;
697
+ maxBudgetUsd?: number | null | undefined;
698
+ }, {
699
+ maxTurns?: number | null | undefined;
700
+ maxBudgetUsd?: number | null | undefined;
701
+ }>>;
702
+ reflect: z.ZodOptional<z.ZodObject<{
703
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
704
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
705
+ }, "strip", z.ZodTypeAny, {
706
+ maxTurns?: number | null | undefined;
707
+ maxBudgetUsd?: number | null | undefined;
708
+ }, {
709
+ maxTurns?: number | null | undefined;
710
+ maxBudgetUsd?: number | null | undefined;
711
+ }>>;
712
+ }, "strip", z.ZodTypeAny, {
713
+ plan?: {
714
+ maxTurns?: number | null | undefined;
715
+ maxBudgetUsd?: number | null | undefined;
716
+ } | undefined;
717
+ execute?: {
718
+ maxTurns?: number | null | undefined;
719
+ maxBudgetUsd?: number | null | undefined;
720
+ } | undefined;
721
+ reflect?: {
722
+ maxTurns?: number | null | undefined;
723
+ maxBudgetUsd?: number | null | undefined;
724
+ } | undefined;
725
+ }, {
726
+ plan?: {
727
+ maxTurns?: number | null | undefined;
728
+ maxBudgetUsd?: number | null | undefined;
729
+ } | undefined;
730
+ execute?: {
731
+ maxTurns?: number | null | undefined;
732
+ maxBudgetUsd?: number | null | undefined;
733
+ } | undefined;
734
+ reflect?: {
735
+ maxTurns?: number | null | undefined;
736
+ maxBudgetUsd?: number | null | undefined;
737
+ } | undefined;
738
+ }>>;
594
739
  }, "strip", z.ZodTypeAny, {
595
740
  runtime: "claude_code" | "cursor_local";
596
741
  deckId?: string | undefined;
597
742
  playbookId?: string | undefined;
598
743
  planModel?: string | null | undefined;
599
744
  executeModel?: string | null | undefined;
745
+ budget?: {
746
+ plan?: {
747
+ maxTurns?: number | null | undefined;
748
+ maxBudgetUsd?: number | null | undefined;
749
+ } | undefined;
750
+ execute?: {
751
+ maxTurns?: number | null | undefined;
752
+ maxBudgetUsd?: number | null | undefined;
753
+ } | undefined;
754
+ reflect?: {
755
+ maxTurns?: number | null | undefined;
756
+ maxBudgetUsd?: number | null | undefined;
757
+ } | undefined;
758
+ } | undefined;
600
759
  }, {
601
760
  runtime: "claude_code" | "cursor_local";
602
761
  deckId?: string | undefined;
603
762
  playbookId?: string | undefined;
604
763
  planModel?: string | null | undefined;
605
764
  executeModel?: string | null | undefined;
765
+ budget?: {
766
+ plan?: {
767
+ maxTurns?: number | null | undefined;
768
+ maxBudgetUsd?: number | null | undefined;
769
+ } | undefined;
770
+ execute?: {
771
+ maxTurns?: number | null | undefined;
772
+ maxBudgetUsd?: number | null | undefined;
773
+ } | undefined;
774
+ reflect?: {
775
+ maxTurns?: number | null | undefined;
776
+ maxBudgetUsd?: number | null | undefined;
777
+ } | undefined;
778
+ } | undefined;
606
779
  }>;
607
780
  export type AgentConfigInput = z.infer<typeof AgentConfigInput>;
608
781
  export declare const UpdatePlanInput: z.ZodObject<{
@@ -610,16 +783,52 @@ export declare const UpdatePlanInput: z.ZodObject<{
610
783
  approve: z.ZodDefault<z.ZodBoolean>;
611
784
  planModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
612
785
  executeModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
786
+ planBudget: z.ZodOptional<z.ZodNullable<z.ZodObject<{
787
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
788
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
789
+ }, "strip", z.ZodTypeAny, {
790
+ maxTurns?: number | null | undefined;
791
+ maxBudgetUsd?: number | null | undefined;
792
+ }, {
793
+ maxTurns?: number | null | undefined;
794
+ maxBudgetUsd?: number | null | undefined;
795
+ }>>>;
796
+ executeBudget: z.ZodOptional<z.ZodNullable<z.ZodObject<{
797
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
798
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
799
+ }, "strip", z.ZodTypeAny, {
800
+ maxTurns?: number | null | undefined;
801
+ maxBudgetUsd?: number | null | undefined;
802
+ }, {
803
+ maxTurns?: number | null | undefined;
804
+ maxBudgetUsd?: number | null | undefined;
805
+ }>>>;
613
806
  }, "strip", z.ZodTypeAny, {
614
807
  approve: boolean;
615
808
  planMarkdown: string;
616
809
  planModel?: string | null | undefined;
617
810
  executeModel?: string | null | undefined;
811
+ planBudget?: {
812
+ maxTurns?: number | null | undefined;
813
+ maxBudgetUsd?: number | null | undefined;
814
+ } | null | undefined;
815
+ executeBudget?: {
816
+ maxTurns?: number | null | undefined;
817
+ maxBudgetUsd?: number | null | undefined;
818
+ } | null | undefined;
618
819
  }, {
619
820
  planMarkdown: string;
620
821
  approve?: boolean | undefined;
621
822
  planModel?: string | null | undefined;
622
823
  executeModel?: string | null | undefined;
824
+ planBudget?: {
825
+ maxTurns?: number | null | undefined;
826
+ maxBudgetUsd?: number | null | undefined;
827
+ } | null | undefined;
828
+ executeBudget?: {
829
+ maxTurns?: number | null | undefined;
830
+ maxBudgetUsd?: number | null | undefined;
831
+ } | null | undefined;
623
832
  }>;
624
833
  export type UpdatePlanInput = z.infer<typeof UpdatePlanInput>;
625
834
  export declare const KickRunInput: z.ZodObject<{
@@ -628,16 +837,34 @@ export declare const KickRunInput: z.ZodObject<{
628
837
  deckId: z.ZodOptional<z.ZodString>;
629
838
  playbookId: z.ZodOptional<z.ZodString>;
630
839
  executeModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
840
+ executeBudget: z.ZodOptional<z.ZodNullable<z.ZodObject<{
841
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
842
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
843
+ }, "strip", z.ZodTypeAny, {
844
+ maxTurns?: number | null | undefined;
845
+ maxBudgetUsd?: number | null | undefined;
846
+ }, {
847
+ maxTurns?: number | null | undefined;
848
+ maxBudgetUsd?: number | null | undefined;
849
+ }>>>;
631
850
  }, "strip", z.ZodTypeAny, {
632
851
  runtime?: "claude_code" | "cursor_local" | undefined;
633
852
  deckId?: string | undefined;
634
853
  playbookId?: string | undefined;
635
854
  executeModel?: string | null | undefined;
855
+ executeBudget?: {
856
+ maxTurns?: number | null | undefined;
857
+ maxBudgetUsd?: number | null | undefined;
858
+ } | null | undefined;
636
859
  }, {
637
860
  runtime?: "claude_code" | "cursor_local" | undefined;
638
861
  deckId?: string | undefined;
639
862
  playbookId?: string | undefined;
640
863
  executeModel?: string | null | undefined;
864
+ executeBudget?: {
865
+ maxTurns?: number | null | undefined;
866
+ maxBudgetUsd?: number | null | undefined;
867
+ } | null | undefined;
641
868
  }>;
642
869
  export type KickRunInput = z.infer<typeof KickRunInput>;
643
870
  export declare const RetryRunInput: z.ZodObject<{
@@ -1005,10 +1232,28 @@ export declare const PromoteLinearInput: z.ZodEffects<z.ZodObject<{
1005
1232
  export type PromoteLinearInput = z.infer<typeof PromoteLinearInput>;
1006
1233
  export declare const DraftPlanInput: z.ZodObject<{
1007
1234
  planModel: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1235
+ planBudget: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1236
+ maxTurns: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1237
+ maxBudgetUsd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1238
+ }, "strip", z.ZodTypeAny, {
1239
+ maxTurns?: number | null | undefined;
1240
+ maxBudgetUsd?: number | null | undefined;
1241
+ }, {
1242
+ maxTurns?: number | null | undefined;
1243
+ maxBudgetUsd?: number | null | undefined;
1244
+ }>>>;
1008
1245
  }, "strip", z.ZodTypeAny, {
1009
1246
  planModel?: string | null | undefined;
1247
+ planBudget?: {
1248
+ maxTurns?: number | null | undefined;
1249
+ maxBudgetUsd?: number | null | undefined;
1250
+ } | null | undefined;
1010
1251
  }, {
1011
1252
  planModel?: string | null | undefined;
1253
+ planBudget?: {
1254
+ maxTurns?: number | null | undefined;
1255
+ maxBudgetUsd?: number | null | undefined;
1256
+ } | null | undefined;
1012
1257
  }>;
1013
1258
  export type DraftPlanInput = z.infer<typeof DraftPlanInput>;
1014
1259
  export declare const RuntimeModelOption: z.ZodObject<{
@@ -1698,6 +1943,8 @@ export declare const QueueSnapshot: z.ZodObject<{
1698
1943
  playbookId: z.ZodNullable<z.ZodString>;
1699
1944
  defaultPlanModel: z.ZodNullable<z.ZodString>;
1700
1945
  defaultExecuteModel: z.ZodNullable<z.ZodString>;
1946
+ defaultPlanBudgetJson: z.ZodNullable<z.ZodString>;
1947
+ defaultExecuteBudgetJson: z.ZodNullable<z.ZodString>;
1701
1948
  isBuiltin: z.ZodBoolean;
1702
1949
  createdAt: z.ZodString;
1703
1950
  updatedAt: z.ZodString;
@@ -1727,6 +1974,8 @@ export declare const QueueSnapshot: z.ZodObject<{
1727
1974
  playbookId: string | null;
1728
1975
  defaultPlanModel: string | null;
1729
1976
  defaultExecuteModel: string | null;
1977
+ defaultPlanBudgetJson: string | null;
1978
+ defaultExecuteBudgetJson: string | null;
1730
1979
  isBuiltin: boolean;
1731
1980
  createdAt: string;
1732
1981
  updatedAt: string;
@@ -1745,6 +1994,8 @@ export declare const QueueSnapshot: z.ZodObject<{
1745
1994
  playbookId: string | null;
1746
1995
  defaultPlanModel: string | null;
1747
1996
  defaultExecuteModel: string | null;
1997
+ defaultPlanBudgetJson: string | null;
1998
+ defaultExecuteBudgetJson: string | null;
1748
1999
  isBuiltin: boolean;
1749
2000
  createdAt: string;
1750
2001
  updatedAt: string;
@@ -1766,6 +2017,8 @@ export declare const QueueSnapshot: z.ZodObject<{
1766
2017
  playbookId: string | null;
1767
2018
  defaultPlanModel: string | null;
1768
2019
  defaultExecuteModel: string | null;
2020
+ defaultPlanBudgetJson: string | null;
2021
+ defaultExecuteBudgetJson: string | null;
1769
2022
  isBuiltin: boolean;
1770
2023
  createdAt: string;
1771
2024
  updatedAt: string;
@@ -1999,6 +2252,8 @@ export declare const QueueSnapshot: z.ZodObject<{
1999
2252
  playbookId: string | null;
2000
2253
  defaultPlanModel: string | null;
2001
2254
  defaultExecuteModel: string | null;
2255
+ defaultPlanBudgetJson: string | null;
2256
+ defaultExecuteBudgetJson: string | null;
2002
2257
  isBuiltin: boolean;
2003
2258
  createdAt: string;
2004
2259
  updatedAt: string;
@@ -1,8 +1,10 @@
1
1
  import { z } from "zod";
2
2
  import { Runtime } from "./runtime.js";
3
3
  import { AgentWithHealth } from "./agents.js";
4
+ import { PhaseBudget, RunBudget } from "./budget.js";
4
5
  export * from "./runtime.js";
5
6
  export * from "./agents.js";
7
+ export * from "./budget.js";
6
8
  export * from "./execution.js";
7
9
  export const RunStatus = z.enum([
8
10
  "queued",
@@ -183,6 +185,7 @@ export const CreateRunInput = z.object({
183
185
  agentId: z.string().uuid(),
184
186
  planModel: z.string().nullable().optional(),
185
187
  executeModel: z.string().nullable().optional(),
188
+ budget: RunBudget.optional(),
186
189
  });
187
190
  export const AgentConfigInput = z.object({
188
191
  runtime: Runtime,
@@ -190,12 +193,15 @@ export const AgentConfigInput = z.object({
190
193
  playbookId: z.string().optional(),
191
194
  planModel: z.string().nullable().optional(),
192
195
  executeModel: z.string().nullable().optional(),
196
+ budget: RunBudget.optional(),
193
197
  });
194
198
  export const UpdatePlanInput = z.object({
195
199
  planMarkdown: z.string(),
196
200
  approve: z.boolean().default(false),
197
201
  planModel: z.string().nullable().optional(),
198
202
  executeModel: z.string().nullable().optional(),
203
+ planBudget: PhaseBudget.nullable().optional(),
204
+ executeBudget: PhaseBudget.nullable().optional(),
199
205
  });
200
206
  export const KickRunInput = z.object({
201
207
  /** Uses run record when omitted at kick time. */
@@ -203,6 +209,7 @@ export const KickRunInput = z.object({
203
209
  deckId: z.string().uuid().optional(),
204
210
  playbookId: z.string().optional(),
205
211
  executeModel: z.string().nullable().optional(),
212
+ executeBudget: PhaseBudget.nullable().optional(),
206
213
  });
207
214
  export const RetryRunInput = z.object({
208
215
  feedback: z.string().min(1),
@@ -284,6 +291,7 @@ export const PromoteLinearInput = z
284
291
  });
285
292
  export const DraftPlanInput = z.object({
286
293
  planModel: z.string().nullable().optional(),
294
+ planBudget: PhaseBudget.nullable().optional(),
287
295
  });
288
296
  export const RuntimeModelOption = z.object({
289
297
  id: z.string(),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-dealer/shared",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
package/dist/bin.js CHANGED
File without changes
package/dist/doctor.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import net from "node:net";
2
2
  import fs from "node:fs";
3
- import path from "node:path";
4
3
  import { claudeAvailable } from "./cli-check.js";
5
- import { resolveServerEntry, resolveUiDist, defaultAgentDealerHome } from "./paths.js";
4
+ import { loadProdEnvFile, prodEnvFilePath, prodHomeDir, resolveBundledListenPort, shortenHome, } from "./env.js";
5
+ import { resolveServerEntry, resolveUiDist } from "./paths.js";
6
6
  export async function runDoctor() {
7
7
  let failed = false;
8
8
  const major = Number(process.versions.node.split(".")[0]);
@@ -35,15 +35,24 @@ export async function runDoctor() {
35
35
  else {
36
36
  console.warn("⚠ dashboard bundle missing (API-only)");
37
37
  }
38
- const home = defaultAgentDealerHome();
39
- const envFile = path.join(home, ".env");
38
+ const envFile = loadProdEnvFile() ?? prodEnvFilePath();
40
39
  if (fs.existsSync(envFile)) {
41
- console.log(`✓ config ${envFile}`);
40
+ console.log(`✓ config ${shortenHome(envFile)}`);
41
+ if (process.env.LINEAR_API_KEY?.trim()) {
42
+ console.log("✓ LINEAR_API_KEY set");
43
+ }
44
+ else {
45
+ console.warn("⚠ LINEAR_API_KEY not set — Linear inbox disabled");
46
+ }
42
47
  }
43
48
  else {
44
49
  console.warn(`⚠ no config — run: agent-dealer setup`);
45
50
  }
46
- const port = Number(process.env.PORT ?? 2221);
51
+ const home = prodHomeDir();
52
+ if (fs.existsSync(home)) {
53
+ console.log(`✓ data ${shortenHome(home)}`);
54
+ }
55
+ const port = resolveBundledListenPort();
47
56
  const free = await isPortFree(port);
48
57
  if (free) {
49
58
  console.log(`✓ port ${port} available`);
package/dist/env.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ /** Production data + config directory (respects AGENT_DEALER_HOME from shell). */
2
+ export declare function prodHomeDir(): string;
3
+ export declare function prodEnvFilePath(): string;
4
+ /** Load ~/.agent-dealer/.env for CLI (Linear keys, port, etc.). Does not override existing env. */
5
+ export declare function loadProdEnvFile(): string | undefined;
6
+ /**
7
+ * Bundled npm start: listen on prod dashboard port (2222).
8
+ * Legacy setups used PORT=2221 for API-only; ignore that when bundling UI.
9
+ */
10
+ export declare function resolveBundledListenPort(explicit?: number): number;
11
+ export declare function shortenHome(p: string): string;
package/dist/env.js ADDED
@@ -0,0 +1,39 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import dotenv from "dotenv";
5
+ /** Production data + config directory (respects AGENT_DEALER_HOME from shell). */
6
+ export function prodHomeDir() {
7
+ return (process.env.AGENT_DEALER_HOME?.trim() ||
8
+ path.join(os.homedir(), ".agent-dealer"));
9
+ }
10
+ export function prodEnvFilePath() {
11
+ return path.join(prodHomeDir(), ".env");
12
+ }
13
+ /** Load ~/.agent-dealer/.env for CLI (Linear keys, port, etc.). Does not override existing env. */
14
+ export function loadProdEnvFile() {
15
+ const envFile = prodEnvFilePath();
16
+ if (fs.existsSync(envFile)) {
17
+ dotenv.config({ path: envFile });
18
+ return envFile;
19
+ }
20
+ return undefined;
21
+ }
22
+ /**
23
+ * Bundled npm start: listen on prod dashboard port (2222).
24
+ * Legacy setups used PORT=2221 for API-only; ignore that when bundling UI.
25
+ */
26
+ export function resolveBundledListenPort(explicit) {
27
+ if (explicit !== undefined)
28
+ return explicit;
29
+ if (process.env.WEB_PORT)
30
+ return Number(process.env.WEB_PORT);
31
+ const port = process.env.PORT;
32
+ if (port && port !== "2221")
33
+ return Number(port);
34
+ return 2222;
35
+ }
36
+ export function shortenHome(p) {
37
+ const home = os.homedir();
38
+ return p.startsWith(home) ? `~${p.slice(home.length)}` : p;
39
+ }
package/dist/start.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { spawn } from "node:child_process";
2
+ import { loadProdEnvFile, prodEnvFilePath, prodHomeDir, resolveBundledListenPort, shortenHome, } from "./env.js";
2
3
  import { resolveServerEntry, resolveUiDist } from "./paths.js";
3
4
  let child = null;
4
5
  async function waitForHealth(url, attempts = 40) {
@@ -16,13 +17,23 @@ async function waitForHealth(url, attempts = 40) {
16
17
  return false;
17
18
  }
18
19
  export async function runStart(options = {}) {
19
- const port = options.port ?? Number(process.env.PORT ?? 2221);
20
- const entry = resolveServerEntry();
20
+ const envFile = loadProdEnvFile();
21
+ const home = prodHomeDir();
21
22
  const uiDist = resolveUiDist();
23
+ const port = resolveBundledListenPort(options.port);
24
+ const entry = resolveServerEntry();
25
+ if (envFile) {
26
+ console.log(`Config: ${shortenHome(envFile)}`);
27
+ }
28
+ else {
29
+ console.warn(`No config at ${shortenHome(prodEnvFilePath())} — run: agent-dealer setup`);
30
+ }
22
31
  const env = {
23
32
  ...process.env,
24
33
  AGENT_DEALER_ENV: "production",
34
+ AGENT_DEALER_HOME: home,
25
35
  PORT: String(port),
36
+ WEB_PORT: String(port),
26
37
  AGENT_DEALER_WEB_URL: `http://localhost:${port}`,
27
38
  AGENT_DEALER_API: `http://127.0.0.1:${port}`,
28
39
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-dealer",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Human control plane for agent execution — queue, plan approval, audit",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -6,14 +6,15 @@ AGENT_DEALER_ENV=production
6
6
  # SQLite data directory (default: ~/.agent-dealer)
7
7
  # AGENT_DEALER_HOME=
8
8
 
9
- # API + dashboard port when UI is bundled (default: 2221)
10
- PORT=2221
11
- AGENT_DEALER_WEB_URL=http://localhost:2221
9
+ # API + dashboard port when UI is bundled (default: 2222 — prod dashboard port)
10
+ PORT=2222
11
+ AGENT_DEALER_WEB_URL=http://localhost:2222
12
+ AGENT_DEALER_API=http://127.0.0.1:2222
12
13
 
13
- # Linear (optional — manual tasks work without)
14
- # LINEAR_API_KEY=
15
- # LINEAR_TEAM_ID=
16
- # LINEAR_STATE_FILTER="Todo,Backlog"
14
+ # Linear (optional — manual tasks work without; edit after `agent-dealer setup`)
15
+ LINEAR_API_KEY=
16
+ LINEAR_TEAM_ID=
17
+ LINEAR_STATE_FILTER="Todo,Backlog"
17
18
 
18
19
  # Agent Deck UI proxy (optional)
19
20
  # AGENT_DECK_API_URL=http://127.0.0.1:1111