rivet-design 0.8.3 → 0.8.5

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 (46) hide show
  1. package/dist/config/evaluateFlags.d.ts.map +1 -1
  2. package/dist/config/evaluateFlags.js +8 -2
  3. package/dist/config/evaluateFlags.js.map +1 -1
  4. package/dist/config/flags.d.ts +6 -0
  5. package/dist/config/flags.d.ts.map +1 -1
  6. package/dist/config/flags.js +2 -0
  7. package/dist/config/flags.js.map +1 -1
  8. package/dist/prompts/commentVariationPromptSnapshot.d.ts +1 -1
  9. package/dist/prompts/commentVariationPromptSnapshot.d.ts.map +1 -1
  10. package/dist/prompts/commentVariationPromptSnapshot.js +4 -4
  11. package/dist/prompts/commentVariationPromptSnapshot.js.map +1 -1
  12. package/dist/prompts/commentVariationPrompts.d.ts +8 -2
  13. package/dist/prompts/commentVariationPrompts.d.ts.map +1 -1
  14. package/dist/prompts/commentVariationPrompts.js +13 -10
  15. package/dist/prompts/commentVariationPrompts.js.map +1 -1
  16. package/dist/routes/design.d.ts.map +1 -1
  17. package/dist/routes/design.js +5 -0
  18. package/dist/routes/design.js.map +1 -1
  19. package/dist/server.d.ts.map +1 -1
  20. package/dist/server.js +6 -1
  21. package/dist/server.js.map +1 -1
  22. package/dist/services/CommentVariationService.d.ts +19 -29
  23. package/dist/services/CommentVariationService.d.ts.map +1 -1
  24. package/dist/services/CommentVariationService.js +100 -69
  25. package/dist/services/CommentVariationService.js.map +1 -1
  26. package/dist/services/DesktopVersionPolicyService.d.ts +21 -0
  27. package/dist/services/DesktopVersionPolicyService.d.ts.map +1 -0
  28. package/dist/services/DesktopVersionPolicyService.js +151 -0
  29. package/dist/services/DesktopVersionPolicyService.js.map +1 -0
  30. package/dist/services/GatewayClient.d.ts +23 -1
  31. package/dist/services/GatewayClient.d.ts.map +1 -1
  32. package/dist/services/GatewayClient.js +52 -22
  33. package/dist/services/GatewayClient.js.map +1 -1
  34. package/dist/services/VariantCodeGeneratorService.d.ts +8 -1
  35. package/dist/services/VariantCodeGeneratorService.d.ts.map +1 -1
  36. package/dist/services/VariantCodeGeneratorService.js +50 -6
  37. package/dist/services/VariantCodeGeneratorService.js.map +1 -1
  38. package/dist/services/agent/AgentCore.d.ts +21 -0
  39. package/dist/services/agent/AgentCore.d.ts.map +1 -1
  40. package/dist/services/agent/AgentCore.js +36 -2
  41. package/dist/services/agent/AgentCore.js.map +1 -1
  42. package/package.json +2 -2
  43. package/src/ui/dist/assets/{main-CdPVp07K.js → main-DkRukRjr.js} +78 -81
  44. package/src/ui/dist/assets/main-wC0IkT-I.css +1 -0
  45. package/src/ui/dist/index.html +2 -2
  46. package/src/ui/dist/assets/main-BprqUxW5.css +0 -1
@@ -1,70 +1,97 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateCommentStyleVariants = exports.normalizeVariationJsonPayload = void 0;
4
- const zod_1 = require("zod");
6
+ exports.generateCommentStyleVariants = exports.readFileExcerpts = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = require("fs");
9
+ const v3_1 = require("zod/v3");
5
10
  const logger_1 = require("../utils/logger");
6
11
  const commentVariationPrompts_1 = require("../prompts/commentVariationPrompts");
7
- const AgentCore_1 = require("./agent/AgentCore");
12
+ const GatewayClient_1 = require("./GatewayClient");
8
13
  const log = (0, logger_1.createLogger)('CommentVariationService');
9
14
  const MIN_VARIANT_COUNT = 2;
10
15
  const MAX_VARIANT_COUNT = 5;
11
- const MAX_REASONING_BLOCKS_FOR_JSON_SEARCH = 5;
12
- /** Model tuned for highest-quality structured JSON for design variants. */
13
- const DEFAULT_VARIATION_MODEL = 'claude-opus-4-6';
16
+ /**
17
+ * Sonnet 4.6 is fast enough for direction-text generation while still
18
+ * producing coherent multi-direction designs. Phase 2 (code generation) keeps
19
+ * using Opus through the agent loop where structural reasoning matters more.
20
+ */
21
+ const DEFAULT_VARIATION_MODEL = 'claude-sonnet-4-6';
14
22
  const DEFAULT_AGENT_CWD = process.cwd();
15
- const VARIATION_AGENT_SYSTEM_PROMPT = `You are a senior design systems engineer producing structured style-variation output for one selected comment target with nearby UI context.
23
+ const MAX_TOKENS = 4000;
24
+ const TEMPERATURE = 0.7;
25
+ const MAX_FILES_FOR_CONTEXT = 3;
26
+ const MAX_BYTES_PER_FILE = 6000;
27
+ const VARIATION_SYSTEM_PROMPT = `You are a senior design systems engineer producing structured style-variation output for one selected comment target with nearby UI context.
16
28
 
17
- Use provided element, sibling, and file context to propose coherent visual directions. Nearby sibling/container adjustments are allowed when necessary for a coherent result.
29
+ Use the provided element, sibling, and file context to propose coherent visual directions. Nearby sibling/container adjustments are allowed when necessary for a coherent result.
18
30
 
19
- Never modify files. Use read-only tools only to inspect context.
20
-
21
- Output JSON only. No markdown fences. No explanation text.
22
-
23
- Required shape:
24
- {"variants":[{"label":"short name","summary":"one sentence","changeSpec":"implementation instruction"}]}`;
25
- const styleVariantSchema = zod_1.z.object({
26
- label: zod_1.z.string(),
27
- summary: zod_1.z.string(),
28
- changeSpec: zod_1.z.string().optional(),
31
+ Submit your final output by calling the submit_variants tool exactly once.`;
32
+ const variantSchema = v3_1.z.object({
33
+ label: v3_1.z.string(),
34
+ summary: v3_1.z.string(),
35
+ changeSpec: v3_1.z.string(),
29
36
  });
30
- const responseSchema = zod_1.z.object({
31
- variants: zod_1.z.array(styleVariantSchema),
37
+ const responseSchema = v3_1.z.object({
38
+ variants: v3_1.z.array(variantSchema),
32
39
  });
33
- const stripCodeFences = (raw) => {
34
- let text = raw.trim();
35
- if (text.startsWith('```')) {
36
- text = text.replace(/^```(?:json)?\s*/i, '').replace(/\s*```\s*$/i, '');
37
- }
38
- return text.trim();
39
- };
40
- const normalizeVariationJsonPayload = (raw) => {
41
- const stripped = stripCodeFences(raw);
42
- const firstBrace = stripped.indexOf('{');
43
- const lastBrace = stripped.lastIndexOf('}');
44
- if (firstBrace !== -1 && lastBrace > firstBrace) {
45
- return stripped.slice(firstBrace, lastBrace + 1).trim();
46
- }
47
- return stripped;
40
+ const SUBMIT_VARIANTS_TOOL = {
41
+ name: 'submit_variants',
42
+ strict: true,
43
+ description: 'Submit the final list of style variants for the commented element. Call this exactly once with all variants.',
44
+ input_schema: {
45
+ type: 'object',
46
+ properties: {
47
+ variants: {
48
+ type: 'array',
49
+ items: {
50
+ type: 'object',
51
+ properties: {
52
+ label: { type: 'string' },
53
+ summary: { type: 'string' },
54
+ changeSpec: { type: 'string' },
55
+ },
56
+ required: ['label', 'summary', 'changeSpec'],
57
+ additionalProperties: false,
58
+ },
59
+ },
60
+ },
61
+ required: ['variants'],
62
+ additionalProperties: false,
63
+ },
48
64
  };
49
- exports.normalizeVariationJsonPayload = normalizeVariationJsonPayload;
50
- const extractJsonCandidateFromReasoning = (reasoning) => {
51
- const tailBlocks = reasoning
52
- .slice(-MAX_REASONING_BLOCKS_FOR_JSON_SEARCH)
53
- .map((block) => block.trim())
54
- .filter((block) => block.length > 0);
55
- for (let i = tailBlocks.length - 1; i >= 0; i--) {
56
- const block = tailBlocks[i];
57
- if (block.includes('{') && block.includes('"variants"')) {
58
- return block;
65
+ const readFileExcerpts = async (projectPath, element) => {
66
+ const filePaths = element.filePaths?.map((f) => f.filePath).slice(0, MAX_FILES_FOR_CONTEXT) ??
67
+ [];
68
+ const excerpts = [];
69
+ for (const relPath of filePaths) {
70
+ const absPath = path_1.default.isAbsolute(relPath)
71
+ ? relPath
72
+ : path_1.default.join(projectPath, relPath);
73
+ try {
74
+ const stat = await fs_1.promises.stat(absPath);
75
+ if (!stat.isFile())
76
+ continue;
77
+ const buf = await fs_1.promises.readFile(absPath, 'utf8');
78
+ const content = buf.length > MAX_BYTES_PER_FILE
79
+ ? buf.slice(0, MAX_BYTES_PER_FILE) + '\n... (truncated)'
80
+ : buf;
81
+ excerpts.push({ path: relPath, content });
82
+ }
83
+ catch (e) {
84
+ log.debug(`Skipping file excerpt for ${relPath}:`, e);
59
85
  }
60
86
  }
61
- if (tailBlocks.length > 0) {
62
- return tailBlocks[tailBlocks.length - 1];
63
- }
64
- throw new Error('Invalid variation response from model');
87
+ return excerpts;
65
88
  };
89
+ exports.readFileExcerpts = readFileExcerpts;
66
90
  /**
67
- * Calls agent-core in read-only mode and returns CSS-preview variants for a commented element.
91
+ * Generates style-variant directions for a commented element by calling the
92
+ * gateway directly with a forced tool-use schema. Skips the agent loop because
93
+ * direction text doesn't require codebase exploration — the relevant file
94
+ * contents are pre-loaded into the prompt.
68
95
  */
69
96
  const generateCommentStyleVariants = async ({ instruction, element, variantCount, projectPath, model, }) => {
70
97
  if (variantCount < MIN_VARIANT_COUNT ||
@@ -72,31 +99,35 @@ const generateCommentStyleVariants = async ({ instruction, element, variantCount
72
99
  !Number.isInteger(variantCount)) {
73
100
  throw new Error('variantCount must be an integer between 2 and 5');
74
101
  }
75
- const agentCore = new AgentCore_1.AgentCore();
76
- const prompt = (0, commentVariationPrompts_1.buildCommentVariationPrompt)(instruction, element, variantCount);
77
- log.info(`Comment variation prompt (to Railway):\n${prompt}`);
78
- const agentResult = await agentCore.execute({
79
- systemPrompt: VARIATION_AGENT_SYSTEM_PROMPT,
80
- userPrompt: prompt,
81
- allowedTools: ['Read', 'Glob', 'Grep'],
82
- permissionMode: 'default',
83
- cwd: projectPath || DEFAULT_AGENT_CWD,
102
+ const cwd = projectPath || DEFAULT_AGENT_CWD;
103
+ const fileExcerpts = await (0, exports.readFileExcerpts)(cwd, element);
104
+ const prompt = (0, commentVariationPrompts_1.buildCommentVariationPrompt)(instruction, element, variantCount, fileExcerpts);
105
+ log.info(`Comment variation request model=${model ?? DEFAULT_VARIATION_MODEL} files=${fileExcerpts.length} count=${variantCount}`);
106
+ const gateway = new GatewayClient_1.GatewayClient();
107
+ const startedAt = Date.now();
108
+ const toolInput = await gateway.sendToolUse({
84
109
  model: model ?? DEFAULT_VARIATION_MODEL,
85
- executionPolicy: {
86
- disableBash: true,
87
- disableSubagents: true,
88
- maxTaskCalls: 0,
89
- },
90
- onProgress: () => { },
110
+ maxTokens: MAX_TOKENS,
111
+ temperature: TEMPERATURE,
112
+ system: VARIATION_SYSTEM_PROMPT,
113
+ prompt,
114
+ tool: SUBMIT_VARIANTS_TOOL,
115
+ cacheSystemPrompt: true,
91
116
  });
92
- const rawText = extractJsonCandidateFromReasoning(agentResult.reasoning);
93
- const parsedJson = JSON.parse((0, exports.normalizeVariationJsonPayload)(rawText));
94
- const parsed = responseSchema.safeParse(parsedJson);
117
+ log.info(`Comment variation completed in ${Date.now() - startedAt}ms`);
118
+ const parsed = responseSchema.safeParse(toolInput);
95
119
  if (!parsed.success) {
96
- log.warn('Variation JSON validation failed', parsed.error.flatten());
120
+ log.warn('Variation tool input failed schema validation', {
121
+ validationError: parsed.error.flatten(),
122
+ received: toolInput,
123
+ });
97
124
  throw new Error('Invalid variation response from model');
98
125
  }
99
126
  if (parsed.data.variants.length !== variantCount) {
127
+ log.warn('Variation count mismatch', {
128
+ expected: variantCount,
129
+ received: parsed.data.variants.length,
130
+ });
100
131
  throw new Error('Invalid variation response from model');
101
132
  }
102
133
  return parsed.data.variants;
@@ -1 +1 @@
1
- {"version":3,"file":"CommentVariationService.js","sourceRoot":"","sources":["../../src/services/CommentVariationService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CommentVariationService.js","sourceRoot":"","sources":["../../src/services/CommentVariationService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type DesktopVersionPolicy = {
2
+ minimumVersion: string;
3
+ latestVersion: string;
4
+ downloadUrl?: string;
5
+ sourceTimestamp: string;
6
+ };
7
+ declare class DesktopVersionPolicyService {
8
+ private cache;
9
+ private inFlightFetch;
10
+ private readonly policyUrl;
11
+ private readonly cacheTtlMs;
12
+ private readonly fetchTimeoutMs;
13
+ constructor();
14
+ private shouldUseFreshCache;
15
+ getPolicy(): Promise<DesktopVersionPolicy | null>;
16
+ private fetchAndCachePolicy;
17
+ }
18
+ export declare const getDesktopVersionPolicyService: () => DesktopVersionPolicyService;
19
+ export declare const resetDesktopVersionPolicyServiceForTests: () => void;
20
+ export {};
21
+ //# sourceMappingURL=DesktopVersionPolicyService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesktopVersionPolicyService.d.ts","sourceRoot":"","sources":["../../src/services/DesktopVersionPolicyService.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAuEF,cAAM,2BAA2B;IAC/B,OAAO,CAAC,KAAK,CAGX;IAEF,OAAO,CAAC,aAAa,CAAqD;IAE1E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;;IAsBxC,OAAO,CAAC,mBAAmB;IAOrB,SAAS,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;YAoBzC,mBAAmB;CAmClC;AAID,eAAO,MAAM,8BAA8B,QAAO,2BAKjD,CAAC;AAEF,eAAO,MAAM,wCAAwC,QAAO,IAE3D,CAAC"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resetDesktopVersionPolicyServiceForTests = exports.getDesktopVersionPolicyService = void 0;
4
+ const logger_1 = require("../utils/logger");
5
+ const log = (0, logger_1.createLogger)('DesktopVersionPolicyService');
6
+ const DEFAULT_POLICY_URL = 'https://releases.rivet.design/desktop-version-policy.json';
7
+ const DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;
8
+ const DEFAULT_POLICY_FETCH_TIMEOUT_MS = 5000;
9
+ const normalizeSemverCore = (version) => {
10
+ const [core] = version.trim().split('-');
11
+ const parts = core.split('.');
12
+ if (parts.length !== 3) {
13
+ return null;
14
+ }
15
+ const [major, minor, patch] = parts.map((part) => Number.parseInt(part, 10));
16
+ if (!Number.isInteger(major) ||
17
+ !Number.isInteger(minor) ||
18
+ !Number.isInteger(patch)) {
19
+ return null;
20
+ }
21
+ return `${major}.${minor}.${patch}`;
22
+ };
23
+ const computeMinorFloor = (version) => {
24
+ const normalized = normalizeSemverCore(version);
25
+ if (!normalized) {
26
+ return null;
27
+ }
28
+ const [major, minor] = normalized.split('.');
29
+ return `${major}.${minor}.0`;
30
+ };
31
+ const parseDesktopVersionPolicy = (payload) => {
32
+ if (!payload || typeof payload !== 'object') {
33
+ return null;
34
+ }
35
+ const record = payload;
36
+ if (typeof record.latestVersion !== 'string') {
37
+ return null;
38
+ }
39
+ const normalizedLatest = normalizeSemverCore(record.latestVersion);
40
+ if (!normalizedLatest) {
41
+ return null;
42
+ }
43
+ const normalizedMinimumFromPayload = typeof record.minimumVersion === 'string'
44
+ ? normalizeSemverCore(record.minimumVersion)
45
+ : null;
46
+ const minimumVersion = normalizedMinimumFromPayload ?? computeMinorFloor(normalizedLatest);
47
+ if (!minimumVersion) {
48
+ return null;
49
+ }
50
+ const sourceTimestamp = typeof record.publishedAt === 'string' && record.publishedAt.length > 0
51
+ ? record.publishedAt
52
+ : new Date().toISOString();
53
+ return {
54
+ minimumVersion,
55
+ latestVersion: normalizedLatest,
56
+ downloadUrl: typeof record.downloadUrl === 'string' ? record.downloadUrl : undefined,
57
+ sourceTimestamp,
58
+ };
59
+ };
60
+ class DesktopVersionPolicyService {
61
+ cache = {
62
+ value: null,
63
+ fetchedAtMs: 0,
64
+ };
65
+ inFlightFetch = null;
66
+ policyUrl;
67
+ cacheTtlMs;
68
+ fetchTimeoutMs;
69
+ constructor() {
70
+ this.policyUrl = process.env.RIVET_DESKTOP_POLICY_URL ?? DEFAULT_POLICY_URL;
71
+ const ttlFromEnv = Number.parseInt(process.env.RIVET_DESKTOP_POLICY_CACHE_TTL_MS ?? '', 10);
72
+ this.cacheTtlMs =
73
+ Number.isInteger(ttlFromEnv) && ttlFromEnv > 0
74
+ ? ttlFromEnv
75
+ : DEFAULT_CACHE_TTL_MS;
76
+ const timeoutFromEnv = Number.parseInt(process.env.RIVET_DESKTOP_POLICY_FETCH_TIMEOUT_MS ?? '', 10);
77
+ this.fetchTimeoutMs =
78
+ Number.isInteger(timeoutFromEnv) && timeoutFromEnv > 0
79
+ ? timeoutFromEnv
80
+ : DEFAULT_POLICY_FETCH_TIMEOUT_MS;
81
+ }
82
+ shouldUseFreshCache(nowMs) {
83
+ if (this.cache.fetchedAtMs <= 0) {
84
+ return false;
85
+ }
86
+ return nowMs - this.cache.fetchedAtMs < this.cacheTtlMs;
87
+ }
88
+ async getPolicy() {
89
+ const nowMs = Date.now();
90
+ if (this.shouldUseFreshCache(nowMs)) {
91
+ return this.cache.value;
92
+ }
93
+ if (!this.inFlightFetch) {
94
+ this.inFlightFetch = this.fetchAndCachePolicy().finally(() => {
95
+ this.inFlightFetch = null;
96
+ });
97
+ }
98
+ const fetched = await this.inFlightFetch;
99
+ if (fetched) {
100
+ return fetched;
101
+ }
102
+ // Fail open: stale cached value is still returned if network fetch fails.
103
+ return this.cache.value;
104
+ }
105
+ async fetchAndCachePolicy() {
106
+ try {
107
+ const abortController = new AbortController();
108
+ const timeoutId = setTimeout(() => abortController.abort(), this.fetchTimeoutMs);
109
+ const response = await fetch(this.policyUrl, {
110
+ signal: abortController.signal,
111
+ }).finally(() => {
112
+ clearTimeout(timeoutId);
113
+ });
114
+ if (!response.ok) {
115
+ throw new Error(`Policy request failed with status ${response.status}`);
116
+ }
117
+ const parsed = parseDesktopVersionPolicy(await response.json());
118
+ if (!parsed) {
119
+ throw new Error('Policy payload shape is invalid');
120
+ }
121
+ this.cache = {
122
+ value: parsed,
123
+ fetchedAtMs: Date.now(),
124
+ };
125
+ return parsed;
126
+ }
127
+ catch (error) {
128
+ log.warn('Failed to fetch desktop version policy:', error);
129
+ // Negative cache failures so repeated /api/config calls don't trigger
130
+ // a fresh network timeout every time while the policy endpoint is down.
131
+ this.cache = {
132
+ value: this.cache.value,
133
+ fetchedAtMs: Date.now(),
134
+ };
135
+ return null;
136
+ }
137
+ }
138
+ }
139
+ let instance = null;
140
+ const getDesktopVersionPolicyService = () => {
141
+ if (!instance) {
142
+ instance = new DesktopVersionPolicyService();
143
+ }
144
+ return instance;
145
+ };
146
+ exports.getDesktopVersionPolicyService = getDesktopVersionPolicyService;
147
+ const resetDesktopVersionPolicyServiceForTests = () => {
148
+ instance = null;
149
+ };
150
+ exports.resetDesktopVersionPolicyServiceForTests = resetDesktopVersionPolicyServiceForTests;
151
+ //# sourceMappingURL=DesktopVersionPolicyService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesktopVersionPolicyService.js","sourceRoot":"","sources":["../../src/services/DesktopVersionPolicyService.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,21 @@ type GatewayRequestOptions = {
4
4
  temperature: number;
5
5
  prompt: string;
6
6
  };
7
+ type GatewayToolUseOptions = {
8
+ model: string;
9
+ maxTokens: number;
10
+ temperature: number;
11
+ system: string;
12
+ prompt: string;
13
+ tool: {
14
+ name: string;
15
+ description: string;
16
+ input_schema: Record<string, unknown>;
17
+ strict?: boolean;
18
+ };
19
+ /** Wrap the system prompt in a cache_control block for prompt caching. */
20
+ cacheSystemPrompt?: boolean;
21
+ };
7
22
  export declare const asReasonText: (value: unknown) => string;
8
23
  /**
9
24
  * Sends authenticated requests to the Rivet LLM gateway.
@@ -16,7 +31,14 @@ export declare class GatewayClient {
16
31
  constructor(gatewayUrl?: string, proxyUrl?: string);
17
32
  /** Send a message to the gateway and return the raw text response. */
18
33
  sendMessage(options: GatewayRequestOptions): Promise<string>;
19
- private makeRequest;
34
+ /**
35
+ * Send a request that forces the model to invoke a single tool, and return
36
+ * the parsed `input` of that tool call. Throws if the model didn't call the
37
+ * tool (which the API guarantees won't happen with `tool_choice: { type:
38
+ * 'tool' }`, but we check anyway).
39
+ */
40
+ sendToolUse<TInput>(options: GatewayToolUseOptions): Promise<TInput>;
41
+ private postMessages;
20
42
  /** Refresh the access token using the stored refresh token. */
21
43
  private refreshAccessToken;
22
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GatewayClient.d.ts","sourceRoot":"","sources":["../../src/services/GatewayClient.ts"],"names":[],"mappings":"AAMA,KAAK,qBAAqB,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAsB7C,CAAC;AAEF;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAKlD,sEAAsE;IAChE,WAAW,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;YAIpD,WAAW;IAyEzB,+DAA+D;YACjD,kBAAkB;CAoCjC"}
1
+ {"version":3,"file":"GatewayClient.d.ts","sourceRoot":"","sources":["../../src/services/GatewayClient.ts"],"names":[],"mappings":"AAMA,KAAK,qBAAqB,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAsB7C,CAAC;AAEF;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAKlD,sEAAsE;IAChE,WAAW,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBlE;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;YA0B5D,YAAY;IAmE1B,+DAA+D;YACjD,kBAAkB;CAoCjC"}
@@ -44,38 +44,73 @@ class GatewayClient {
44
44
  }
45
45
  /** Send a message to the gateway and return the raw text response. */
46
46
  async sendMessage(options) {
47
- return this.makeRequest(options, 0);
47
+ const result = await this.postMessages({
48
+ model: options.model,
49
+ max_tokens: options.maxTokens,
50
+ temperature: options.temperature,
51
+ messages: [{ role: 'user', content: options.prompt }],
52
+ }, 0);
53
+ const content = result.content?.[0]?.text;
54
+ if (!content) {
55
+ throw new Error('No response content from LLM');
56
+ }
57
+ return content;
58
+ }
59
+ /**
60
+ * Send a request that forces the model to invoke a single tool, and return
61
+ * the parsed `input` of that tool call. Throws if the model didn't call the
62
+ * tool (which the API guarantees won't happen with `tool_choice: { type:
63
+ * 'tool' }`, but we check anyway).
64
+ */
65
+ async sendToolUse(options) {
66
+ const systemContent = options.cacheSystemPrompt
67
+ ? [{ type: 'text', text: options.system, cache_control: { type: 'ephemeral' } }]
68
+ : options.system;
69
+ const result = await this.postMessages({
70
+ model: options.model,
71
+ max_tokens: options.maxTokens,
72
+ temperature: options.temperature,
73
+ system: systemContent,
74
+ messages: [{ role: 'user', content: options.prompt }],
75
+ tools: [options.tool],
76
+ tool_choice: { type: 'tool', name: options.tool.name },
77
+ }, 0, { enableCaching: options.cacheSystemPrompt });
78
+ const toolUse = result.content
79
+ ?.find((b) => b.type === 'tool_use');
80
+ if (!toolUse || toolUse.input === undefined) {
81
+ throw new Error('Model did not return a tool_use block');
82
+ }
83
+ return toolUse.input;
48
84
  }
49
- async makeRequest(options, retryCount) {
85
+ async postMessages(body, retryCount, options) {
50
86
  const authToken = this.configManager.getAuthToken();
51
87
  if (!authToken) {
52
88
  throw new Error('Not authenticated. Please run `rivet login` to authenticate.');
53
89
  }
90
+ const headers = {
91
+ Authorization: `Bearer ${authToken}`,
92
+ 'Content-Type': 'application/json',
93
+ 'anthropic-version': '2023-06-01',
94
+ };
95
+ if (options?.enableCaching) {
96
+ headers['anthropic-beta'] = 'prompt-caching-2024-07-31';
97
+ }
54
98
  const response = await fetch(`${this.gatewayUrl}/v1/messages`, {
55
99
  method: 'POST',
56
- headers: {
57
- Authorization: `Bearer ${authToken}`,
58
- 'Content-Type': 'application/json',
59
- 'anthropic-version': '2023-06-01',
60
- },
61
- body: JSON.stringify({
62
- model: options.model,
63
- max_tokens: options.maxTokens,
64
- temperature: options.temperature,
65
- messages: [{ role: 'user', content: options.prompt }],
66
- }),
100
+ headers,
101
+ body: JSON.stringify({ ...body, service_tier: 'auto' }),
67
102
  });
68
103
  // Handle 401 — could be token expiry or a spend limit rejection from the gateway
69
104
  if (response.status === 401 && retryCount === 0) {
70
- const body = await response.json().catch(() => ({}));
71
- const reason = (0, exports.asReasonText)(body.message ?? body.error ?? body);
105
+ const errBody = await response.json().catch(() => ({}));
106
+ const reason = (0, exports.asReasonText)(errBody.message ?? errBody.error ?? errBody);
72
107
  if (reason.includes('SPEND_LIMIT_EXCEEDED:')) {
73
108
  throw new Error(reason);
74
109
  }
75
110
  log.warn('Token expired, attempting to refresh...');
76
111
  const isRefreshed = await this.refreshAccessToken();
77
112
  if (isRefreshed) {
78
- return this.makeRequest(options, retryCount + 1);
113
+ return this.postMessages(body, retryCount + 1, options);
79
114
  }
80
115
  throw new Error('Authentication expired. Please run `rivet logout` and `rivet login` to re-authenticate.');
81
116
  }
@@ -93,12 +128,7 @@ class GatewayClient {
93
128
  .catch(() => 'Unable to read error');
94
129
  throw new Error(`Gateway request failed (${response.status}): ${errorText}`);
95
130
  }
96
- const result = await response.json();
97
- const content = result.content?.[0]?.text;
98
- if (!content) {
99
- throw new Error('No response content from LLM');
100
- }
101
- return content;
131
+ return response.json();
102
132
  }
103
133
  /** Refresh the access token using the stored refresh token. */
104
134
  async refreshAccessToken() {
@@ -1 +1 @@
1
- {"version":3,"file":"GatewayClient.js","sourceRoot":"","sources":["../../src/services/GatewayClient.ts"],"names":[],"mappings":";;;AAAA,4CAA+C;AAC/C,mDAAmD;AACnD,2CAAyD;AAEzD,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,eAAe,CAAC,CAAC;AASnC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAU,EAAE;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,KAA+C,CAAC;QAClE,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,SAAS,CAAC,OAAO,CAAC;QAC3B,CAAC;QACD,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,SAAS,CAAC,KAAK,CAAC;QACzB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAtBW,QAAA,YAAY,gBAsBvB;AAEF;;;GAGG;AACH,MAAa,aAAa;IAChB,aAAa,GAAG,IAAA,gCAAgB,GAAE,CAAC;IACnC,UAAU,CAAS;IACnB,QAAQ,CAAS;IAEzB,YAAY,UAAmB,EAAE,QAAiB;QAChD,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,mBAAW,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,iBAAS,CAAC;IACxC,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,WAAW,CAAC,OAA8B;QAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,OAA8B,EAC9B,UAAkB;QAElB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,cAAc,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,SAAS,EAAE;gBACpC,cAAc,EAAE,kBAAkB;gBAClC,mBAAmB,EAAE,YAAY;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU,EAAE,OAAO,CAAC,SAAS;gBAC7B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;aACtD,CAAC;SACH,CAAC,CAAC;QAEH,iFAAiF;QACjF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;YAChE,IAAI,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACpD,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;YACnE,IAAI,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,IAAI,KAAK,CACb,MAAM,IAAI,gDAAgD,CAC3D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ;iBAC7B,IAAI,EAAE;iBACN,KAAK,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,2BAA2B,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAC5D,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,+DAA+D;IACvD,KAAK,CAAC,kBAAkB;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;QAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,mBAAmB,EAAE;gBAChE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;aACvC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBACjC,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAClD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBACrE,GAAG,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;gBAChD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AA7HD,sCA6HC"}
1
+ {"version":3,"file":"GatewayClient.js","sourceRoot":"","sources":["../../src/services/GatewayClient.ts"],"names":[],"mappings":"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"}
@@ -24,9 +24,16 @@ type GenerateParams = {
24
24
  instruction: string;
25
25
  element: ElementContext;
26
26
  variants: VariantInput[];
27
+ /**
28
+ * Diff currently applied to the main project tree (e.g. a finalized variant
29
+ * from another comment). Reversed before worktrees are created so each
30
+ * variant's diff is captured against the user's clean state, then re-applied
31
+ * after generation completes so the iframe doesn't visibly lose state.
32
+ */
33
+ currentAppliedDiff?: string;
27
34
  onEvent: (event: VariantCodeEvent) => void;
28
35
  abortController?: AbortController;
29
36
  };
30
- export declare const generateVariantCode: ({ sessionId, projectPath, instruction, element, variants, onEvent, abortController, }: GenerateParams) => Promise<void>;
37
+ export declare const generateVariantCode: ({ sessionId, projectPath, instruction, element, variants, currentAppliedDiff, onEvent, abortController, }: GenerateParams) => Promise<void>;
31
38
  export {};
32
39
  //# sourceMappingURL=VariantCodeGeneratorService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VariantCodeGeneratorService.d.ts","sourceRoot":"","sources":["../../src/services/VariantCodeGeneratorService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEjC,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AA2BF,eAAO,MAAM,mBAAmB,GAAU,uFAQvC,cAAc,KAAG,OAAO,CAAC,IAAI,CAuC/B,CAAC"}
1
+ {"version":3,"file":"VariantCodeGeneratorService.d.ts","sourceRoot":"","sources":["../../src/services/VariantCodeGeneratorService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEjC,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAsCF,eAAO,MAAM,mBAAmB,GAAU,2GASvC,cAAc,KAAG,OAAO,CAAC,IAAI,CAiF/B,CAAC"}