@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
@@ -27,6 +27,13 @@ import { homedir } from 'node:os';
27
27
  import path from 'node:path';
28
28
  const TRIAL_DAYS = 30;
29
29
  export function configDir() {
30
+ /* YF_CONFIG_DIR overrides the default ~/.yujin-forge location.
31
+ * Used by tests (tests/fresh-user/*) to point at a clean
32
+ * temp dir without touching the developer's real config.
33
+ * Also useful for users who want a portable install. */
34
+ const override = process.env['YF_CONFIG_DIR'];
35
+ if (override && override.trim() !== '')
36
+ return override.trim();
30
37
  return path.join(homedir(), '.yujin-forge');
31
38
  }
32
39
  function trialPath() { return path.join(configDir(), 'trial.json'); }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/license/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * License sync -- pulls the canonical license row from the
3
+ * HITO 4 server and updates the local Polar cache.
4
+ *
5
+ * Flow:
6
+ * 1. Read local cache (~/.yujin-forge/license.json).
7
+ * Needs user_handle. If missing -> error pointing to
8
+ * `yf license activate --user-handle <email>`.
9
+ * 2. Call fetchServerLicense via the HMAC-signed Hito4 client.
10
+ * 3. Map the server response to a LicenseCache patch.
11
+ * 4. Merge + write back. Bumps last_validated_at to now.
12
+ * 5. Return a SyncReport for the CLI to print.
13
+ *
14
+ * Why this exists: the Polar webhook updates the SERVER-side D1
15
+ * row. The local cache was never wired to pull. The "activate"
16
+ * copy advertised "license.json updated automatically" -- it was
17
+ * not. This fixes that gap.
18
+ *
19
+ * ASCII-only.
20
+ */
21
+ import { type LicenseCache } from '../core/polar.js';
22
+ import { type Hito4ClientDeps } from './hito4_client.js';
23
+ export interface SyncReport {
24
+ ok: boolean;
25
+ /** Plan as known to the server. */
26
+ server_plan?: string;
27
+ /** Plan we had locally before sync. */
28
+ local_plan_before?: string;
29
+ /** Plan we now have locally. */
30
+ local_plan_after?: string;
31
+ /** HTTP status from the server call. */
32
+ http_status?: number;
33
+ /** Server validated_at timestamp. */
34
+ last_validated_at?: string;
35
+ /** Error string when ok=false. */
36
+ error?: string;
37
+ /** Verbose log lines (URLs called, headers redacted). Only
38
+ * populated when verbose=true. */
39
+ log?: string[];
40
+ }
41
+ export interface SyncOptions extends Hito4ClientDeps {
42
+ verbose?: boolean;
43
+ /** Override the source of the local cache (for tests). */
44
+ readLocal?: () => Promise<LicenseCache>;
45
+ /** Override the persist path (for tests). */
46
+ writeLocal?: (next: LicenseCache) => Promise<void>;
47
+ }
48
+ /** Map a server response body to the LicenseCache plan + fields.
49
+ * The server today returns the row in {plan, expires_at,
50
+ * subscription_id, customer_id, user_handle, cancel_grace_until,
51
+ * bills_first_on, trial_started_at, payment_method_attached}. */
52
+ export declare function serverBodyToPatch(body: Record<string, unknown>): Partial<LicenseCache> | null;
53
+ export declare function syncLicense(opts?: SyncOptions): Promise<SyncReport>;
54
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/license/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gCAAgC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;uCACmC;IACnC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,6CAA6C;IAC7C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED;;;kEAGkE;AAClE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAuB7F;AAED,wBAAsB,WAAW,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgF7E"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * License sync -- pulls the canonical license row from the
3
+ * HITO 4 server and updates the local Polar cache.
4
+ *
5
+ * Flow:
6
+ * 1. Read local cache (~/.yujin-forge/license.json).
7
+ * Needs user_handle. If missing -> error pointing to
8
+ * `yf license activate --user-handle <email>`.
9
+ * 2. Call fetchServerLicense via the HMAC-signed Hito4 client.
10
+ * 3. Map the server response to a LicenseCache patch.
11
+ * 4. Merge + write back. Bumps last_validated_at to now.
12
+ * 5. Return a SyncReport for the CLI to print.
13
+ *
14
+ * Why this exists: the Polar webhook updates the SERVER-side D1
15
+ * row. The local cache was never wired to pull. The "activate"
16
+ * copy advertised "license.json updated automatically" -- it was
17
+ * not. This fixes that gap.
18
+ *
19
+ * ASCII-only.
20
+ */
21
+ import { readLicense as readPolarLicense, writeLicense as writePolarLicense, } from '../core/polar.js';
22
+ import { fetchServerLicense } from './hito4_client.js';
23
+ /** Map a server response body to the LicenseCache plan + fields.
24
+ * The server today returns the row in {plan, expires_at,
25
+ * subscription_id, customer_id, user_handle, cancel_grace_until,
26
+ * bills_first_on, trial_started_at, payment_method_attached}. */
27
+ export function serverBodyToPatch(body) {
28
+ if (!body || typeof body !== 'object')
29
+ return null;
30
+ const planRaw = body.plan;
31
+ const validPlans = [
32
+ 'none', 'trial', 'paid', 'cancelled', 'free-public', 'institutional', 'gifted',
33
+ ];
34
+ if (typeof planRaw !== 'string' || !validPlans.includes(planRaw)) {
35
+ return null;
36
+ }
37
+ const patch = { plan: planRaw };
38
+ if (typeof body.subscription_id === 'string')
39
+ patch.subscription_id = body.subscription_id;
40
+ if (typeof body.user_handle === 'string')
41
+ patch.user_handle = body.user_handle.toLowerCase();
42
+ if (typeof body.cancel_grace_until === 'string')
43
+ patch.cancel_grace_until = body.cancel_grace_until;
44
+ if (typeof body.bills_first_on === 'string')
45
+ patch.bills_first_on = body.bills_first_on;
46
+ if (typeof body.trial_started_at === 'string')
47
+ patch.trial_started_at = body.trial_started_at;
48
+ if (body.expires_at === null || typeof body.expires_at === 'string') {
49
+ patch.expires_at = body.expires_at;
50
+ }
51
+ if (typeof body.payment_method_attached === 'boolean'
52
+ || typeof body.payment_method_attached === 'number') {
53
+ patch.payment_method_attached = Boolean(body.payment_method_attached);
54
+ }
55
+ return patch;
56
+ }
57
+ export async function syncLicense(opts = {}) {
58
+ const log = [];
59
+ const verbose = Boolean(opts.verbose);
60
+ const readLocal = opts.readLocal ?? readPolarLicense;
61
+ const writeLocal = opts.writeLocal ?? writePolarLicense;
62
+ const local = await readLocal();
63
+ if (verbose) {
64
+ log.push('[license-sync] local cache loaded plan=' + local.plan
65
+ + ' user_handle=' + (local.user_handle ?? '(none)'));
66
+ }
67
+ if (!local.user_handle) {
68
+ return {
69
+ ok: false,
70
+ error: 'no user_handle on local license cache. Run `yf license activate --user-handle <you@example.com>` first.',
71
+ local_plan_before: local.plan,
72
+ log: verbose ? log : undefined,
73
+ };
74
+ }
75
+ if (verbose)
76
+ log.push('[license-sync] calling Hito4 fetchServerLicense for ' + local.user_handle);
77
+ let resp;
78
+ try {
79
+ resp = await fetchServerLicense(opts);
80
+ }
81
+ catch (err) {
82
+ return {
83
+ ok: false,
84
+ error: err instanceof Error ? err.message : String(err),
85
+ local_plan_before: local.plan,
86
+ log: verbose ? log : undefined,
87
+ };
88
+ }
89
+ if (verbose) {
90
+ log.push('[license-sync] server HTTP ' + resp.status + ' ok=' + resp.ok);
91
+ }
92
+ if (!resp.ok) {
93
+ return {
94
+ ok: false,
95
+ error: typeof resp.body?.error === 'string' ? resp.body.error : 'server returned HTTP ' + resp.status,
96
+ http_status: resp.status,
97
+ server_plan: typeof resp.body?.plan === 'string' ? resp.body.plan : undefined,
98
+ local_plan_before: local.plan,
99
+ log: verbose ? log : undefined,
100
+ };
101
+ }
102
+ const patch = serverBodyToPatch(resp.body);
103
+ if (!patch) {
104
+ return {
105
+ ok: false,
106
+ error: 'server response body did not contain a valid plan field',
107
+ http_status: resp.status,
108
+ local_plan_before: local.plan,
109
+ log: verbose ? log : undefined,
110
+ };
111
+ }
112
+ const merged = {
113
+ ...local,
114
+ ...patch,
115
+ last_validated_at: new Date().toISOString(),
116
+ };
117
+ await writeLocal(merged);
118
+ if (verbose) {
119
+ log.push('[license-sync] local cache updated plan=' + local.plan + ' -> ' + merged.plan);
120
+ }
121
+ return {
122
+ ok: true,
123
+ server_plan: patch.plan,
124
+ local_plan_before: local.plan,
125
+ local_plan_after: merged.plan,
126
+ http_status: resp.status,
127
+ last_validated_at: merged.last_validated_at,
128
+ log: verbose ? log : undefined,
129
+ };
130
+ }
131
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/license/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ export type UsageKind = 'claude.chat' | 'claude.spec' | 'claude.clarify' | 'claude.triage' | 'voice.tts' | 'voice.stt' | 'misc';
2
+ export interface UsageEvent {
3
+ ts: string;
4
+ kind: UsageKind;
5
+ model?: string;
6
+ tokens_in?: number;
7
+ tokens_out?: number;
8
+ units?: number;
9
+ label?: string;
10
+ project_root?: string;
11
+ }
12
+ export interface PricingTable {
13
+ models?: Record<string, {
14
+ in_per_mtok: number;
15
+ out_per_mtok: number;
16
+ }>;
17
+ voice?: {
18
+ tts_per_million_chars?: number;
19
+ stt_per_minute?: number;
20
+ };
21
+ }
22
+ export declare const DEFAULT_PRICING: PricingTable;
23
+ /**
24
+ * Append a usage event. Never throws -- failures swallowed.
25
+ */
26
+ export declare function recordUsage(ev: Omit<UsageEvent, 'ts'> & {
27
+ ts?: string;
28
+ }): Promise<void>;
29
+ /**
30
+ * Load pricing table (defaults overlaid with user overrides).
31
+ */
32
+ export declare function loadPricing(): Promise<PricingTable>;
33
+ /**
34
+ * Read all usage events. Tolerates malformed lines.
35
+ */
36
+ export declare function readUsage(): Promise<UsageEvent[]>;
37
+ export interface CostBreakdown {
38
+ total_usd: number;
39
+ by_kind: Record<string, {
40
+ count: number;
41
+ usd: number;
42
+ }>;
43
+ by_model: Record<string, {
44
+ count: number;
45
+ tokens_in: number;
46
+ tokens_out: number;
47
+ usd: number;
48
+ }>;
49
+ by_day: Record<string, {
50
+ count: number;
51
+ usd: number;
52
+ }>;
53
+ events_total: number;
54
+ events_window: number;
55
+ window_label: string;
56
+ }
57
+ /**
58
+ * Compute cost breakdown over a time window. `sinceDays` defaults
59
+ * to 30. Pass 0 to mean "all-time".
60
+ */
61
+ export declare function computeCosts(sinceDays?: number): Promise<CostBreakdown>;
62
+ /**
63
+ * Pretty-format a CostBreakdown for terminal output. Returns
64
+ * lines; caller does the printing.
65
+ */
66
+ export declare function formatCosts(b: CostBreakdown): string[];
67
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"AAiCA,MAAM,MAAM,SAAS,GACjB,aAAa,GACb,aAAa,GACb,gBAAgB,GAChB,eAAe,GACf,WAAW,GACX,WAAW,GACX,MAAM,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,EAAE,EAAY,MAAM,CAAC;IACrB,IAAI,EAAU,SAAS,CAAC;IACxB,KAAK,CAAC,EAAQ,MAAM,CAAC;IACrB,SAAS,CAAC,EAAI,MAAM,CAAC;IACrB,UAAU,CAAC,EAAG,MAAM,CAAC;IACrB,KAAK,CAAC,EAAQ,MAAM,CAAC;IACrB,KAAK,CAAC,EAAQ,MAAM,CAAC;IACrB,YAAY,CAAC,EAAC,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,KAAK,CAAC,EAAG;QACP,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,cAAc,CAAC,EAAS,MAAM,CAAC;KAChC,CAAC;CACH;AAID,eAAO,MAAM,eAAe,EAAE,YAe7B,CAAC;AAaF;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7F;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC,CAWzD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAYvD;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAO,MAAM,CAAC;IACvB,OAAO,EAAS,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,QAAQ,EAAQ,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtG,MAAM,EAAU,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,YAAY,EAAI,MAAM,CAAC;IACvB,aAAa,EAAG,MAAM,CAAC;IACvB,YAAY,EAAI,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,SAAS,SAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAsDzE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,EAAE,CAiCtD"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Yujin Forge -- usage + cost telemetry.
3
+ *
4
+ * Append-only event log at ~/.yujin-forge/usage.jsonl. Every
5
+ * Claude API call (or other priced operation) records one JSONL
6
+ * line with { ts, kind, model?, tokens_in?, tokens_out?, units?,
7
+ * label?, project_root? }.
8
+ *
9
+ * The reader (`yf operate costs`) aggregates by day + by kind +
10
+ * by model and applies a pricing table to produce a cost report.
11
+ *
12
+ * Append is best-effort: telemetry failures NEVER throw to the
13
+ * caller -- a broken usage file should not break user work.
14
+ *
15
+ * Pricing is hard-coded for the 2026 model lineup. Users can
16
+ * override via ~/.yujin-forge/pricing.json:
17
+ * {
18
+ * "models": {
19
+ * "claude-opus-4-7": { "in_per_mtok": 15, "out_per_mtok": 75 },
20
+ * "claude-sonnet-4-6": { "in_per_mtok": 3, "out_per_mtok": 15 }
21
+ * },
22
+ * "voice": {
23
+ * "tts_per_million_chars": 16,
24
+ * "stt_per_minute": 0.006
25
+ * }
26
+ * }
27
+ *
28
+ * ASCII-only.
29
+ */
30
+ import { promises as fs } from 'node:fs';
31
+ import path from 'node:path';
32
+ import { configDir } from '../license/index.js';
33
+ /* Defaults reflect early-2026 Anthropic + Google Cloud pricing.
34
+ * Users can override via ~/.yujin-forge/pricing.json. */
35
+ export const DEFAULT_PRICING = {
36
+ models: {
37
+ 'claude-opus-4-7': { in_per_mtok: 15, out_per_mtok: 75 },
38
+ 'claude-opus-4': { in_per_mtok: 15, out_per_mtok: 75 },
39
+ 'claude-sonnet-4-6': { in_per_mtok: 3, out_per_mtok: 15 },
40
+ 'claude-sonnet-4': { in_per_mtok: 3, out_per_mtok: 15 },
41
+ 'claude-haiku-4-5': { in_per_mtok: 1, out_per_mtok: 5 },
42
+ /* Older lineup kept for back-compat. */
43
+ 'claude-3-5-sonnet': { in_per_mtok: 3, out_per_mtok: 15 },
44
+ 'claude-3-5-haiku': { in_per_mtok: 0.8, out_per_mtok: 4 },
45
+ },
46
+ voice: {
47
+ tts_per_million_chars: 16, /* Google Cloud TTS Neural2 */
48
+ stt_per_minute: 0.006, /* Google Cloud STT enhanced */
49
+ },
50
+ };
51
+ function usageFile() {
52
+ return path.join(configDir(), 'usage.jsonl');
53
+ }
54
+ function pricingFile() {
55
+ return path.join(configDir(), 'pricing.json');
56
+ }
57
+ async function ensureDir() {
58
+ try {
59
+ await fs.mkdir(configDir(), { recursive: true });
60
+ }
61
+ catch { /* best effort */ }
62
+ }
63
+ /**
64
+ * Append a usage event. Never throws -- failures swallowed.
65
+ */
66
+ export async function recordUsage(ev) {
67
+ try {
68
+ await ensureDir();
69
+ const line = { ts: ev.ts ?? new Date().toISOString(), ...ev };
70
+ await fs.appendFile(usageFile(), JSON.stringify(line) + '\n', 'utf-8');
71
+ }
72
+ catch {
73
+ /* swallow -- telemetry must never break user flow */
74
+ }
75
+ }
76
+ /**
77
+ * Load pricing table (defaults overlaid with user overrides).
78
+ */
79
+ export async function loadPricing() {
80
+ try {
81
+ const raw = await fs.readFile(pricingFile(), 'utf-8');
82
+ const override = JSON.parse(raw);
83
+ return {
84
+ models: { ...(DEFAULT_PRICING.models ?? {}), ...(override.models ?? {}) },
85
+ voice: { ...(DEFAULT_PRICING.voice ?? {}), ...(override.voice ?? {}) },
86
+ };
87
+ }
88
+ catch {
89
+ return DEFAULT_PRICING;
90
+ }
91
+ }
92
+ /**
93
+ * Read all usage events. Tolerates malformed lines.
94
+ */
95
+ export async function readUsage() {
96
+ try {
97
+ const raw = await fs.readFile(usageFile(), 'utf-8');
98
+ return raw.split('\n')
99
+ .filter((l) => l.trim().length > 0)
100
+ .map((l) => {
101
+ try {
102
+ return JSON.parse(l);
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ })
108
+ .filter((x) => x !== null);
109
+ }
110
+ catch {
111
+ return [];
112
+ }
113
+ }
114
+ /**
115
+ * Compute cost breakdown over a time window. `sinceDays` defaults
116
+ * to 30. Pass 0 to mean "all-time".
117
+ */
118
+ export async function computeCosts(sinceDays = 30) {
119
+ const events = await readUsage();
120
+ const pricing = await loadPricing();
121
+ const now = Date.now();
122
+ const cutoffMs = sinceDays > 0 ? now - sinceDays * 24 * 60 * 60 * 1000 : 0;
123
+ const inWindow = events.filter((e) => Date.parse(e.ts) >= cutoffMs);
124
+ const breakdown = {
125
+ total_usd: 0,
126
+ by_kind: {},
127
+ by_model: {},
128
+ by_day: {},
129
+ events_total: events.length,
130
+ events_window: inWindow.length,
131
+ window_label: sinceDays === 0 ? 'all-time' : 'last ' + sinceDays + ' days',
132
+ };
133
+ for (const ev of inWindow) {
134
+ let usd = 0;
135
+ if (ev.kind.startsWith('claude.')) {
136
+ const m = ev.model ?? 'unknown';
137
+ const p = pricing.models?.[m];
138
+ if (p) {
139
+ usd = ((ev.tokens_in ?? 0) / 1_000_000) * p.in_per_mtok
140
+ + ((ev.tokens_out ?? 0) / 1_000_000) * p.out_per_mtok;
141
+ }
142
+ if (!breakdown.by_model[m]) {
143
+ breakdown.by_model[m] = { count: 0, tokens_in: 0, tokens_out: 0, usd: 0 };
144
+ }
145
+ const slot = breakdown.by_model[m];
146
+ slot.count++;
147
+ slot.tokens_in += ev.tokens_in ?? 0;
148
+ slot.tokens_out += ev.tokens_out ?? 0;
149
+ slot.usd += usd;
150
+ }
151
+ else if (ev.kind === 'voice.tts') {
152
+ usd = ((ev.units ?? 0) / 1_000_000) * (pricing.voice?.tts_per_million_chars ?? 0);
153
+ }
154
+ else if (ev.kind === 'voice.stt') {
155
+ usd = (ev.units ?? 0) * (pricing.voice?.stt_per_minute ?? 0);
156
+ }
157
+ breakdown.total_usd += usd;
158
+ if (!breakdown.by_kind[ev.kind])
159
+ breakdown.by_kind[ev.kind] = { count: 0, usd: 0 };
160
+ breakdown.by_kind[ev.kind].count++;
161
+ breakdown.by_kind[ev.kind].usd += usd;
162
+ const day = ev.ts.slice(0, 10);
163
+ if (!breakdown.by_day[day])
164
+ breakdown.by_day[day] = { count: 0, usd: 0 };
165
+ breakdown.by_day[day].count++;
166
+ breakdown.by_day[day].usd += usd;
167
+ }
168
+ return breakdown;
169
+ }
170
+ /**
171
+ * Pretty-format a CostBreakdown for terminal output. Returns
172
+ * lines; caller does the printing.
173
+ */
174
+ export function formatCosts(b) {
175
+ const lines = [];
176
+ lines.push('Window: ' + b.window_label);
177
+ lines.push('Events total: ' + b.events_total);
178
+ lines.push('Events in window:' + b.events_window);
179
+ lines.push('Total USD: $' + b.total_usd.toFixed(4));
180
+ lines.push('');
181
+ lines.push('By kind:');
182
+ const kinds = Object.entries(b.by_kind).sort((a, c) => c[1].usd - a[1].usd);
183
+ for (const [k, v] of kinds) {
184
+ lines.push(' ' + k.padEnd(18) + 'count=' + String(v.count).padStart(5) + ' usd=$' + v.usd.toFixed(4));
185
+ }
186
+ if (Object.keys(b.by_model).length > 0) {
187
+ lines.push('');
188
+ lines.push('By model:');
189
+ const models = Object.entries(b.by_model).sort((a, c) => c[1].usd - a[1].usd);
190
+ for (const [m, v] of models) {
191
+ lines.push(' ' + m.padEnd(24)
192
+ + 'count=' + String(v.count).padStart(5)
193
+ + ' in=' + String(v.tokens_in).padStart(8)
194
+ + ' out=' + String(v.tokens_out).padStart(7)
195
+ + ' usd=$' + v.usd.toFixed(4));
196
+ }
197
+ }
198
+ if (Object.keys(b.by_day).length > 0) {
199
+ lines.push('');
200
+ lines.push('By day:');
201
+ const days = Object.entries(b.by_day).sort((a, c) => (a[0] < c[0] ? 1 : -1)).slice(0, 14);
202
+ for (const [d, v] of days) {
203
+ lines.push(' ' + d + ' count=' + String(v.count).padStart(5) + ' usd=$' + v.usd.toFixed(4));
204
+ }
205
+ }
206
+ return lines;
207
+ }
208
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/telemetry/usage.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -4,5 +4,5 @@
4
4
  * into the npm metadata) so we don't end up with two versions
5
5
  * drifting.
6
6
  */
7
- export declare const VERSION = "0.2.0-alpha.1";
7
+ export declare const VERSION = "0.2.0-alpha.21";
8
8
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,OAAO,kBAAkB,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,OAAO,mBAAmB,CAAC"}
package/dist/version.js CHANGED
@@ -4,5 +4,5 @@
4
4
  * into the npm metadata) so we don't end up with two versions
5
5
  * drifting.
6
6
  */
7
- export const VERSION = '0.2.0-alpha.1';
7
+ export const VERSION = '0.2.0-alpha.21';
8
8
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAC"}
@@ -35,7 +35,7 @@
35
35
  * the contract is the literal string the chat dispatcher
36
36
  * accepts. If a tool is renamed there, this list must follow.
37
37
  */
38
- export type ReaderToolName = 'forge.reader.open' | 'forge.reader.list_documents' | 'forge.reader.read_section' | 'forge.reader.next_block' | 'forge.reader.search' | 'forge.reader.bookmark_set' | 'forge.reader.bookmark_jump' | 'forge.reader.recap' | 'forge.manual.open';
38
+ export type ReaderToolName = 'forge_reader_open' | 'forge_reader_list_documents' | 'forge_reader_read_section' | 'forge_reader_next_block' | 'forge_reader_search' | 'forge_reader_bookmark_set' | 'forge_reader_bookmark_jump' | 'forge_reader_recap' | 'forge_manual_open';
39
39
  export interface MatchedIntent {
40
40
  tool: ReaderToolName;
41
41
  args: Record<string, unknown>;
Binary file
@@ -1 +1 @@
1
- {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/voice/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACf,MAAM,aAAa,CAAC;AAQrB,QAAA,MAAM,UAAU,iBAAiB,CAAC;AAElC,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;CACpC;AAED,wDAAwD;AACxD,iBAAS,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAUjE;AAED,8DAA8D;AAC9D,iBAAS,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAQjE;AAqBD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;gBAEvC,IAAI,GAAE,qBAA0B;IAKtC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAwExD;AAMD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;gBAEvC,IAAI,GAAE,qBAA0B;IAKtC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAS9B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAiEvD;qDACiD;IACjD,OAAO,CAAC,sBAAsB;IAQ9B,qDAAqD;IACrD,OAAO,CAAC,UAAU;CAMnB;AAGD,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/voice/providers/google.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACf,MAAM,aAAa,CAAC;AAuErB,QAAA,MAAM,UAAU,iBAAiB,CAAC;AAElC,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;CACpC;AAED,wDAAwD;AACxD,iBAAS,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAUjE;AAED,8DAA8D;AAC9D,iBAAS,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAQjE;AA4ED,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;gBAEvC,IAAI,GAAE,qBAA0B;IAKtC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAI9B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAmFxD;AAMD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;gBAEvC,IAAI,GAAE,qBAA0B;IAKtC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAI9B,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA0FvD;qDACiD;IACjD,OAAO,CAAC,sBAAsB;IAQ9B,qDAAqD;IACrD,OAAO,CAAC,UAAU;CAMnB;AAGD,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,UAAU,EAAE,CAAC"}