@nac3/forge-cli 0.2.0-alpha.2 → 0.2.0-alpha.21

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 (150) hide show
  1. package/dist/bin/yf.d.ts.map +1 -1
  2. package/dist/bin/yf.js +25 -0
  3. package/dist/bin/yf.js.map +1 -1
  4. package/dist/chat/claude.d.ts +22 -15
  5. package/dist/chat/claude.d.ts.map +1 -1
  6. package/dist/chat/claude.js +75 -22
  7. package/dist/chat/claude.js.map +1 -1
  8. package/dist/chat/panel.d.ts.map +1 -1
  9. package/dist/chat/panel.js +102 -3
  10. package/dist/chat/panel.js.map +1 -1
  11. package/dist/chat/server.js +498 -32
  12. package/dist/chat/server.js.map +1 -1
  13. package/dist/chat/tools/audit_consumers.d.ts +66 -0
  14. package/dist/chat/tools/audit_consumers.d.ts.map +1 -0
  15. package/dist/chat/tools/audit_consumers.js +231 -0
  16. package/dist/chat/tools/audit_consumers.js.map +1 -0
  17. package/dist/chat/tools/git.js +4 -4
  18. package/dist/chat/tools/github.js +3 -3
  19. package/dist/chat/tools/lifecycle.js +3 -3
  20. package/dist/chat/tools/manual.js +1 -1
  21. package/dist/chat/tools/reader.js +8 -8
  22. package/dist/chat/tools/workflow.d.ts +45 -0
  23. package/dist/chat/tools/workflow.d.ts.map +1 -0
  24. package/dist/chat/tools/workflow.js +404 -0
  25. package/dist/chat/tools/workflow.js.map +1 -0
  26. package/dist/chat/tools.d.ts.map +1 -1
  27. package/dist/chat/tools.js +23 -4
  28. package/dist/chat/tools.js.map +1 -1
  29. package/dist/commands/approve.d.ts +32 -0
  30. package/dist/commands/approve.d.ts.map +1 -0
  31. package/dist/commands/approve.js +198 -0
  32. package/dist/commands/approve.js.map +1 -0
  33. package/dist/commands/block.d.ts +28 -0
  34. package/dist/commands/block.d.ts.map +1 -0
  35. package/dist/commands/block.js +189 -0
  36. package/dist/commands/block.js.map +1 -0
  37. package/dist/commands/bootstrap.d.ts +35 -0
  38. package/dist/commands/bootstrap.d.ts.map +1 -0
  39. package/dist/commands/bootstrap.js +205 -0
  40. package/dist/commands/bootstrap.js.map +1 -0
  41. package/dist/commands/chat.d.ts +3 -0
  42. package/dist/commands/chat.d.ts.map +1 -1
  43. package/dist/commands/chat.js +46 -1
  44. package/dist/commands/chat.js.map +1 -1
  45. package/dist/commands/clarify.d.ts +30 -0
  46. package/dist/commands/clarify.d.ts.map +1 -0
  47. package/dist/commands/clarify.js +671 -0
  48. package/dist/commands/clarify.js.map +1 -0
  49. package/dist/commands/discover.d.ts +30 -0
  50. package/dist/commands/discover.d.ts.map +1 -0
  51. package/dist/commands/discover.js +178 -0
  52. package/dist/commands/discover.js.map +1 -0
  53. package/dist/commands/doctor.js +94 -42
  54. package/dist/commands/doctor.js.map +1 -1
  55. package/dist/commands/keys_setup.d.ts +53 -0
  56. package/dist/commands/keys_setup.d.ts.map +1 -0
  57. package/dist/commands/keys_setup.js +487 -0
  58. package/dist/commands/keys_setup.js.map +1 -0
  59. package/dist/commands/legacy-audit.d.ts +34 -0
  60. package/dist/commands/legacy-audit.d.ts.map +1 -0
  61. package/dist/commands/legacy-audit.js +270 -0
  62. package/dist/commands/legacy-audit.js.map +1 -0
  63. package/dist/commands/license.d.ts.map +1 -1
  64. package/dist/commands/license.js +41 -0
  65. package/dist/commands/license.js.map +1 -1
  66. package/dist/commands/operate.d.ts +22 -0
  67. package/dist/commands/operate.d.ts.map +1 -0
  68. package/dist/commands/operate.js +483 -0
  69. package/dist/commands/operate.js.map +1 -0
  70. package/dist/commands/spec.d.ts +38 -0
  71. package/dist/commands/spec.d.ts.map +1 -0
  72. package/dist/commands/spec.js +256 -0
  73. package/dist/commands/spec.js.map +1 -0
  74. package/dist/commands/triage.d.ts +34 -0
  75. package/dist/commands/triage.d.ts.map +1 -0
  76. package/dist/commands/triage.js +228 -0
  77. package/dist/commands/triage.js.map +1 -0
  78. package/dist/commands/vault-inventory.d.ts +30 -0
  79. package/dist/commands/vault-inventory.d.ts.map +1 -0
  80. package/dist/commands/vault-inventory.js +214 -0
  81. package/dist/commands/vault-inventory.js.map +1 -0
  82. package/dist/commands/vault.d.ts.map +1 -1
  83. package/dist/commands/vault.js +5 -0
  84. package/dist/commands/vault.js.map +1 -1
  85. package/dist/commands/voice.js +1 -1
  86. package/dist/commands/voice.js.map +1 -1
  87. package/dist/commands/workflow-coverage.d.ts +30 -0
  88. package/dist/commands/workflow-coverage.d.ts.map +1 -0
  89. package/dist/commands/workflow-coverage.js +138 -0
  90. package/dist/commands/workflow-coverage.js.map +1 -0
  91. package/dist/core/keys_envelope.d.ts +13 -0
  92. package/dist/core/keys_envelope.d.ts.map +1 -1
  93. package/dist/core/keys_envelope.js.map +1 -1
  94. package/dist/deploy/adapter.d.ts +93 -0
  95. package/dist/deploy/adapter.d.ts.map +1 -0
  96. package/dist/deploy/adapter.js +42 -0
  97. package/dist/deploy/adapter.js.map +1 -0
  98. package/dist/deploy/aws_adapter.d.ts +28 -0
  99. package/dist/deploy/aws_adapter.d.ts.map +1 -0
  100. package/dist/deploy/aws_adapter.js +65 -0
  101. package/dist/deploy/aws_adapter.js.map +1 -0
  102. package/dist/deploy/cloudflare.d.ts +24 -0
  103. package/dist/deploy/cloudflare.d.ts.map +1 -0
  104. package/dist/deploy/cloudflare.js +169 -0
  105. package/dist/deploy/cloudflare.js.map +1 -0
  106. package/dist/license/hito4_client.d.ts +17 -1
  107. package/dist/license/hito4_client.d.ts.map +1 -1
  108. package/dist/license/hito4_client.js +71 -10
  109. package/dist/license/hito4_client.js.map +1 -1
  110. package/dist/license/index.d.ts.map +1 -1
  111. package/dist/license/index.js +7 -0
  112. package/dist/license/index.js.map +1 -1
  113. package/dist/license/sync.d.ts +54 -0
  114. package/dist/license/sync.d.ts.map +1 -0
  115. package/dist/license/sync.js +131 -0
  116. package/dist/license/sync.js.map +1 -0
  117. package/dist/telemetry/usage.d.ts +67 -0
  118. package/dist/telemetry/usage.d.ts.map +1 -0
  119. package/dist/telemetry/usage.js +208 -0
  120. package/dist/telemetry/usage.js.map +1 -0
  121. package/dist/version.d.ts +1 -1
  122. package/dist/version.d.ts.map +1 -1
  123. package/dist/version.js +1 -1
  124. package/dist/version.js.map +1 -1
  125. package/dist/voice/intents.d.ts +1 -1
  126. package/dist/voice/intents.js +0 -0
  127. package/dist/voice/providers/google.d.ts.map +1 -1
  128. package/dist/voice/providers/google.js +157 -27
  129. package/dist/voice/providers/google.js.map +1 -1
  130. package/dist/voice/router.d.ts +10 -0
  131. package/dist/voice/router.d.ts.map +1 -1
  132. package/dist/voice/router.js +39 -20
  133. package/dist/voice/router.js.map +1 -1
  134. package/dist/voice/types.d.ts +5 -2
  135. package/dist/voice/types.d.ts.map +1 -1
  136. package/dist/voice/types.js.map +1 -1
  137. package/dist/workflow/state.d.ts +190 -0
  138. package/dist/workflow/state.d.ts.map +1 -0
  139. package/dist/workflow/state.js +119 -0
  140. package/dist/workflow/state.js.map +1 -0
  141. package/package.json +13 -15
  142. package/templates/nextjs-app/README.md +48 -0
  143. package/templates/nextjs-app/next.config.js +8 -0
  144. package/templates/nextjs-app/package.json +33 -0
  145. package/templates/nextjs-app/src/app/globals.css +43 -0
  146. package/templates/nextjs-app/src/app/layout.tsx +29 -0
  147. package/templates/nextjs-app/src/app/page.tsx +63 -0
  148. package/templates/nextjs-app/src/nac/manifest.ts +36 -0
  149. package/templates/nextjs-app/tsconfig.json +21 -0
  150. package/templates/nextjs-app/yujin.forge.json +11 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Deploy adapter abstraction.
3
+ *
4
+ * Forge supports multiple cloud targets. Each one is encapsulated
5
+ * as a DeployAdapter implementation. The tier-aware selector
6
+ * picks the right adapter for a project based on:
7
+ *
8
+ * - workflow.tier (Simple / Medium / Full)
9
+ * - workflow.clarification.nfr_quantitative.volume
10
+ * - workflow.clarification.nfr_quantitative.parallelism
11
+ * - workflow.clarification.nfr_structural.persistence
12
+ * - workflow.clarification.nfr_structural.workers
13
+ *
14
+ * Rules of thumb (codified in pickDeployAdapter):
15
+ * - Simple tier + no queue + no workers -> Cloudflare Pages/Workers
16
+ * - Medium tier OR has queue OR has workers -> Cloudflare Pages + R2 + Queues
17
+ * - Full tier OR persistent stateful workers OR custom infra -> AWS ECS Fargate
18
+ *
19
+ * The user can override via `yf operate deploy-guided --adapter <id>`.
20
+ *
21
+ * Adapter contract:
22
+ * - id: short slug ("cloudflare" | "aws" | "vercel" | ...).
23
+ * - description: one-liner for the picker UX.
24
+ * - tierFit(): which tiers this adapter is appropriate for.
25
+ * - readyToRun(): credentials check (e.g. wrangler logged in).
26
+ * - plan(input): dry-run -> { resources, estimated_cost_usd }.
27
+ * - apply(input): real deploy -> { url, logs, deployed_at }.
28
+ *
29
+ * For alpha.19 only `cloudflare` is wired end-to-end. `aws` keeps
30
+ * the existing imperative path; the adapter is a thin shell over
31
+ * it. `vercel` is a stub for future.
32
+ *
33
+ * ASCII-only.
34
+ */
35
+ import type { WorkflowState } from '../workflow/state.js';
36
+ export type DeployAdapterId = 'cloudflare' | 'aws' | 'vercel';
37
+ export type Tier = 'simple' | 'medium' | 'full';
38
+ export interface DeployPlan {
39
+ resources: string[];
40
+ estimated_cost_usd: number;
41
+ estimated_minutes: number;
42
+ notes: string[];
43
+ }
44
+ export interface DeployResult {
45
+ url: string;
46
+ deployed_at: string;
47
+ build_seconds: number;
48
+ logs_tail: string[];
49
+ }
50
+ export interface DeployInput {
51
+ /** Absolute path to the build output (dist/ or .next/ or similar). */
52
+ buildDir: string;
53
+ /** Project slug (Cloudflare project name / AWS service name). */
54
+ projectSlug: string;
55
+ /** Optional env vars to expose. */
56
+ env?: Record<string, string>;
57
+ /** Tenant / user handle for multi-tenant adapters. */
58
+ userHandle?: string;
59
+ }
60
+ export interface DeployAdapter {
61
+ id: DeployAdapterId;
62
+ description: string;
63
+ tierFit(): Tier[];
64
+ /** Cheap check -- does the local env have what this adapter
65
+ * needs (credentials, CLI tools)? Returns ok + reason. */
66
+ readyToRun(): Promise<{
67
+ ok: boolean;
68
+ reason?: string;
69
+ }>;
70
+ /** Dry-run plan: lists resources + cost estimate. No network
71
+ * writes beyond auth pings. */
72
+ plan(input: DeployInput): Promise<DeployPlan>;
73
+ /** Real deploy. Should be idempotent: re-running with the same
74
+ * input updates an existing deployment rather than creating
75
+ * a duplicate. */
76
+ apply(input: DeployInput): Promise<DeployResult>;
77
+ }
78
+ export interface AdapterSelection {
79
+ adapter: DeployAdapterId;
80
+ reason: string;
81
+ alternatives: DeployAdapterId[];
82
+ }
83
+ /**
84
+ * Pick the right adapter for a workflow snapshot.
85
+ *
86
+ * Conservative heuristic: bias toward Cloudflare for simple +
87
+ * medium projects (cheap + fast + edge), AWS for heavy or
88
+ * stateful workloads. Adapters that fail readyToRun() are not
89
+ * filtered out here -- the caller is expected to surface the
90
+ * "not ready" message after the pick + offer a fallback.
91
+ */
92
+ export declare function pickDeployAdapter(wf: Partial<WorkflowState>, override?: DeployAdapterId): AdapterSelection;
93
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/deploy/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE9D,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAY,MAAM,EAAE,CAAC;IAC9B,kBAAkB,EAAG,MAAM,CAAC;IAC5B,iBAAiB,EAAI,MAAM,CAAC;IAC5B,KAAK,EAAgB,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAY,MAAM,CAAC;IACtB,WAAW,EAAI,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAM,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,QAAQ,EAAK,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,GAAG,CAAC,EAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAW,eAAe,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,IAAM,IAAI,EAAE,CAAC;IACpB;+DAC2D;IAC3D,UAAU,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD;oCACgC;IAChC,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C;;uBAEmB;IACnB,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAClD;AAMD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAK,eAAe,CAAC;IAC5B,MAAM,EAAM,MAAM,CAAC;IACnB,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC;AAcD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,OAAO,CAAC,aAAa,CAAC,EAC1B,QAAQ,CAAC,EAAE,eAAe,GACzB,gBAAgB,CAmClB"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Pick the right adapter for a workflow snapshot.
3
+ *
4
+ * Conservative heuristic: bias toward Cloudflare for simple +
5
+ * medium projects (cheap + fast + edge), AWS for heavy or
6
+ * stateful workloads. Adapters that fail readyToRun() are not
7
+ * filtered out here -- the caller is expected to surface the
8
+ * "not ready" message after the pick + offer a fallback.
9
+ */
10
+ export function pickDeployAdapter(wf, override) {
11
+ if (override) {
12
+ return {
13
+ adapter: override,
14
+ reason: 'explicit override',
15
+ alternatives: ['cloudflare', 'aws', 'vercel']
16
+ .filter((a) => a !== override),
17
+ };
18
+ }
19
+ const tier = (wf.tier ?? 'simple');
20
+ const nfrS = (wf.clarification?.nfr_structural ?? {});
21
+ const nfrQ = (wf.clarification?.nfr_quantitative ?? {});
22
+ /* Hard signals that push to AWS. */
23
+ const persistentWorkers = nfrS.workers === true
24
+ || (typeof nfrS.persistence === 'string' && /postgres|mysql|mssql/.test(nfrS.persistence));
25
+ const heavyParallelism = typeof nfrQ.parallelism === 'string'
26
+ && /high|heavy|many/i.test(nfrQ.parallelism);
27
+ if (tier === 'full' || persistentWorkers || heavyParallelism) {
28
+ return {
29
+ adapter: 'aws',
30
+ reason: 'tier=' + tier + (persistentWorkers ? '; persistent workers' : '')
31
+ + (heavyParallelism ? '; heavy parallelism' : ''),
32
+ alternatives: ['cloudflare', 'vercel'],
33
+ };
34
+ }
35
+ /* Simple + medium default to Cloudflare. */
36
+ return {
37
+ adapter: 'cloudflare',
38
+ reason: 'tier=' + tier + ' (cheap edge + fast deploys)',
39
+ alternatives: ['vercel', 'aws'],
40
+ };
41
+ }
42
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/deploy/adapter.ts"],"names":[],"mappings":"AAuGA;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAA0B,EAC1B,QAA0B;IAE1B,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,mBAAmB;YAC3B,YAAY,EAAG,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAuB;iBACjE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC;SACjC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,QAAQ,CAAS,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,IAAI,EAAE,CAAsB,CAAC;IAC3E,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,gBAAgB,IAAI,EAAE,CAAwB,CAAC;IAE/E,oCAAoC;IACpC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI;WAC1C,CAAC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7F,MAAM,gBAAgB,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;WACxD,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE/C,IAAI,IAAI,KAAK,MAAM,IAAI,iBAAiB,IAAI,gBAAgB,EAAE,CAAC;QAC7D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;kBACtE,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,YAAY,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,8BAA8B;QACvD,YAAY,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;KAChC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * AWS ECS Fargate adapter.
3
+ *
4
+ * Thin DeployAdapter shell over the existing imperative
5
+ * `src/deploy/aws.ts` (planDeploy + applyDeploy). The original
6
+ * code stays the source of truth; this file gives it the
7
+ * DeployAdapter interface so the tier-aware picker can compare
8
+ * adapters apples-to-apples.
9
+ *
10
+ * Heavy / persistent / stateful workloads go here. Free tier
11
+ * does NOT cover Fargate -- expect ~$0.04/hour per task even at
12
+ * idle. Cost estimates below assume 1 task in always-on mode.
13
+ *
14
+ * ASCII-only.
15
+ */
16
+ import type { DeployAdapter, DeployInput, DeployPlan, DeployResult, Tier } from './adapter.js';
17
+ export declare class AwsEcsAdapter implements DeployAdapter {
18
+ readonly id: "aws";
19
+ readonly description: string;
20
+ tierFit(): Tier[];
21
+ readyToRun(): Promise<{
22
+ ok: boolean;
23
+ reason?: string;
24
+ }>;
25
+ plan(input: DeployInput): Promise<DeployPlan>;
26
+ apply(_input: DeployInput): Promise<DeployResult>;
27
+ }
28
+ //# sourceMappingURL=aws_adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws_adapter.d.ts","sourceRoot":"","sources":["../../src/deploy/aws_adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EACV,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAC3D,MAAM,cAAc,CAAC;AAEtB,qBAAa,aAAc,YAAW,aAAa;IACjD,QAAQ,CAAC,EAAE,EAAG,KAAK,CAAU;IAC7B,QAAQ,CAAC,WAAW,SAEqC;IAEzD,OAAO,IAAI,IAAI,EAAE;IAEX,UAAU,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBvD,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAuB7C,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAiBxD"}
@@ -0,0 +1,65 @@
1
+ export class AwsEcsAdapter {
2
+ id = 'aws';
3
+ description = 'AWS ECS Fargate -- always-on container, persistent state, custom networking. '
4
+ + 'For full-tier projects with workers / queues / DB.';
5
+ tierFit() { return ['medium', 'full']; }
6
+ async readyToRun() {
7
+ /* Delegate to the AWS SDK's credential chain -- importing
8
+ * the existing aws.ts function would trigger a heavy SDK
9
+ * load even for cheap "plan" calls. We do a light check via
10
+ * env vars + ~/.aws/credentials presence. */
11
+ const hasEnv = !!(process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY);
12
+ if (hasEnv)
13
+ return { ok: true };
14
+ /* Without env, fall back to checking ~/.aws/credentials. */
15
+ const fs = await import('node:fs');
16
+ const path = await import('node:path');
17
+ const os = await import('node:os');
18
+ const credPath = path.join(os.homedir(), '.aws', 'credentials');
19
+ try {
20
+ await fs.promises.access(credPath);
21
+ return { ok: true };
22
+ }
23
+ catch {
24
+ return { ok: false, reason: 'no AWS_ACCESS_KEY_ID env and no ~/.aws/credentials' };
25
+ }
26
+ }
27
+ async plan(input) {
28
+ return {
29
+ resources: [
30
+ 'ECS cluster: ' + input.projectSlug + '-cluster',
31
+ 'ECS service: ' + input.projectSlug + '-service (Fargate)',
32
+ 'CloudWatch log group: /yujin/' + input.projectSlug,
33
+ 'IAM role: ' + input.projectSlug + '-task-role',
34
+ ...(input.env ? ['Secrets: ' + Object.keys(input.env).join(', ')] : []),
35
+ ],
36
+ /* 1 Fargate task, 0.25 vCPU + 0.5GB RAM, on 24/7:
37
+ * ~$8.50/mo compute + ~$0.50 CloudWatch + ~$0.50 ECR =
38
+ * ~$10/mo. */
39
+ estimated_cost_usd: 10,
40
+ estimated_minutes: 10,
41
+ notes: [
42
+ 'Fargate baseline ~$0.04/hour per always-on task.',
43
+ 'Includes CloudWatch logs ($0.50/GB ingested) + ECR ($0.10/GB-month).',
44
+ 'Custom domain + ACM cert + Route53 zone are NOT included; configure once via console.',
45
+ 'First-time deploy provisions IAM + cluster + service (~10 min); subsequent deploys ~3 min rolling update.',
46
+ ],
47
+ };
48
+ }
49
+ async apply(_input) {
50
+ /* For alpha.19 we deliberately do NOT call the imperative
51
+ * applyDeploy() from src/deploy/aws.ts -- that function has
52
+ * a different input shape + uses prompts for missing config.
53
+ * The proper migration is a follow-up: refactor aws.ts to
54
+ * accept DeployInput + return DeployResult, then route the
55
+ * `yf deploy aws` command through this adapter.
56
+ *
57
+ * Today, calling AwsEcsAdapter.apply throws so callers see
58
+ * the unfinished migration. The plan() path above is fully
59
+ * functional + used by the tier-aware selector. */
60
+ throw new Error('AwsEcsAdapter.apply is not wired yet in alpha.19. '
61
+ + 'Use `yf deploy aws` (imperative path) for now. '
62
+ + 'The DeployAdapter migration completes in a follow-up.');
63
+ }
64
+ }
65
+ //# sourceMappingURL=aws_adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws_adapter.js","sourceRoot":"","sources":["../../src/deploy/aws_adapter.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAO,aAAa;IACf,EAAE,GAAG,KAAc,CAAC;IACpB,WAAW,GAClB,+EAA+E;UAC7E,oDAAoD,CAAC;IAEzD,OAAO,KAAa,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAEhD,KAAK,CAAC,UAAU;QACd;;;qDAG6C;QAC7C,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACtF,IAAI,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAChC,4DAA4D;QAC5D,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QAChE,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAAC,CAAC;QAChE,MAAM,CAAC;YAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oDAAoD,EAAE,CAAC;QAAC,CAAC;IAC/F,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAkB;QAC3B,OAAO;YACL,SAAS,EAAE;gBACT,eAAe,GAAG,KAAK,CAAC,WAAW,GAAG,UAAU;gBAChD,eAAe,GAAG,KAAK,CAAC,WAAW,GAAG,oBAAoB;gBAC1D,+BAA+B,GAAG,KAAK,CAAC,WAAW;gBACnD,YAAY,GAAG,KAAK,CAAC,WAAW,GAAG,YAAY;gBAC/C,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACxE;YACD;;0BAEc;YACd,kBAAkB,EAAE,EAAE;YACtB,iBAAiB,EAAG,EAAE;YACtB,KAAK,EAAE;gBACL,kDAAkD;gBAClD,sEAAsE;gBACtE,uFAAuF;gBACvF,2GAA2G;aAC5G;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAmB;QAC7B;;;;;;;;;2DASmD;QACnD,MAAM,IAAI,KAAK,CACb,oDAAoD;cAClD,iDAAiD;cACjD,uDAAuD,CAC1D,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { DeployAdapter, DeployInput, DeployPlan, DeployResult, Tier } from './adapter.js';
2
+ export interface CloudflareAdapterOptions {
3
+ /** Override the wrangler binary path (defaults to "wrangler"). */
4
+ wranglerBin?: string;
5
+ /** Override the wrangler config dir (for tests). */
6
+ configDir?: string;
7
+ }
8
+ export declare class CloudflareAdapter implements DeployAdapter {
9
+ private opts;
10
+ readonly id: "cloudflare";
11
+ readonly description: string;
12
+ constructor(opts?: CloudflareAdapterOptions);
13
+ tierFit(): Tier[];
14
+ readyToRun(): Promise<{
15
+ ok: boolean;
16
+ reason?: string;
17
+ }>;
18
+ plan(input: DeployInput): Promise<DeployPlan>;
19
+ apply(input: DeployInput): Promise<DeployResult>;
20
+ private runWrangler;
21
+ private dirExists;
22
+ private countFiles;
23
+ }
24
+ //# sourceMappingURL=cloudflare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/deploy/cloudflare.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE/F,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,SAAS,CAAC,EAAI,MAAM,CAAC;CACtB;AAED,qBAAa,iBAAkB,YAAW,aAAa;IAMzC,OAAO,CAAC,IAAI;IALxB,QAAQ,CAAC,EAAE,EAAG,YAAY,CAAU;IACpC,QAAQ,CAAC,WAAW,SAE8C;gBAE9C,IAAI,GAAE,wBAA6B;IAEvD,OAAO,IAAI,IAAI,EAAE;IAEX,UAAU,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA8BvD,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA2B7C,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;YA2BxC,WAAW;YAiBX,SAAS;YAOT,UAAU;CAezB"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Cloudflare Pages adapter (default for Simple + Medium projects).
3
+ *
4
+ * Implementation strategy: shell out to `wrangler pages deploy`.
5
+ * Wrangler handles authentication (oauth token at
6
+ * ~/.config/.wrangler/config/default.toml) + the project upload.
7
+ * We invoke + parse its output.
8
+ *
9
+ * Why Cloudflare for default:
10
+ * - Free tier covers 5M req/day -- 12+ months runway for new
11
+ * projects.
12
+ * - 20-40s typical deploy time.
13
+ * - Edge-deployed across 250+ POPs by default; no CDN setup.
14
+ * - DNS + ACM cert auto-managed under *.pages.dev.
15
+ * - Pablo's account is already wrangler-authed.
16
+ *
17
+ * What this adapter does NOT do today:
18
+ * - Custom domains (requires zone owned by the user's CF account).
19
+ * - Server-side workers (would need a separate `wrangler deploy`
20
+ * for the Worker bundle; the Pages adapter is static-only).
21
+ * - Environment variable updates (the user has to set those
22
+ * manually for now via the CF dashboard or `wrangler pages
23
+ * project create --variable`).
24
+ *
25
+ * ASCII-only.
26
+ */
27
+ import { spawn } from 'node:child_process';
28
+ import { promises as fs } from 'node:fs';
29
+ import path from 'node:path';
30
+ export class CloudflareAdapter {
31
+ opts;
32
+ id = 'cloudflare';
33
+ description = 'Cloudflare Pages + Workers -- free tier, edge-deployed, 20-40s deploys. '
34
+ + 'Best for simple + medium projects without persistent state.';
35
+ constructor(opts = {}) {
36
+ this.opts = opts;
37
+ }
38
+ tierFit() { return ['simple', 'medium']; }
39
+ async readyToRun() {
40
+ const wranglerBin = this.opts.wranglerBin ?? 'wrangler';
41
+ /* Check that wrangler is on PATH + has an OAuth/API token
42
+ * available. We rely on `wrangler whoami` to do this for us
43
+ * -- exit code 0 means authed. */
44
+ return new Promise((resolve) => {
45
+ let stdout = '';
46
+ let stderr = '';
47
+ const ps = spawn(wranglerBin, ['whoami'], { shell: true });
48
+ ps.stdout.on('data', (d) => { stdout += d.toString(); });
49
+ ps.stderr.on('data', (d) => { stderr += d.toString(); });
50
+ ps.on('error', (err) => {
51
+ resolve({ ok: false, reason: 'wrangler not runnable: ' + err.message });
52
+ });
53
+ ps.on('close', (code) => {
54
+ if (code !== 0) {
55
+ resolve({
56
+ ok: false,
57
+ reason: 'wrangler whoami exit ' + code + '. Run `wrangler login` first. stderr: '
58
+ + stderr.slice(0, 200),
59
+ });
60
+ }
61
+ else if (/not authenticated|no.*token/i.test(stdout)) {
62
+ resolve({ ok: false, reason: 'wrangler not authenticated. Run `wrangler login`.' });
63
+ }
64
+ else {
65
+ resolve({ ok: true });
66
+ }
67
+ });
68
+ });
69
+ }
70
+ async plan(input) {
71
+ const exists = await this.dirExists(input.buildDir);
72
+ if (!exists) {
73
+ throw new Error('cloudflare.plan: buildDir does not exist: ' + input.buildDir);
74
+ }
75
+ const fileCount = await this.countFiles(input.buildDir);
76
+ return {
77
+ resources: [
78
+ 'Cloudflare Pages project: ' + input.projectSlug,
79
+ 'Static assets: ' + fileCount + ' files',
80
+ 'Edge-deployed at ' + input.projectSlug + '.pages.dev',
81
+ ...(input.env && Object.keys(input.env).length > 0
82
+ ? ['Env vars (set separately via wrangler pages project create): ' + Object.keys(input.env).join(', ')]
83
+ : []),
84
+ ],
85
+ /* Free tier covers 500 builds/month + 5M req/day. New
86
+ * projects expect $0/mo for ~12+ months. */
87
+ estimated_cost_usd: 0,
88
+ estimated_minutes: Math.max(1, Math.ceil(fileCount / 200)),
89
+ notes: [
90
+ 'Cloudflare Pages free tier covers 500 builds/month + 5M requests/day.',
91
+ 'Above the free tier, Pages overage = $5/1M requests; build minutes overage = $0.005/min.',
92
+ 'Workers (if added) free 100k req/day; $0.30 per million above.',
93
+ ],
94
+ };
95
+ }
96
+ async apply(input) {
97
+ const exists = await this.dirExists(input.buildDir);
98
+ if (!exists) {
99
+ throw new Error('cloudflare.apply: buildDir does not exist: ' + input.buildDir);
100
+ }
101
+ const wranglerBin = this.opts.wranglerBin ?? 'wrangler';
102
+ const args = ['pages', 'deploy', input.buildDir,
103
+ '--project-name', input.projectSlug,
104
+ '--branch', 'main'];
105
+ const t0 = Date.now();
106
+ const out = await this.runWrangler(wranglerBin, args);
107
+ const seconds = Math.round((Date.now() - t0) / 1000);
108
+ /* Parse the URL out of wrangler's output. */
109
+ const urlMatch = out.combined.match(/https:\/\/[a-z0-9-]+\.[a-z0-9-]+\.pages\.dev/i);
110
+ if (!urlMatch) {
111
+ throw new Error('cloudflare.apply: could not parse deploy URL from wrangler output. '
112
+ + 'Tail: ' + out.combined.slice(-500));
113
+ }
114
+ return {
115
+ url: urlMatch[0],
116
+ deployed_at: new Date().toISOString(),
117
+ build_seconds: seconds,
118
+ logs_tail: out.combined.split('\n').slice(-20),
119
+ };
120
+ }
121
+ async runWrangler(bin, args) {
122
+ return new Promise((resolve, reject) => {
123
+ let combined = '';
124
+ const ps = spawn(bin, args, { shell: true });
125
+ ps.stdout.on('data', (d) => { combined += d.toString(); });
126
+ ps.stderr.on('data', (d) => { combined += d.toString(); });
127
+ ps.on('error', (err) => reject(new Error('wrangler spawn failed: ' + err.message)));
128
+ ps.on('close', (code) => {
129
+ if (code !== 0) {
130
+ reject(new Error('wrangler exit ' + code + '. Tail: ' + combined.slice(-500)));
131
+ return;
132
+ }
133
+ resolve({ exit: code ?? 0, combined });
134
+ });
135
+ });
136
+ }
137
+ async dirExists(p) {
138
+ try {
139
+ const st = await fs.stat(p);
140
+ return st.isDirectory();
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ async countFiles(p) {
147
+ let count = 0;
148
+ const walk = async (dir) => {
149
+ let entries;
150
+ try {
151
+ entries = await fs.readdir(dir, { withFileTypes: true });
152
+ }
153
+ catch {
154
+ return;
155
+ }
156
+ for (const e of entries) {
157
+ if (e.name === 'node_modules' || e.name.startsWith('.'))
158
+ continue;
159
+ if (e.isDirectory())
160
+ await walk(path.join(dir, e.name));
161
+ else if (e.isFile())
162
+ count++;
163
+ }
164
+ };
165
+ await walk(p);
166
+ return count;
167
+ }
168
+ }
169
+ //# sourceMappingURL=cloudflare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/deploy/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,MAAM,OAAO,iBAAiB;IAMR;IALX,EAAE,GAAG,YAAqB,CAAC;IAC3B,WAAW,GAClB,0EAA0E;UACxE,6DAA6D,CAAC;IAElE,YAAoB,OAAiC,EAAE;QAAnC,SAAI,GAAJ,IAAI,CAA+B;IAAG,CAAC;IAE3D,OAAO,KAAa,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAElD,KAAK,CAAC,UAAU;QACd,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC;QACxD;;0CAEkC;QAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACtB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC;wBACN,EAAE,EAAE,KAAK;wBACT,MAAM,EAAE,uBAAuB,GAAG,IAAI,GAAG,wCAAwC;8BAC7E,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;qBACzB,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvD,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mDAAmD,EAAE,CAAC,CAAC;gBACtF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAkB;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4CAA4C,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxD,OAAO;YACL,SAAS,EAAE;gBACT,4BAA4B,GAAG,KAAK,CAAC,WAAW;gBAChD,iBAAiB,GAAG,SAAS,GAAG,QAAQ;gBACxC,mBAAmB,GAAG,KAAK,CAAC,WAAW,GAAG,YAAY;gBACtD,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;oBAChD,CAAC,CAAC,CAAC,+DAA+D,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvG,CAAC,CAAC,EAAE,CAAC;aACR;YACD;wDAC4C;YAC5C,kBAAkB,EAAE,CAAC;YACrB,iBAAiB,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;YAC3D,KAAK,EAAE;gBACL,uEAAuE;gBACvE,0FAA0F;gBAC1F,gEAAgE;aACjE;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAkB;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC;QACxD,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACjC,gBAAgB,EAAE,KAAK,CAAC,WAAW;YACnC,UAAU,EAAE,MAAM,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAErD,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,qEAAqE;kBACjF,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO;YACL,GAAG,EAAY,QAAQ,CAAC,CAAC,CAAC;YAC1B,WAAW,EAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACvC,aAAa,EAAE,OAAO;YACtB,SAAS,EAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,IAAc;QACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACpF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACtB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,GAAG,IAAI,GAAG,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC/E,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,CAAS;QAC/B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,CAAS;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,IAAI,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;YAChD,IAAI,OAAmC,CAAC;YACxC,IAAI,CAAC;gBAAC,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC;YACjE,MAAM,CAAC;gBAAC,OAAO;YAAC,CAAC;YACjB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAClE,IAAI,CAAC,CAAC,WAAW,EAAE;oBAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;qBACnD,IAAI,CAAC,CAAC,MAAM,EAAE;oBAAE,KAAK,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC;QACF,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -1,5 +1,15 @@
1
1
  import { Vault } from '../vault/store.js';
2
+ import type { BrainProvider } from '../core/keys_envelope.js';
2
3
  export declare const HITO4_BASE_URL: string;
4
+ interface ResolvedBrain {
5
+ provider: BrainProvider | null;
6
+ apiKey: string | null;
7
+ modelAlias: string | null;
8
+ }
9
+ /** Resolve which brain provider + key + model alias to use for
10
+ * the current request. Mirrors the mobile-side logic that
11
+ * reads from the encrypted keys-sync cache. */
12
+ export declare function resolveBrainHeaders(): Promise<ResolvedBrain>;
3
13
  export interface Hito4ClientDeps {
4
14
  fetchImpl?: typeof fetch;
5
15
  vaultOpener?: () => Promise<Vault>;
@@ -16,9 +26,15 @@ export interface FlowCallResult {
16
26
  body: Record<string, unknown>;
17
27
  }
18
28
  /** Call a HITO 4 flow. Returns the raw server response (no
19
- * retry / no backoff -- callers can decide). */
29
+ * retry / no backoff -- callers can decide).
30
+ *
31
+ * Brain providers are BYOK: this call reads the local
32
+ * ~/.yujin-forge/provider_keys.json, picks the preferred
33
+ * provider + key + model, and forwards them as headers. The
34
+ * worker never persists nor logs the key. */
20
35
  export declare function callFlow(flow: string, input: unknown, deps?: Hito4ClientDeps): Promise<FlowCallResult>;
21
36
  /** Pull the up-to-date license row from the server. The CLI's
22
37
  * Polar cache is then refreshed with the result. */
23
38
  export declare function fetchServerLicense(deps?: Hito4ClientDeps): Promise<FlowCallResult>;
39
+ export {};
24
40
  //# sourceMappingURL=hito4_client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hito4_client.d.ts","sourceRoot":"","sources":["../../src/license/hito4_client.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI1C,eAAO,MAAM,cAAc,QAA8E,CAAC;AAG1G,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC;qDACiD;IACjD,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+BD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAE,MAAmB,GAAG,MAAM,CAG1F;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED;iDACiD;AACjD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,eAAoB,GACvD,OAAO,CAAC,cAAc,CAAC,CAmBzB;AAED;qDACqD;AACrD,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAc5F"}
1
+ {"version":3,"file":"hito4_client.d.ts","sourceRoot":"","sources":["../../src/license/hito4_client.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,OAAO,KAAK,EAAyB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAErF,eAAO,MAAM,cAAc,QAA8E,CAAC;AAiB1G,UAAU,aAAa;IACrB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;gDAEgD;AAChD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,aAAa,CAAC,CAelE;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC;qDACiD;IACjD,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+BD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAE,MAAmB,GAAG,MAAM,CAG1F;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED;;;;;;8CAM8C;AAC9C,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,eAAoB,GACvD,OAAO,CAAC,cAAc,CAAC,CAoBzB;AAED;qDACqD;AACrD,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAc5F"}
@@ -19,11 +19,63 @@
19
19
  * ASCII-only.
20
20
  */
21
21
  import { createHmac } from 'node:crypto';
22
+ import { promises as fs } from 'node:fs';
23
+ import path from 'node:path';
24
+ import os from 'node:os';
22
25
  import { Vault } from '../vault/store.js';
23
26
  import { configDir } from './index.js';
24
27
  import { readLicense } from '../core/polar.js';
25
28
  export const HITO4_BASE_URL = process.env.YF_HITO4_BASE_URL ?? 'https://yujin-hito4.yujinapp.workers.dev';
26
29
  const SECRET_SLOT = 'yf_server_api_key';
30
+ /** Read the local plaintext provider keys cache. The mobile
31
+ * equivalent is the `useProviderKeys` hook. Returns null if
32
+ * the file does not exist yet (user has not run keys setup). */
33
+ async function readLocalProviderKeys() {
34
+ const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
35
+ const p = path.join(home, '.yujin-forge', 'provider_keys.json');
36
+ try {
37
+ const raw = await fs.readFile(p, 'utf-8');
38
+ const parsed = JSON.parse(raw);
39
+ if (parsed && parsed.v === 1)
40
+ return parsed;
41
+ }
42
+ catch { /* missing */ }
43
+ return null;
44
+ }
45
+ /** Resolve which brain provider + key + model alias to use for
46
+ * the current request. Mirrors the mobile-side logic that
47
+ * reads from the encrypted keys-sync cache. */
48
+ export async function resolveBrainHeaders() {
49
+ const cache = await readLocalProviderKeys();
50
+ if (!cache)
51
+ return { provider: null, apiKey: null, modelAlias: null };
52
+ const provider = (cache.brain_provider_preference ?? null);
53
+ if (!provider)
54
+ return { provider: null, apiKey: null, modelAlias: null };
55
+ let apiKey;
56
+ let modelAlias;
57
+ if (provider === 'anthropic') {
58
+ apiKey = cache.anthropic_api_key;
59
+ modelAlias = cache.anthropic_model_preference;
60
+ }
61
+ else if (provider === 'openai') {
62
+ apiKey = cache.openai_api_key;
63
+ modelAlias = cache.openai_brain_model_preference;
64
+ }
65
+ else if (provider === 'google') {
66
+ apiKey = cache.google_ai_key;
67
+ modelAlias = cache.google_brain_model_preference;
68
+ }
69
+ else if (provider === 'deepseek') {
70
+ apiKey = cache.deepseek_api_key;
71
+ modelAlias = cache.deepseek_model_preference;
72
+ }
73
+ return {
74
+ provider,
75
+ apiKey: apiKey ?? null,
76
+ modelAlias: modelAlias ?? null,
77
+ };
78
+ }
27
79
  function hmacHex(secret, msg) {
28
80
  return createHmac('sha256', secret).update(msg).digest('hex');
29
81
  }
@@ -52,23 +104,32 @@ export function signBearer(secret, handle, ts = Date.now()) {
52
104
  return ts + '.' + sig;
53
105
  }
54
106
  /** Call a HITO 4 flow. Returns the raw server response (no
55
- * retry / no backoff -- callers can decide). */
107
+ * retry / no backoff -- callers can decide).
108
+ *
109
+ * Brain providers are BYOK: this call reads the local
110
+ * ~/.yujin-forge/provider_keys.json, picks the preferred
111
+ * provider + key + model, and forwards them as headers. The
112
+ * worker never persists nor logs the key. */
56
113
  export async function callFlow(flow, input, deps = {}) {
57
114
  const base = deps.baseUrl ?? HITO4_BASE_URL;
58
115
  const secret = await getSecret(deps);
59
116
  const handle = await getHandle(deps);
60
117
  const bearer = signBearer(secret, handle);
61
118
  const fetchImpl = deps.fetchImpl ?? ((u, init) => globalThis.fetch(u, init));
119
+ const brain = await resolveBrainHeaders();
62
120
  const url = base.replace(/\/+$/, '') + '/v1/flows/' + encodeURIComponent(flow);
63
- const r = await fetchImpl(url, {
64
- method: 'POST',
65
- headers: {
66
- 'Authorization': 'Bearer ' + bearer,
67
- 'x-yf-user-handle': handle,
68
- 'content-type': 'application/json',
69
- },
70
- body: JSON.stringify(input ?? null),
71
- });
121
+ const headers = {
122
+ 'Authorization': 'Bearer ' + bearer,
123
+ 'x-yf-user-handle': handle,
124
+ 'content-type': 'application/json',
125
+ };
126
+ if (brain.provider)
127
+ headers['x-yf-brain-provider'] = brain.provider;
128
+ if (brain.apiKey)
129
+ headers['x-yf-brain-key'] = brain.apiKey;
130
+ if (brain.modelAlias)
131
+ headers['x-yf-brain-model'] = brain.modelAlias;
132
+ const r = await fetchImpl(url, { method: 'POST', headers, body: JSON.stringify(input ?? null) });
72
133
  let body = {};
73
134
  try {
74
135
  body = await r.json();
@@ -1 +1 @@
1
- {"version":3,"file":"hito4_client.js","sourceRoot":"","sources":["../../src/license/hito4_client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hito4_client.js","sourceRoot":"","sources":["../../src/license/hito4_client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,YAAY,CAAC;AAIpB,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAoDD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC,CAwBzD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAEvD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAEzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,YAAY,CAAC;AAIpB,wBAAgB,SAAS,IAAI,MAAM,CAQlC;AAoDD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC,CAwBzD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAEvD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAEzD"}