rivet-design 0.8.4 → 0.8.6
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.
- package/dist/config/evaluateFlags.d.ts.map +1 -1
- package/dist/config/evaluateFlags.js +13 -4
- package/dist/config/evaluateFlags.js.map +1 -1
- package/dist/config/flags.d.ts +3 -0
- package/dist/config/flags.d.ts.map +1 -1
- package/dist/config/flags.js +1 -0
- package/dist/config/flags.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +11 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -1
- package/dist/server.js.map +1 -1
- package/dist/services/CommentVariationService.d.ts +3 -1
- package/dist/services/CommentVariationService.d.ts.map +1 -1
- package/dist/services/CommentVariationService.js +5 -2
- package/dist/services/CommentVariationService.js.map +1 -1
- package/dist/services/DesktopVersionPolicyService.d.ts +21 -0
- package/dist/services/DesktopVersionPolicyService.d.ts.map +1 -0
- package/dist/services/DesktopVersionPolicyService.js +151 -0
- package/dist/services/DesktopVersionPolicyService.js.map +1 -0
- package/dist/services/FeatureFlagService.d.ts +5 -0
- package/dist/services/FeatureFlagService.d.ts.map +1 -1
- package/dist/services/FeatureFlagService.js +18 -0
- package/dist/services/FeatureFlagService.js.map +1 -1
- package/dist/services/GatewayClient.d.ts +3 -0
- package/dist/services/GatewayClient.d.ts.map +1 -1
- package/dist/services/GatewayClient.js +17 -10
- package/dist/services/GatewayClient.js.map +1 -1
- package/dist/services/VariantCodeGeneratorService.d.ts.map +1 -1
- package/dist/services/VariantCodeGeneratorService.js +17 -5
- package/dist/services/VariantCodeGeneratorService.js.map +1 -1
- package/package.json +1 -1
- package/src/ui/dist/assets/{main-CFAr6Qon.js → main-DpcUh_b_.js} +108 -108
- package/src/ui/dist/assets/main-wC0IkT-I.css +1 -0
- package/src/ui/dist/index.html +2 -2
- package/src/ui/dist/assets/main-DcbpRHzm.css +0 -1
|
@@ -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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"}
|
|
@@ -11,6 +11,11 @@ declare class FeatureFlagService {
|
|
|
11
11
|
* Fetch all flags for the current user in a single request.
|
|
12
12
|
*/
|
|
13
13
|
getAllFlags(): Promise<Record<string, boolean | string>>;
|
|
14
|
+
/**
|
|
15
|
+
* Evaluate a single flag for the current user.
|
|
16
|
+
* Useful when a flag key is missing from getAllFlags() (e.g. inactive flags).
|
|
17
|
+
*/
|
|
18
|
+
isFeatureEnabled(key: string): Promise<boolean | null>;
|
|
14
19
|
shutdown(): Promise<void>;
|
|
15
20
|
}
|
|
16
21
|
export declare function getFeatureFlagService(): FeatureFlagService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureFlagService.d.ts","sourceRoot":"","sources":["../../src/services/FeatureFlagService.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,cAAM,kBAAkB;IACtB,OAAO,CAAC,OAAO,CAAwB;;IAgBvC,OAAO,KAAK,UAAU,GAErB;IAED;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"FeatureFlagService.d.ts","sourceRoot":"","sources":["../../src/services/FeatureFlagService.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,cAAM,kBAAkB;IACtB,OAAO,CAAC,OAAO,CAAwB;;IAgBvC,OAAO,KAAK,UAAU,GAErB;IAED;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;IAW9D;;;OAGG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IActD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC;AAID,wBAAgB,qBAAqB,IAAI,kBAAkB,CAK1D"}
|
|
@@ -45,6 +45,24 @@ class FeatureFlagService {
|
|
|
45
45
|
return {};
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Evaluate a single flag for the current user.
|
|
50
|
+
* Useful when a flag key is missing from getAllFlags() (e.g. inactive flags).
|
|
51
|
+
*/
|
|
52
|
+
async isFeatureEnabled(key) {
|
|
53
|
+
if (!this.posthog)
|
|
54
|
+
return null;
|
|
55
|
+
try {
|
|
56
|
+
const enabled = await this.posthog.isFeatureEnabled(key, this.distinctId);
|
|
57
|
+
// PostHog can return undefined for flags that are inactive/unresolved.
|
|
58
|
+
// Treat unresolved as disabled; reserve null for transport/runtime failures.
|
|
59
|
+
return enabled ?? false;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
log.warn(`Failed to evaluate feature flag "${key}":`, error);
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
48
66
|
async shutdown() {
|
|
49
67
|
if (this.posthog) {
|
|
50
68
|
await this.posthog.shutdown();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureFlagService.js","sourceRoot":"","sources":["../../src/services/FeatureFlagService.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"FeatureFlagService.js","sourceRoot":"","sources":["../../src/services/FeatureFlagService.ts"],"names":[],"mappings":";;AA6EA,sDAKC;AAlFD,+CAAuC;AACvC,4CAA+C;AAC/C,mDAAmD;AAEnD,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,oBAAoB,CAAC,CAAC;AAE/C,MAAM,sBAAsB,GAAG,gDAAgD,CAAC;AAChF,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAEvD;;;;GAIG;AACH,MAAM,kBAAkB;IACd,OAAO,GAAmB,IAAI,CAAC;IAEvC;QACE,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAO,CAAC,sBAAsB,EAAE;gBACjD,IAAI,EAAE,mBAAmB;gBACzB,sEAAsE;gBACtE,OAAO,EAAE,CAAC;gBACV,aAAa,EAAE,CAAC;aACjB,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,IAAY,UAAU;QACpB,OAAO,IAAA,gCAAgB,GAAE,CAAC,QAAQ,EAAE,IAAI,IAAA,gCAAgB,GAAE,CAAC,cAAc,EAAE,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,GAAW;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1E,uEAAuE;YACvE,6EAA6E;YAC7E,OAAO,OAAO,IAAI,KAAK,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,oCAAoC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;CACF;AAED,IAAI,QAAQ,GAA8B,IAAI,CAAC;AAE/C,SAAgB,qBAAqB;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -14,7 +14,10 @@ type GatewayToolUseOptions = {
|
|
|
14
14
|
name: string;
|
|
15
15
|
description: string;
|
|
16
16
|
input_schema: Record<string, unknown>;
|
|
17
|
+
strict?: boolean;
|
|
17
18
|
};
|
|
19
|
+
/** Wrap the system prompt in a cache_control block for prompt caching. */
|
|
20
|
+
cacheSystemPrompt?: boolean;
|
|
18
21
|
};
|
|
19
22
|
export declare const asReasonText: (value: unknown) => string;
|
|
20
23
|
/**
|
|
@@ -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,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;
|
|
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"}
|
|
@@ -63,15 +63,18 @@ class GatewayClient {
|
|
|
63
63
|
* 'tool' }`, but we check anyway).
|
|
64
64
|
*/
|
|
65
65
|
async sendToolUse(options) {
|
|
66
|
+
const systemContent = options.cacheSystemPrompt
|
|
67
|
+
? [{ type: 'text', text: options.system, cache_control: { type: 'ephemeral' } }]
|
|
68
|
+
: options.system;
|
|
66
69
|
const result = await this.postMessages({
|
|
67
70
|
model: options.model,
|
|
68
71
|
max_tokens: options.maxTokens,
|
|
69
72
|
temperature: options.temperature,
|
|
70
|
-
system:
|
|
73
|
+
system: systemContent,
|
|
71
74
|
messages: [{ role: 'user', content: options.prompt }],
|
|
72
75
|
tools: [options.tool],
|
|
73
76
|
tool_choice: { type: 'tool', name: options.tool.name },
|
|
74
|
-
}, 0);
|
|
77
|
+
}, 0, { enableCaching: options.cacheSystemPrompt });
|
|
75
78
|
const toolUse = result.content
|
|
76
79
|
?.find((b) => b.type === 'tool_use');
|
|
77
80
|
if (!toolUse || toolUse.input === undefined) {
|
|
@@ -79,19 +82,23 @@ class GatewayClient {
|
|
|
79
82
|
}
|
|
80
83
|
return toolUse.input;
|
|
81
84
|
}
|
|
82
|
-
async postMessages(body, retryCount) {
|
|
85
|
+
async postMessages(body, retryCount, options) {
|
|
83
86
|
const authToken = this.configManager.getAuthToken();
|
|
84
87
|
if (!authToken) {
|
|
85
88
|
throw new Error('Not authenticated. Please run `rivet login` to authenticate.');
|
|
86
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
|
+
}
|
|
87
98
|
const response = await fetch(`${this.gatewayUrl}/v1/messages`, {
|
|
88
99
|
method: 'POST',
|
|
89
|
-
headers
|
|
90
|
-
|
|
91
|
-
'Content-Type': 'application/json',
|
|
92
|
-
'anthropic-version': '2023-06-01',
|
|
93
|
-
},
|
|
94
|
-
body: JSON.stringify(body),
|
|
100
|
+
headers,
|
|
101
|
+
body: JSON.stringify({ ...body, service_tier: 'auto' }),
|
|
95
102
|
});
|
|
96
103
|
// Handle 401 — could be token expiry or a spend limit rejection from the gateway
|
|
97
104
|
if (response.status === 401 && retryCount === 0) {
|
|
@@ -103,7 +110,7 @@ class GatewayClient {
|
|
|
103
110
|
log.warn('Token expired, attempting to refresh...');
|
|
104
111
|
const isRefreshed = await this.refreshAccessToken();
|
|
105
112
|
if (isRefreshed) {
|
|
106
|
-
return this.postMessages(body, retryCount + 1);
|
|
113
|
+
return this.postMessages(body, retryCount + 1, options);
|
|
107
114
|
}
|
|
108
115
|
throw new Error('Authentication expired. Please run `rivet logout` and `rivet login` to re-authenticate.');
|
|
109
116
|
}
|
|
@@ -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;
|
|
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;AAyBnC,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,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CACpC;YACE,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACtD,EACD,CAAC,CACF,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAS,OAA8B;QACtD,MAAM,aAAa,GAAG,OAAO,CAAC,iBAAiB;YAC7C,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;YAChF,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CACpC;YACE,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YACrD,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;YACrB,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;SACvD,EACD,CAAC,EACD,EAAE,aAAa,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAC7C,CAAC;QAEF,MAAM,OAAO,GAAI,MAAM,CAAC,OAAoD;YAC1E,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,OAAO,CAAC,KAAe,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,IAA6B,EAC7B,UAAkB,EAClB,OAAqC;QAErC,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,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,SAAS,EAAE;YACpC,cAAc,EAAE,kBAAkB;YAClC,mBAAmB,EAAE,YAAY;SAClC,CAAC;QACF,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,gBAAgB,CAAC,GAAG,2BAA2B,CAAC;QAC1D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,UAAU,cAAc,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;SACxD,CAAC,CAAC;QAEH,iFAAiF;QACjF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC;YACzE,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,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1D,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,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,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;AArKD,sCAqKC"}
|
|
@@ -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;
|
|
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"}
|
|
@@ -4,12 +4,18 @@ exports.generateVariantCode = void 0;
|
|
|
4
4
|
const AgentCore_1 = require("./agent/AgentCore");
|
|
5
5
|
const WorktreeManager_1 = require("./WorktreeManager");
|
|
6
6
|
const logger_1 = require("../utils/logger");
|
|
7
|
+
const CommentVariationService_1 = require("./CommentVariationService");
|
|
7
8
|
const log = (0, logger_1.createLogger)('VariantCodeGeneratorService');
|
|
8
|
-
const buildAgentPrompt = (instruction, changeSpec, element) => {
|
|
9
|
+
const buildAgentPrompt = (instruction, changeSpec, element, fileExcerpts) => {
|
|
9
10
|
const filePath = element.filePaths?.[0]?.filePath ?? 'unknown';
|
|
10
11
|
const componentTree = element.componentTree
|
|
11
12
|
? element.componentTree.map((n) => n.name).join(' > ')
|
|
12
13
|
: '';
|
|
14
|
+
const fileSection = fileExcerpts.length > 0
|
|
15
|
+
? `\nRelevant source files (use these directly — no need to re-read):\n${fileExcerpts
|
|
16
|
+
.map((f) => `\`\`\`\n// ${f.path}\n${f.content}\n\`\`\``)
|
|
17
|
+
.join('\n\n')}`
|
|
18
|
+
: '';
|
|
13
19
|
return `Implement this design direction in the codebase.
|
|
14
20
|
|
|
15
21
|
Original user instruction: ${instruction}
|
|
@@ -22,8 +28,10 @@ Target element:
|
|
|
22
28
|
- Tag: <${element.tagName}>
|
|
23
29
|
- Component hierarchy: ${componentTree}
|
|
24
30
|
- Text content: ${element.textContent?.slice(0, 80) ?? '(none)'}
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
${fileSection}
|
|
32
|
+
${fileExcerpts.length > 0
|
|
33
|
+
? 'Implement exactly the design direction described above using the file contents above as your starting point.'
|
|
34
|
+
: 'Read the relevant source files, then implement exactly the design direction described above.'} Focus only on this specific change. Make the minimal changes needed to achieve the direction. Do not make unrelated modifications.`;
|
|
27
35
|
};
|
|
28
36
|
const generateVariantCode = async ({ sessionId, projectPath, instruction, element, variants, currentAppliedDiff, onEvent, abortController, }) => {
|
|
29
37
|
const manager = new WorktreeManager_1.WorktreeManager(projectPath);
|
|
@@ -48,6 +56,7 @@ const generateVariantCode = async ({ sessionId, projectPath, instruction, elemen
|
|
|
48
56
|
}
|
|
49
57
|
}
|
|
50
58
|
try {
|
|
59
|
+
const fileExcerpts = await (0, CommentVariationService_1.readFileExcerpts)(projectPath, element);
|
|
51
60
|
worktreePaths = await manager.createWorktrees(sessionId, variants.length);
|
|
52
61
|
await Promise.all(variants.map(async (variant, i) => {
|
|
53
62
|
const worktreePath = worktreePaths[i];
|
|
@@ -55,13 +64,16 @@ const generateVariantCode = async ({ sessionId, projectPath, instruction, elemen
|
|
|
55
64
|
try {
|
|
56
65
|
const agentCore = new AgentCore_1.AgentCore();
|
|
57
66
|
await agentCore.execute({
|
|
58
|
-
systemPrompt:
|
|
59
|
-
|
|
67
|
+
systemPrompt: fileExcerpts.length > 0
|
|
68
|
+
? 'You are a frontend engineer implementing a specific design direction. The relevant source files are already provided in the prompt — use them directly without re-reading. Make the targeted code change described. Minimal, focused changes only.'
|
|
69
|
+
: 'You are a frontend engineer implementing a specific design direction. Read the relevant files, then make the targeted code change described. Minimal, focused changes only.',
|
|
70
|
+
userPrompt: buildAgentPrompt(instruction, variant.changeSpec, element, fileExcerpts),
|
|
60
71
|
allowedTools: ['Read', 'Glob', 'Grep', 'Edit', 'Write'],
|
|
61
72
|
permissionMode: 'bypassPermissions',
|
|
62
73
|
cwd: worktreePath,
|
|
63
74
|
abortController,
|
|
64
75
|
onProgress: () => { },
|
|
76
|
+
executionPolicy: { disableSubagents: true },
|
|
65
77
|
});
|
|
66
78
|
const diff = await manager.getDiff(worktreePath);
|
|
67
79
|
onEvent({ type: 'variant_completed', variantIndex: variant.index, diff });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariantCodeGeneratorService.js","sourceRoot":"","sources":["../../src/services/VariantCodeGeneratorService.ts"],"names":[],"mappings":";;;AAAA,iDAA8C;AAC9C,uDAAoD;AAEpD,4CAA+C;
|
|
1
|
+
{"version":3,"file":"VariantCodeGeneratorService.js","sourceRoot":"","sources":["../../src/services/VariantCodeGeneratorService.ts"],"names":[],"mappings":"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"}
|