@agentguard-run/spend 0.3.0 → 0.4.1

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 (53) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.es-419.md +28 -0
  3. package/README.md +28 -0
  4. package/README.pt-BR.md +28 -0
  5. package/dist/advisor/anomaly.d.ts +26 -0
  6. package/dist/advisor/anomaly.d.ts.map +1 -0
  7. package/dist/advisor/anomaly.js +119 -0
  8. package/dist/advisor/anomaly.js.map +1 -0
  9. package/dist/advisor/conversation.d.ts +75 -0
  10. package/dist/advisor/conversation.d.ts.map +1 -0
  11. package/dist/advisor/conversation.js +264 -0
  12. package/dist/advisor/conversation.js.map +1 -0
  13. package/dist/advisor/forecast.d.ts +19 -0
  14. package/dist/advisor/forecast.d.ts.map +1 -0
  15. package/dist/advisor/forecast.js +57 -0
  16. package/dist/advisor/forecast.js.map +1 -0
  17. package/dist/advisor/llm-client.d.ts +41 -0
  18. package/dist/advisor/llm-client.d.ts.map +1 -0
  19. package/dist/advisor/llm-client.js +248 -0
  20. package/dist/advisor/llm-client.js.map +1 -0
  21. package/dist/advisor/output.d.ts +41 -0
  22. package/dist/advisor/output.d.ts.map +1 -0
  23. package/dist/advisor/output.js +202 -0
  24. package/dist/advisor/output.js.map +1 -0
  25. package/dist/advisor/posture.d.ts +26 -0
  26. package/dist/advisor/posture.d.ts.map +1 -0
  27. package/dist/advisor/posture.js +99 -0
  28. package/dist/advisor/posture.js.map +1 -0
  29. package/dist/advisor/system-prompt.d.ts +20 -0
  30. package/dist/advisor/system-prompt.d.ts.map +1 -0
  31. package/dist/advisor/system-prompt.js +190 -0
  32. package/dist/advisor/system-prompt.js.map +1 -0
  33. package/dist/cli/advisor.d.ts +5 -0
  34. package/dist/cli/advisor.d.ts.map +1 -0
  35. package/dist/cli/advisor.js +270 -0
  36. package/dist/cli/advisor.js.map +1 -0
  37. package/dist/cli/main.d.ts.map +1 -1
  38. package/dist/cli/main.js +6 -0
  39. package/dist/cli/main.js.map +1 -1
  40. package/dist/index.d.ts +4 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +15 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/telemetry.js +1 -1
  45. package/package.json +9 -2
  46. package/src/advisor/anomaly.ts +98 -0
  47. package/src/advisor/conversation.ts +289 -0
  48. package/src/advisor/forecast.ts +64 -0
  49. package/src/advisor/llm-client.ts +247 -0
  50. package/src/advisor/output.ts +201 -0
  51. package/src/advisor/posture.ts +111 -0
  52. package/src/advisor/system-prompt.ts +195 -0
  53. package/src/cli/advisor.ts +262 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.1
4
+
5
+ - **Renamed `agentguard coach` to `agentguard advisor`** to better match the business-buyer mental model. The command name now aligns with the outcomes-based positioning, AI policy advisor for your business. v0.4.0 had zero downloads at the time of this release. The rename is clean with no alias.
6
+ - Session logs now stored at `~/.agentguard/advisor-sessions/`.
7
+ - **Added Governance Posture**: Velocity, Standard, and Compliance policy generation modes that shape enforcement mode, capability tiers, downgrade behavior, approval gates, and audit retention. Inspired by @_catwu's Claude Code velocity playbook.
8
+
9
+ ## 0.4.0
10
+
11
+ - Added `agentguard advisor` subcommand: local LLM-driven policy setup via your OpenRouter key.
12
+ - Added local Advisor session logs, policy and quickstart writers, projected savings output, and review and forecast skeletons.
13
+
3
14
  ## 0.3.0
4
15
 
5
16
  - Added streaming true-up for OpenAI, Anthropic, and Bedrock, including signed settlement entries.
package/README.es-419.md CHANGED
@@ -16,6 +16,34 @@ agentguard wizard
16
16
 
17
17
  El wizard escribe `~/.agentguard/policy.yaml`, `~/.agentguard/quickstart.ts` y `~/.agentguard/quickstart.py`. También imprime el snippet listo para pegar en su app.
18
18
 
19
+
20
+ ## ¿Necesita ayuda configurando? Ejecute `agentguard advisor`
21
+
22
+ `agentguard advisor` usa su clave de OpenRouter, o cualquier endpoint compatible con OpenAI vía `--base-url`, para guiar la configuración en su terminal. La infraestructura de AgentGuard nunca ve prompts, respuestas, claves, detalles de política ni el log de sesión.
23
+
24
+ ```bash
25
+ agentguard advisor
26
+ ```
27
+
28
+ Advisor escribe `~/.agentguard/policy.yaml`, un quickstart según el lenguaje, la matemática de ahorro proyectado y un log JSONL local en `~/.agentguard/advisor-sessions/`.
29
+
30
+ ## Postura de gobernanza
31
+
32
+ Advisor pregunta por un estilo operativo y lo usa para ajustar la política generada.
33
+
34
+ - `velocity`: equipos de software e IA que shippean rápido. Inicia en `shadow`, usa tiers de capacidad permisivos y baja rápido a modelos baratos.
35
+ - `standard`: la mayoría de SaaS, e-commerce, real estate, agencias, servicios locales y startups. Inicia en `enforce`, usa tiers balanceados y conserva 90 días de auditoría.
36
+ - `compliance`: legal, salud, dental, contabilidad, SOX, fintech y flujos regulados. Inicia en `canary`, exige tiers más estrictos, bloquea overflow regulado en vez de hacer downgrade y conserva 7 años de auditoría.
37
+
38
+ Puede sobrescribir la sugerencia:
39
+
40
+ ```bash
41
+ agentguard advisor --posture velocity
42
+ agentguard advisor --posture compliance
43
+ ```
44
+
45
+ La postura `custom` queda reservada para Outcome Builder en Solo tier.
46
+
19
47
  ## Por qué OpenRouter
20
48
 
21
49
  Una clave de OpenRouter da acceso a cientos de modelos de muchos proveedores. Finanzas ve una factura. AgentGuard aplica quién usa qué, qué tiers de tarea pueden llegar a qué modelos y cuánto puede gastar cada llamada. La clave vive en `OPENROUTER_API_KEY` o `~/.agentguard/openrouter-key` con modo `600`.
package/README.md CHANGED
@@ -31,6 +31,34 @@ const response = await guardedClient.chat.completions.create({
31
31
 
32
32
  Then run your agent. AgentGuard decides locally before any provider call starts, signs the receipt, and applies allow, downgrade, shadow, or block.
33
33
 
34
+
35
+ ## Need help configuring? Run `agentguard advisor`
36
+
37
+ `agentguard advisor` uses your OpenRouter key, or any OpenAI-compatible endpoint you pass with `--base-url`, to run a local setup dialogue in your terminal. AgentGuard infrastructure never sees the prompts, completions, keys, policy details, or session log.
38
+
39
+ ```bash
40
+ agentguard advisor
41
+ ```
42
+
43
+ Advisor writes `~/.agentguard/policy.yaml`, a language-aware quickstart file, projected savings math, and a local JSONL session log under `~/.agentguard/advisor-sessions/`.
44
+
45
+ ## Governance Posture
46
+
47
+ Advisor asks for one operating-style input and uses it to shape the generated policy.
48
+
49
+ - `velocity`: high-ship software and AI teams. Starts in `shadow`, uses permissive capability tiers, and downgrades aggressively to cheaper models.
50
+ - `standard`: most SaaS, e-commerce, real estate, agencies, local services, and startups. Starts in `enforce`, uses balanced capability tiers, and keeps 90 days of audit retention.
51
+ - `compliance`: law, healthcare, dental, accounting, SOX, fintech, and regulated workflows. Starts in `canary`, requires stricter capability tiers, blocks regulated overflow instead of downgrading, and keeps 7 years of audit retention.
52
+
53
+ Override the suggestion when you already know how the team operates:
54
+
55
+ ```bash
56
+ agentguard advisor --posture velocity
57
+ agentguard advisor --posture compliance
58
+ ```
59
+
60
+ `custom` posture is reserved for the Solo tier Outcome Builder.
61
+
34
62
  ## Why OpenRouter?
35
63
 
36
64
  One OpenRouter key gives your team access to hundreds of models across many providers. Your CFO sees one invoice. AgentGuard enforces who uses what, which task tiers can reach which models, and what each call can spend. The OpenRouter key can live in `OPENROUTER_API_KEY` or `~/.agentguard/openrouter-key` with mode `600`.
package/README.pt-BR.md CHANGED
@@ -16,6 +16,34 @@ agentguard wizard
16
16
 
17
17
  O wizard escreve `~/.agentguard/policy.yaml`, `~/.agentguard/quickstart.ts` e `~/.agentguard/quickstart.py`. Ele também imprime o snippet pronto para colar no app.
18
18
 
19
+
20
+ ## Precisa de ajuda para configurar? Rode `agentguard advisor`
21
+
22
+ `agentguard advisor` usa sua chave OpenRouter, ou qualquer endpoint compatível com OpenAI via `--base-url`, para guiar a configuração no terminal. A infraestrutura da AgentGuard nunca vê prompts, respostas, chaves, detalhes de política nem o log de sessão.
23
+
24
+ ```bash
25
+ agentguard advisor
26
+ ```
27
+
28
+ Advisor escreve `~/.agentguard/policy.yaml`, um quickstart conforme a linguagem, a matemática de economia projetada e um log JSONL local em `~/.agentguard/advisor-sessions/`.
29
+
30
+ ## Postura de governança
31
+
32
+ Advisor pergunta por um estilo operacional e usa isso para ajustar a política gerada.
33
+
34
+ - `velocity`: times de software e IA que lançam rápido. Começa em `shadow`, usa tiers de capacidade permissivos e faz downgrade rápido para modelos baratos.
35
+ - `standard`: a maioria de SaaS, e-commerce, real estate, agências, serviços locais e startups. Começa em `enforce`, usa tiers balanceados e mantém 90 dias de auditoria.
36
+ - `compliance`: jurídico, saúde, dental, contabilidade, SOX, fintech e fluxos regulados. Começa em `canary`, exige tiers mais rígidos, bloqueia overflow regulado em vez de fazer downgrade e mantém 7 anos de auditoria.
37
+
38
+ Você pode sobrescrever a sugestão:
39
+
40
+ ```bash
41
+ agentguard advisor --posture velocity
42
+ agentguard advisor --posture compliance
43
+ ```
44
+
45
+ A postura `custom` fica reservada para o Outcome Builder no Solo tier.
46
+
19
47
  ## Por que OpenRouter
20
48
 
21
49
  Uma chave OpenRouter dá acesso a centenas de modelos de muitos provedores. Finanças vê uma fatura. AgentGuard aplica quem usa o quê, quais tiers de tarefa podem acessar quais modelos e quanto cada chamada pode gastar. A chave fica em `OPENROUTER_API_KEY` ou `~/.agentguard/openrouter-key` com modo `600`.
@@ -0,0 +1,26 @@
1
+ /**
2
+ * AgentGuard(TM) Spend: local Advisor anomaly review skeleton.
3
+ *
4
+ * Reads local decision logs only. No network calls are made.
5
+ *
6
+ * Patent notice: Protected by U.S. patent-pending technology
7
+ * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
8
+ * 64/071,781; 64/071,789).
9
+ */
10
+ export interface AdvisorSpendPoint {
11
+ ts: string;
12
+ scope: string;
13
+ agentId: string;
14
+ cents: number;
15
+ }
16
+ export interface AdvisorAnomaly {
17
+ scope: string;
18
+ agentId: string;
19
+ last24hCents: number;
20
+ baselineCents: number;
21
+ sigmaCents: number;
22
+ suggestion: string;
23
+ }
24
+ export declare function readDecisionSpend(scope?: string, home?: string): AdvisorSpendPoint[];
25
+ export declare function reviewAnomalies(points: AdvisorSpendPoint[], now?: Date): AdvisorAnomaly[];
26
+ //# sourceMappingURL=anomaly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anomaly.d.ts","sourceRoot":"","sources":["../../src/advisor/anomaly.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,SAAY,EAAE,IAAI,SAAmB,GAAG,iBAAiB,EAAE,CAuBjG;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,GAAG,OAAa,GAAG,cAAc,EAAE,CA6B/F"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * AgentGuard(TM) Spend: local Advisor anomaly review skeleton.
4
+ *
5
+ * Reads local decision logs only. No network calls are made.
6
+ *
7
+ * Patent notice: Protected by U.S. patent-pending technology
8
+ * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
9
+ * 64/071,781; 64/071,789).
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.readDecisionSpend = readDecisionSpend;
46
+ exports.reviewAnomalies = reviewAnomalies;
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ const output_1 = require("./output");
50
+ function readDecisionSpend(scope = 'default', home = (0, output_1.agentguardHome)()) {
51
+ const file = path.join(home, scope, 'decisions.ndjson');
52
+ if (!fs.existsSync(file))
53
+ return [];
54
+ const points = [];
55
+ for (const line of fs.readFileSync(file, 'utf8').split('\n')) {
56
+ if (!line.trim())
57
+ continue;
58
+ try {
59
+ const parsed = JSON.parse(line);
60
+ const decision = parsed.decision ?? parsed;
61
+ const cents = Number(decision.actualCents ?? decision.projectedCents ?? 0);
62
+ const ts = String(decision.timestamp ?? parsed.timestamp ?? new Date(0).toISOString());
63
+ const scopeObj = decision.scope ?? {};
64
+ points.push({
65
+ ts,
66
+ scope: String(scopeObj.tenantId ?? decision.triggeredScopeKey ?? scope),
67
+ agentId: String(scopeObj.agentId ?? decision.agentId ?? 'unknown'),
68
+ cents: Number.isFinite(cents) ? cents : 0,
69
+ });
70
+ }
71
+ catch {
72
+ continue;
73
+ }
74
+ }
75
+ return points;
76
+ }
77
+ function reviewAnomalies(points, now = new Date()) {
78
+ const cutoff = now.getTime() - 24 * 60 * 60 * 1000;
79
+ const byAgent = new Map();
80
+ for (const point of points) {
81
+ const key = `${point.scope}\t${point.agentId}`;
82
+ byAgent.set(key, [...(byAgent.get(key) ?? []), point]);
83
+ }
84
+ const anomalies = [];
85
+ for (const [key, rows] of byAgent) {
86
+ const [scope, agentId] = key.split('\t');
87
+ const daily = bucketDaily(rows);
88
+ const historical = daily.filter((row) => row.day < dayKey(new Date(cutoff))).map((row) => row.cents);
89
+ const recent = rows.filter((row) => Date.parse(row.ts) >= cutoff).reduce((sum, row) => sum + row.cents, 0);
90
+ if (historical.length < 3 || recent <= 0)
91
+ continue;
92
+ const mean = historical.reduce((sum, value) => sum + value, 0) / historical.length;
93
+ const variance = historical.reduce((sum, value) => sum + Math.pow(value - mean, 2), 0) / historical.length;
94
+ const sigma = Math.sqrt(variance);
95
+ if (recent > mean + 3 * sigma) {
96
+ anomalies.push({
97
+ scope: scope ?? 'unknown',
98
+ agentId: agentId ?? 'unknown',
99
+ last24hCents: recent,
100
+ baselineCents: Math.round(mean),
101
+ sigmaCents: Math.round(sigma),
102
+ suggestion: 'Lower the per_day cap or add a per_minute block cap for this agent.',
103
+ });
104
+ }
105
+ }
106
+ return anomalies.sort((a, b) => b.last24hCents - a.last24hCents);
107
+ }
108
+ function bucketDaily(points) {
109
+ const buckets = new Map();
110
+ for (const point of points) {
111
+ const day = dayKey(new Date(point.ts));
112
+ buckets.set(day, (buckets.get(day) ?? 0) + point.cents);
113
+ }
114
+ return [...buckets.entries()].map(([day, cents]) => ({ day, cents })).sort((a, b) => a.day.localeCompare(b.day));
115
+ }
116
+ function dayKey(date) {
117
+ return date.toISOString().slice(0, 10);
118
+ }
119
+ //# sourceMappingURL=anomaly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anomaly.js","sourceRoot":"","sources":["../../src/advisor/anomaly.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * AgentGuard(TM) Spend: Advisor conversation state.
3
+ *
4
+ * Patent notice: Protected by U.S. patent-pending technology
5
+ * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
6
+ * 64/071,781; 64/071,789).
7
+ */
8
+ import type { CapabilityTier, SpendPolicy } from '../types';
9
+ import { type GovernancePosture } from './posture';
10
+ export type AdvisorQuestionId = 'building' | 'posture' | 'scale' | 'tasks' | 'budget' | 'confirm';
11
+ export interface AdvisorQuestion {
12
+ id: AdvisorQuestionId;
13
+ prompt: string;
14
+ }
15
+ export interface AdvisorAnswers {
16
+ building?: string;
17
+ scale?: string;
18
+ tasks?: string;
19
+ budget?: string;
20
+ confirm?: string;
21
+ language?: 'ts' | 'py';
22
+ posture?: GovernancePosture;
23
+ }
24
+ export interface AdvisorBusinessProfile {
25
+ vertical: string;
26
+ tenantId: string;
27
+ teamSize: number;
28
+ monthlyVolume: number;
29
+ tasks: string[];
30
+ monthlyBudgetCents: number;
31
+ requiredCapability: CapabilityTier;
32
+ primaryModel: string;
33
+ fallbackModel: string;
34
+ perCallCapCents: number;
35
+ perDayCapCents: number;
36
+ perMonthCapCents: number;
37
+ scopeLabel: string;
38
+ language: 'ts' | 'py';
39
+ posture: GovernancePosture;
40
+ }
41
+ export interface ProjectedSavingsRow {
42
+ label: string;
43
+ beforeCents: number;
44
+ afterCents: number;
45
+ savingsCents: number;
46
+ }
47
+ export interface ProjectedSavings {
48
+ rows: ProjectedSavingsRow[];
49
+ monthlyBeforeCents: number;
50
+ monthlyAfterCents: number;
51
+ monthlySavingsCents: number;
52
+ savingsPercent: number;
53
+ }
54
+ export declare const ADVISOR_QUESTIONS: AdvisorQuestion[];
55
+ export declare class AdvisorConversation {
56
+ private answers;
57
+ private index;
58
+ constructor(initial?: AdvisorAnswers);
59
+ currentQuestion(): AdvisorQuestion | null;
60
+ answer(value: string): void;
61
+ next(): AdvisorQuestion | null;
62
+ back(): AdvisorQuestion | null;
63
+ isComplete(): boolean;
64
+ snapshot(): AdvisorAnswers;
65
+ setPosture(posture: GovernancePosture): void;
66
+ profile(cwd?: string): AdvisorBusinessProfile;
67
+ }
68
+ export declare function detectVertical(text: string): string;
69
+ export declare function suggestedPostureForText(text: string): GovernancePosture;
70
+ export declare function buildBusinessProfile(answers: AdvisorAnswers, cwd?: string): AdvisorBusinessProfile;
71
+ export declare function buildPolicyFromProfile(profile: AdvisorBusinessProfile): SpendPolicy;
72
+ export declare function projectedSavings(profile: AdvisorBusinessProfile): ProjectedSavings;
73
+ export declare function formatCents(cents: number): string;
74
+ export declare function detectProjectLanguage(cwd: string): 'ts' | 'py';
75
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/advisor/conversation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ /**
3
+ * AgentGuard(TM) Spend: Advisor conversation state.
4
+ *
5
+ * Patent notice: Protected by U.S. patent-pending technology
6
+ * (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
7
+ * 64/071,781; 64/071,789).
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.AdvisorConversation = exports.ADVISOR_QUESTIONS = void 0;
44
+ exports.detectVertical = detectVertical;
45
+ exports.suggestedPostureForText = suggestedPostureForText;
46
+ exports.buildBusinessProfile = buildBusinessProfile;
47
+ exports.buildPolicyFromProfile = buildPolicyFromProfile;
48
+ exports.projectedSavings = projectedSavings;
49
+ exports.formatCents = formatCents;
50
+ exports.detectProjectLanguage = detectProjectLanguage;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const posture_1 = require("./posture");
54
+ exports.ADVISOR_QUESTIONS = [
55
+ { id: 'building', prompt: 'What are you building or running? Include your business type and the agent workflow.' },
56
+ { id: 'posture', prompt: 'Confirm or change governance posture: Velocity / Standard / Compliance.' },
57
+ { id: 'scale', prompt: 'How big is the team and roughly how many AI calls, tickets, orders, encounters, matters, or jobs happen per month?' },
58
+ { id: 'tasks', prompt: 'What are the top 3 AI tasks this agent will perform?' },
59
+ { id: 'budget', prompt: 'What monthly AI budget or per-task ceiling should this stay under?' },
60
+ { id: 'confirm', prompt: 'Confirm the setup or list any refinements before I write policy.yaml and quickstart code.' },
61
+ ];
62
+ const VERTICAL_HINTS = [
63
+ { vertical: 'law-firm', needles: ['law', 'legal', 'attorney', 'paralegal', 'contract', 'matter', 'discovery'], scopeLabel: 'matter', capability: 'data_write', primary: 'anthropic/claude-sonnet-4-6', fallback: 'anthropic/claude-haiku-4-5', perCall: 300 },
64
+ { vertical: 'healthcare', needles: ['health', 'medical', 'dental', 'clinic', 'patient', 'chart', 'hipaa', 'encounter'], scopeLabel: 'encounter', capability: 'data_write', primary: 'anthropic.claude-sonnet-4-v1:0', fallback: 'amazon.nova-lite-v1:0', perCall: 300 },
65
+ { vertical: 'ecommerce', needles: ['shopify', 'commerce', 'store', 'order', 'refund', 'chargeback', 'fraud', 'returns'], scopeLabel: 'order', capability: 'payment_initiate', primary: 'openai/gpt-5-mini', fallback: 'openai/gpt-4o-mini', perCall: 25 },
66
+ { vertical: 'accounting', needles: ['accounting', 'bookkeeping', 'tax', 'ledger', 'receipt', 'close', 'audit', 'sox'], scopeLabel: 'engagement', capability: 'data_write', primary: 'anthropic/claude-sonnet-4-6', fallback: 'anthropic/claude-haiku-4-5', perCall: 150 },
67
+ { vertical: 'software', needles: ['software', 'code', 'developer', 'github', 'repo', 'pull request', 'pr'], scopeLabel: 'repo', capability: 'read_only', primary: 'google/gemini-3-flash-preview', fallback: 'openai/gpt-4o-mini', perCall: 10 },
68
+ { vertical: 'real-estate', needles: ['real estate', 'broker', 'listing', 'mortgage', 'tenant', 'lease', 'property'], scopeLabel: 'transaction', capability: 'data_write', primary: 'openai/gpt-5-mini', fallback: 'openai/gpt-4o-mini', perCall: 50 },
69
+ { vertical: 'marketing', needles: ['marketing', 'agency', 'content', 'campaign', 'brand'], scopeLabel: 'campaign', capability: 'data_write', primary: 'openai/gpt-5-mini', fallback: 'openai/gpt-4o-mini', perCall: 25 },
70
+ { vertical: 'local-services', needles: ['salon', 'gym', 'restaurant', 'landscaping', 'construction', 'photography', 'fitness', 'pet'], scopeLabel: 'job', capability: 'data_write', primary: 'openai/gpt-5-mini', fallback: 'openai/gpt-4o-mini', perCall: 25 },
71
+ ];
72
+ class AdvisorConversation {
73
+ answers = {};
74
+ index = 0;
75
+ constructor(initial) {
76
+ if (initial)
77
+ this.answers = { ...initial };
78
+ this.index = firstMissingIndex(this.answers);
79
+ }
80
+ currentQuestion() {
81
+ const question = exports.ADVISOR_QUESTIONS[this.index] ?? null;
82
+ if (question?.id !== 'posture')
83
+ return question;
84
+ const vertical = detectVertical(this.answers.building ?? '');
85
+ const suggested = (0, posture_1.suggestPostureForVertical)(vertical);
86
+ return {
87
+ id: 'posture',
88
+ prompt: `Based on ${vertical}, we suggest ${suggested} governance posture. Confirm or change: Velocity / Standard / Compliance.`,
89
+ };
90
+ }
91
+ answer(value) {
92
+ const question = this.currentQuestion();
93
+ if (!question)
94
+ return;
95
+ if (question.id === 'posture') {
96
+ this.answers.posture = (0, posture_1.normalizePosture)(value) ?? suggestedPostureForText(this.answers.building ?? '');
97
+ return;
98
+ }
99
+ this.answers[question.id] = value.trim();
100
+ }
101
+ next() {
102
+ this.index = Math.min(this.index + 1, exports.ADVISOR_QUESTIONS.length);
103
+ return this.currentQuestion();
104
+ }
105
+ back() {
106
+ this.index = Math.max(0, this.index - 1);
107
+ return this.currentQuestion();
108
+ }
109
+ isComplete() {
110
+ return exports.ADVISOR_QUESTIONS.every((question) => Boolean(this.answers[question.id]?.trim()));
111
+ }
112
+ snapshot() {
113
+ return { ...this.answers };
114
+ }
115
+ setPosture(posture) {
116
+ this.answers.posture = posture;
117
+ }
118
+ profile(cwd = process.cwd()) {
119
+ return buildBusinessProfile(this.answers, cwd);
120
+ }
121
+ }
122
+ exports.AdvisorConversation = AdvisorConversation;
123
+ function detectVertical(text) {
124
+ const joined = text.toLowerCase();
125
+ return (VERTICAL_HINTS.find((candidate) => candidate.needles.some((needle) => joined.includes(needle))) ?? VERTICAL_HINTS[0]).vertical;
126
+ }
127
+ function suggestedPostureForText(text) {
128
+ return (0, posture_1.suggestPostureForVertical)(detectVertical(text));
129
+ }
130
+ function buildBusinessProfile(answers, cwd = process.cwd()) {
131
+ const joined = `${answers.building ?? ''} ${answers.scale ?? ''} ${answers.tasks ?? ''}`.toLowerCase();
132
+ const hint = VERTICAL_HINTS.find((candidate) => candidate.needles.some((needle) => joined.includes(needle))) ?? VERTICAL_HINTS[0];
133
+ const posture = answers.posture ?? (0, posture_1.suggestPostureForVertical)(hint.vertical);
134
+ const scale = parseScale(answers.scale ?? '');
135
+ const budgetCents = parseBudgetCents(answers.budget ?? '', Math.max(4900, Math.ceil(scale.monthlyVolume * hint.perCall * 0.35)));
136
+ const tasks = parseTasks(answers.tasks ?? answers.building ?? hint.vertical);
137
+ const perMonthCapCents = Math.max(1000, budgetCents);
138
+ const perDayCapCents = Math.max(hint.perCall * 10, Math.ceil(perMonthCapCents / 20));
139
+ return {
140
+ vertical: hint.vertical,
141
+ tenantId: tenantIdFromBusiness(answers.building ?? hint.vertical),
142
+ teamSize: scale.teamSize,
143
+ monthlyVolume: scale.monthlyVolume,
144
+ tasks,
145
+ monthlyBudgetCents: perMonthCapCents,
146
+ requiredCapability: capabilityFor(joined, hint.capability, posture),
147
+ primaryModel: hint.primary,
148
+ fallbackModel: hint.fallback,
149
+ perCallCapCents: hint.perCall,
150
+ perDayCapCents,
151
+ perMonthCapCents,
152
+ scopeLabel: hint.scopeLabel,
153
+ language: answers.language ?? detectProjectLanguage(cwd),
154
+ posture,
155
+ };
156
+ }
157
+ function buildPolicyFromProfile(profile) {
158
+ const posture = (0, posture_1.postureProfile)(profile.posture);
159
+ const conservativeBlock = profile.posture === 'compliance' && profile.requiredCapability !== 'read_only';
160
+ const perCallAmount = profile.posture === 'velocity'
161
+ ? Math.max(1, Math.ceil(profile.perCallCapCents * 0.6))
162
+ : profile.perCallCapCents;
163
+ const caps = [
164
+ conservativeBlock
165
+ ? {
166
+ amountCents: perCallAmount,
167
+ window: 'per_call',
168
+ action: 'block',
169
+ reason: 'Per-call regulated capability budget reached',
170
+ }
171
+ : {
172
+ amountCents: perCallAmount,
173
+ window: 'per_call',
174
+ action: 'downgrade',
175
+ downgradeTo: profile.fallbackModel,
176
+ reason: 'Per-call budget reached, route to fallback model',
177
+ },
178
+ {
179
+ amountCents: profile.perDayCapCents,
180
+ window: 'per_day',
181
+ action: 'block',
182
+ reason: 'Daily budget reached',
183
+ },
184
+ {
185
+ amountCents: profile.perMonthCapCents,
186
+ window: 'per_month',
187
+ action: 'block',
188
+ reason: 'Monthly budget reached',
189
+ },
190
+ ];
191
+ return {
192
+ id: `advisor-${profile.vertical}-v1`,
193
+ name: `Advisor generated ${profile.vertical} policy`,
194
+ scope: { tenantId: profile.tenantId },
195
+ caps,
196
+ mode: posture.defaultMode,
197
+ requiredCapability: profile.requiredCapability,
198
+ version: 1,
199
+ effectiveFrom: new Date().toISOString(),
200
+ };
201
+ }
202
+ function projectedSavings(profile) {
203
+ const heavyPerCall = Math.max(profile.perCallCapCents * 4, 100);
204
+ const routedPerCall = Math.max(1, Math.ceil(profile.perCallCapCents * 0.45));
205
+ const monthlyBeforeCents = profile.monthlyVolume * heavyPerCall;
206
+ const monthlyAfterCents = Math.min(profile.perMonthCapCents, profile.monthlyVolume * routedPerCall);
207
+ const monthlySavingsCents = Math.max(0, monthlyBeforeCents - monthlyAfterCents);
208
+ return {
209
+ rows: [
210
+ { label: 'All traffic on premium model', beforeCents: monthlyBeforeCents, afterCents: 0, savingsCents: 0 },
211
+ { label: 'Task routed with AgentGuard caps', beforeCents: 0, afterCents: monthlyAfterCents, savingsCents: monthlySavingsCents },
212
+ ],
213
+ monthlyBeforeCents,
214
+ monthlyAfterCents,
215
+ monthlySavingsCents,
216
+ savingsPercent: monthlyBeforeCents > 0 ? Math.round((monthlySavingsCents / monthlyBeforeCents) * 100) : 0,
217
+ };
218
+ }
219
+ function formatCents(cents) {
220
+ return `$${(cents / 100).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
221
+ }
222
+ function detectProjectLanguage(cwd) {
223
+ try {
224
+ if (fs.existsSync(path.join(cwd, 'pyproject.toml')) || fs.existsSync(path.join(cwd, 'requirements.txt')))
225
+ return 'py';
226
+ if (fs.existsSync(path.join(cwd, 'package.json')))
227
+ return 'ts';
228
+ }
229
+ catch {
230
+ return 'ts';
231
+ }
232
+ return 'ts';
233
+ }
234
+ function firstMissingIndex(answers) {
235
+ const index = exports.ADVISOR_QUESTIONS.findIndex((question) => !answers[question.id]?.trim());
236
+ return index === -1 ? exports.ADVISOR_QUESTIONS.length : index;
237
+ }
238
+ function parseScale(value) {
239
+ const numbers = (value.match(/\d[\d,]*/g) ?? []).map((part) => Number(part.replace(/,/g, ''))).filter(Number.isFinite);
240
+ const teamSize = Math.max(1, numbers[0] ?? 3);
241
+ const monthlyVolume = Math.max(25, numbers[1] ?? numbers[0] ?? 500);
242
+ return { teamSize, monthlyVolume };
243
+ }
244
+ function parseBudgetCents(value, fallback) {
245
+ const money = value.match(/\$?\s*(\d[\d,]*(?:\.\d{1,2})?)/);
246
+ if (!money)
247
+ return fallback;
248
+ const amount = Number(money[1].replace(/,/g, ''));
249
+ if (!Number.isFinite(amount) || amount <= 0)
250
+ return fallback;
251
+ return Math.round(amount * 100);
252
+ }
253
+ function parseTasks(value) {
254
+ const parts = value.split(/,|\n|;| and /i).map((part) => part.trim()).filter(Boolean);
255
+ return parts.length > 0 ? parts.slice(0, 3) : ['review requests', 'route models', 'write audit receipts'];
256
+ }
257
+ function tenantIdFromBusiness(value) {
258
+ const cleaned = value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 40);
259
+ return cleaned || 'local-business';
260
+ }
261
+ function capabilityFor(text, fallback, posture) {
262
+ return (0, posture_1.applyPostureCapability)(posture, text, fallback);
263
+ }
264
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../src/advisor/conversation.ts"],"names":[],"mappings":"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"}