@agent-native/core 0.2.1 → 0.2.7-dev.712fefc
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/README.md +122 -0
- package/dist/adapters/firestore/adapter.d.ts +47 -0
- package/dist/adapters/firestore/adapter.d.ts.map +1 -0
- package/dist/adapters/firestore/adapter.js +45 -0
- package/dist/adapters/firestore/adapter.js.map +1 -0
- package/dist/adapters/firestore/index.d.ts +3 -3
- package/dist/adapters/firestore/index.d.ts.map +1 -1
- package/dist/adapters/firestore/index.js +2 -3
- package/dist/adapters/firestore/index.js.map +1 -1
- package/dist/adapters/neon/adapter.d.ts +28 -0
- package/dist/adapters/neon/adapter.d.ts.map +1 -0
- package/dist/adapters/neon/adapter.js +119 -0
- package/dist/adapters/neon/adapter.js.map +1 -0
- package/dist/adapters/neon/index.d.ts +3 -0
- package/dist/adapters/neon/index.d.ts.map +1 -0
- package/dist/adapters/neon/index.js +3 -0
- package/dist/adapters/neon/index.js.map +1 -0
- package/dist/adapters/supabase/adapter.d.ts +42 -0
- package/dist/adapters/supabase/adapter.d.ts.map +1 -0
- package/dist/adapters/supabase/adapter.js +126 -0
- package/dist/adapters/supabase/adapter.js.map +1 -0
- package/dist/adapters/supabase/index.d.ts +3 -0
- package/dist/adapters/supabase/index.d.ts.map +1 -0
- package/dist/adapters/supabase/index.js +3 -0
- package/dist/adapters/supabase/index.js.map +1 -0
- package/dist/adapters/{firestore → sync}/config.d.ts +1 -1
- package/dist/adapters/sync/config.d.ts.map +1 -0
- package/dist/adapters/{firestore → sync}/config.js +1 -1
- package/dist/adapters/sync/config.js.map +1 -0
- package/dist/adapters/{firestore/sync.d.ts → sync/file-sync.d.ts} +6 -37
- package/dist/adapters/sync/file-sync.d.ts.map +1 -0
- package/dist/adapters/{firestore/sync.js → sync/file-sync.js} +45 -59
- package/dist/adapters/sync/file-sync.js.map +1 -0
- package/dist/adapters/sync/index.d.ts +5 -0
- package/dist/adapters/sync/index.d.ts.map +1 -0
- package/dist/adapters/sync/index.js +4 -0
- package/dist/adapters/sync/index.js.map +1 -0
- package/dist/adapters/sync/merge.d.ts.map +1 -0
- package/dist/adapters/sync/merge.js.map +1 -0
- package/dist/adapters/sync/types.d.ts +28 -0
- package/dist/adapters/sync/types.d.ts.map +1 -0
- package/dist/adapters/sync/types.js +2 -0
- package/dist/adapters/sync/types.js.map +1 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +41 -3
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +15 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/client/components/ApiKeySettings.d.ts +12 -0
- package/dist/client/components/ApiKeySettings.d.ts.map +1 -0
- package/dist/client/components/ApiKeySettings.js +203 -0
- package/dist/client/components/ApiKeySettings.js.map +1 -0
- package/dist/client/components/MissingKeyCard.d.ts +7 -0
- package/dist/client/components/MissingKeyCard.d.ts.map +1 -0
- package/dist/client/components/MissingKeyCard.js +27 -0
- package/dist/client/components/MissingKeyCard.js.map +1 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/use-file-watcher.d.ts.map +1 -1
- package/dist/client/use-file-watcher.js +24 -14
- package/dist/client/use-file-watcher.js.map +1 -1
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/scripts/runner.js +1 -1
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/create-server.d.ts +11 -0
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +102 -0
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/missing-key.d.ts +17 -0
- package/dist/server/missing-key.d.ts.map +1 -0
- package/dist/server/missing-key.js +17 -0
- package/dist/server/missing-key.js.map +1 -0
- package/dist/shared/agent-env.d.ts +23 -0
- package/dist/shared/agent-env.d.ts.map +1 -0
- package/dist/shared/agent-env.js +36 -0
- package/dist/shared/agent-env.js.map +1 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +31 -0
- package/dist/vite/client.js.map +1 -1
- package/package.json +27 -5
- package/src/templates/default/.claude/settings.json +68 -0
- package/src/templates/default/AGENTS.md +4 -0
- package/src/templates/default/data/.gitkeep +0 -0
- package/src/templates/default/learnings.md +0 -0
- package/dist/adapters/firestore/config.d.ts.map +0 -1
- package/dist/adapters/firestore/config.js.map +0 -1
- package/dist/adapters/firestore/merge.d.ts.map +0 -1
- package/dist/adapters/firestore/merge.js.map +0 -1
- package/dist/adapters/firestore/sync.d.ts.map +0 -1
- package/dist/adapters/firestore/sync.js.map +0 -1
- /package/dist/adapters/{firestore → sync}/merge.d.ts +0 -0
- /package/dist/adapters/{firestore → sync}/merge.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiKeySettings.d.ts","sourceRoot":"","sources":["../../../src/client/components/ApiKeySettings.tsx"],"names":[],"mappings":"AASA,UAAU,mBAAmB;IAC3B,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,YAAY,EAAE,aAA2B,EAAE,EAAE,mBAAmB,2CA+JhG"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useCallback } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Reusable component that shows the status of configured API keys
|
|
5
|
+
* and lets users enter missing ones. Fetches from /api/env-status
|
|
6
|
+
* and saves via POST /api/env-vars.
|
|
7
|
+
*/
|
|
8
|
+
export function ApiKeySettings({ settingsPath: _settingsPath = "/settings" }) {
|
|
9
|
+
const [keys, setKeys] = useState([]);
|
|
10
|
+
const [loading, setLoading] = useState(true);
|
|
11
|
+
const [error, setError] = useState(null);
|
|
12
|
+
const [values, setValues] = useState({});
|
|
13
|
+
const [saving, setSaving] = useState(false);
|
|
14
|
+
const [saveResult, setSaveResult] = useState(null);
|
|
15
|
+
const fetchStatus = useCallback(async () => {
|
|
16
|
+
try {
|
|
17
|
+
setLoading(true);
|
|
18
|
+
setError(null);
|
|
19
|
+
const res = await fetch("/api/env-status");
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
throw new Error(`Failed to fetch env status: ${res.status}`);
|
|
22
|
+
}
|
|
23
|
+
const data = await res.json();
|
|
24
|
+
setKeys(data);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
setError(err instanceof Error ? err.message : "Failed to load API key status");
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
setLoading(false);
|
|
31
|
+
}
|
|
32
|
+
}, []);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
fetchStatus();
|
|
35
|
+
}, [fetchStatus]);
|
|
36
|
+
const handleValueChange = (key, value) => {
|
|
37
|
+
setValues((prev) => ({ ...prev, [key]: value }));
|
|
38
|
+
setSaveResult(null);
|
|
39
|
+
};
|
|
40
|
+
const handleSave = async () => {
|
|
41
|
+
const vars = Object.entries(values)
|
|
42
|
+
.filter(([, v]) => v.trim() !== "")
|
|
43
|
+
.map(([key, value]) => ({ key, value: value.trim() }));
|
|
44
|
+
if (vars.length === 0)
|
|
45
|
+
return;
|
|
46
|
+
setSaving(true);
|
|
47
|
+
setSaveResult(null);
|
|
48
|
+
try {
|
|
49
|
+
const res = await fetch("/api/env-vars", {
|
|
50
|
+
method: "POST",
|
|
51
|
+
headers: { "Content-Type": "application/json" },
|
|
52
|
+
body: JSON.stringify({ vars }),
|
|
53
|
+
});
|
|
54
|
+
if (!res.ok) {
|
|
55
|
+
const data = await res.json().catch(() => ({}));
|
|
56
|
+
throw new Error(data.error || `Save failed: ${res.status}`);
|
|
57
|
+
}
|
|
58
|
+
const data = await res.json();
|
|
59
|
+
setSaveResult({ ok: true, message: `Saved ${data.saved?.length ?? 0} key(s)` });
|
|
60
|
+
setValues({});
|
|
61
|
+
// Refresh status
|
|
62
|
+
await fetchStatus();
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
setSaveResult({
|
|
66
|
+
ok: false,
|
|
67
|
+
message: err instanceof Error ? err.message : "Save failed",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
setSaving(false);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const pendingCount = Object.values(values).filter((v) => v.trim() !== "").length;
|
|
75
|
+
if (loading) {
|
|
76
|
+
return (_jsx("div", { style: styles.container, children: _jsx("p", { style: styles.loadingText, children: "Loading API key status..." }) }));
|
|
77
|
+
}
|
|
78
|
+
if (error) {
|
|
79
|
+
return (_jsxs("div", { style: styles.container, children: [_jsx("p", { style: styles.errorText, children: error }), _jsx("button", { onClick: fetchStatus, style: styles.retryButton, children: "Retry" })] }));
|
|
80
|
+
}
|
|
81
|
+
if (keys.length === 0) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const configuredKeys = keys.filter((k) => k.configured);
|
|
85
|
+
const unconfiguredKeys = keys.filter((k) => !k.configured);
|
|
86
|
+
return (_jsxs("div", { style: styles.container, children: [_jsx("h3", { style: styles.heading, children: "API Keys" }), _jsxs("p", { style: styles.subtitle, children: [configuredKeys.length, " of ", keys.length, " configured"] }), _jsx("div", { style: styles.keyList, children: keys.map((k) => (_jsxs("div", { style: styles.keyCard, children: [_jsxs("div", { style: styles.keyHeader, children: [_jsxs("span", { style: styles.keyLabel, children: [k.configured ? (_jsx("span", { style: styles.checkmark, children: "\u2713" })) : (_jsx("span", { style: styles.unconfiguredDot, children: "\u25CF" })), k.label, k.required && _jsx("span", { style: styles.requiredBadge, children: "required" })] }), _jsx("span", { style: styles.keyName, children: k.key })] }), !k.configured && (_jsx("input", { type: "password", placeholder: `Enter ${k.label} key...`, value: values[k.key] ?? "", onChange: (e) => handleValueChange(k.key, e.target.value), style: styles.input, autoComplete: "off" }))] }, k.key))) }), unconfiguredKeys.length > 0 && (_jsx("div", { style: styles.actions, children: _jsx("button", { onClick: handleSave, disabled: saving || pendingCount === 0, style: {
|
|
87
|
+
...styles.saveButton,
|
|
88
|
+
opacity: saving || pendingCount === 0 ? 0.5 : 1,
|
|
89
|
+
cursor: saving || pendingCount === 0 ? "default" : "pointer",
|
|
90
|
+
}, children: saving ? "Saving..." : `Save ${pendingCount > 0 ? `(${pendingCount})` : ""}` }) })), saveResult && (_jsx("p", { style: saveResult.ok ? styles.successText : styles.errorText, children: saveResult.message }))] }));
|
|
91
|
+
}
|
|
92
|
+
const styles = {
|
|
93
|
+
container: {
|
|
94
|
+
padding: "20px",
|
|
95
|
+
maxWidth: "600px",
|
|
96
|
+
},
|
|
97
|
+
heading: {
|
|
98
|
+
fontSize: "16px",
|
|
99
|
+
fontWeight: 600,
|
|
100
|
+
margin: "0 0 4px 0",
|
|
101
|
+
},
|
|
102
|
+
subtitle: {
|
|
103
|
+
fontSize: "13px",
|
|
104
|
+
opacity: 0.6,
|
|
105
|
+
margin: "0 0 16px 0",
|
|
106
|
+
},
|
|
107
|
+
loadingText: {
|
|
108
|
+
fontSize: "13px",
|
|
109
|
+
opacity: 0.5,
|
|
110
|
+
},
|
|
111
|
+
errorText: {
|
|
112
|
+
fontSize: "13px",
|
|
113
|
+
color: "#ef4444",
|
|
114
|
+
},
|
|
115
|
+
successText: {
|
|
116
|
+
fontSize: "13px",
|
|
117
|
+
color: "#22c55e",
|
|
118
|
+
marginTop: "8px",
|
|
119
|
+
},
|
|
120
|
+
retryButton: {
|
|
121
|
+
marginTop: "8px",
|
|
122
|
+
padding: "6px 12px",
|
|
123
|
+
fontSize: "13px",
|
|
124
|
+
border: "1px solid rgba(255,255,255,0.15)",
|
|
125
|
+
borderRadius: "6px",
|
|
126
|
+
background: "transparent",
|
|
127
|
+
color: "inherit",
|
|
128
|
+
cursor: "pointer",
|
|
129
|
+
},
|
|
130
|
+
keyList: {
|
|
131
|
+
display: "flex",
|
|
132
|
+
flexDirection: "column",
|
|
133
|
+
gap: "8px",
|
|
134
|
+
},
|
|
135
|
+
keyCard: {
|
|
136
|
+
padding: "10px 12px",
|
|
137
|
+
borderRadius: "8px",
|
|
138
|
+
border: "1px solid rgba(255,255,255,0.08)",
|
|
139
|
+
background: "rgba(255,255,255,0.03)",
|
|
140
|
+
},
|
|
141
|
+
keyHeader: {
|
|
142
|
+
display: "flex",
|
|
143
|
+
justifyContent: "space-between",
|
|
144
|
+
alignItems: "center",
|
|
145
|
+
gap: "8px",
|
|
146
|
+
},
|
|
147
|
+
keyLabel: {
|
|
148
|
+
fontSize: "13px",
|
|
149
|
+
fontWeight: 500,
|
|
150
|
+
display: "flex",
|
|
151
|
+
alignItems: "center",
|
|
152
|
+
gap: "6px",
|
|
153
|
+
},
|
|
154
|
+
keyName: {
|
|
155
|
+
fontSize: "11px",
|
|
156
|
+
opacity: 0.4,
|
|
157
|
+
fontFamily: "monospace",
|
|
158
|
+
},
|
|
159
|
+
checkmark: {
|
|
160
|
+
color: "#22c55e",
|
|
161
|
+
fontSize: "14px",
|
|
162
|
+
},
|
|
163
|
+
unconfiguredDot: {
|
|
164
|
+
color: "rgba(255,255,255,0.25)",
|
|
165
|
+
fontSize: "8px",
|
|
166
|
+
},
|
|
167
|
+
requiredBadge: {
|
|
168
|
+
fontSize: "10px",
|
|
169
|
+
padding: "1px 5px",
|
|
170
|
+
borderRadius: "4px",
|
|
171
|
+
background: "rgba(239,68,68,0.15)",
|
|
172
|
+
color: "#ef4444",
|
|
173
|
+
fontWeight: 500,
|
|
174
|
+
},
|
|
175
|
+
input: {
|
|
176
|
+
width: "100%",
|
|
177
|
+
marginTop: "8px",
|
|
178
|
+
padding: "7px 10px",
|
|
179
|
+
fontSize: "13px",
|
|
180
|
+
borderRadius: "6px",
|
|
181
|
+
border: "1px solid rgba(255,255,255,0.12)",
|
|
182
|
+
background: "rgba(0,0,0,0.2)",
|
|
183
|
+
color: "inherit",
|
|
184
|
+
outline: "none",
|
|
185
|
+
boxSizing: "border-box",
|
|
186
|
+
},
|
|
187
|
+
actions: {
|
|
188
|
+
marginTop: "12px",
|
|
189
|
+
display: "flex",
|
|
190
|
+
justifyContent: "flex-end",
|
|
191
|
+
},
|
|
192
|
+
saveButton: {
|
|
193
|
+
padding: "7px 16px",
|
|
194
|
+
fontSize: "13px",
|
|
195
|
+
fontWeight: 500,
|
|
196
|
+
borderRadius: "6px",
|
|
197
|
+
border: "none",
|
|
198
|
+
background: "#3b82f6",
|
|
199
|
+
color: "#fff",
|
|
200
|
+
cursor: "pointer",
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=ApiKeySettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiKeySettings.js","sourceRoot":"","sources":["../../../src/client/components/ApiKeySettings.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface MissingKeyCardProps {
|
|
2
|
+
label: string;
|
|
3
|
+
message: string;
|
|
4
|
+
settingsPath: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function MissingKeyCard({ label, message, settingsPath }: MissingKeyCardProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=MissingKeyCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MissingKeyCard.d.ts","sourceRoot":"","sources":["../../../src/client/components/MissingKeyCard.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,mBAAmB,2CA2CnF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export function MissingKeyCard({ label, message, settingsPath }) {
|
|
3
|
+
return (_jsxs("div", { style: {
|
|
4
|
+
border: "1px solid #e2e8f0",
|
|
5
|
+
borderRadius: 8,
|
|
6
|
+
padding: "24px 28px",
|
|
7
|
+
maxWidth: 420,
|
|
8
|
+
margin: "32px auto",
|
|
9
|
+
background: "#f8fafc",
|
|
10
|
+
textAlign: "center",
|
|
11
|
+
}, children: [_jsx("div", { style: {
|
|
12
|
+
fontSize: 14,
|
|
13
|
+
fontWeight: 600,
|
|
14
|
+
color: "#334155",
|
|
15
|
+
marginBottom: 8,
|
|
16
|
+
}, children: label }), _jsx("p", { style: { fontSize: 13, color: "#64748b", margin: "0 0 16px" }, children: message }), _jsx("a", { href: settingsPath, style: {
|
|
17
|
+
display: "inline-block",
|
|
18
|
+
padding: "8px 16px",
|
|
19
|
+
fontSize: 13,
|
|
20
|
+
fontWeight: 500,
|
|
21
|
+
color: "#fff",
|
|
22
|
+
background: "#3b82f6",
|
|
23
|
+
borderRadius: 6,
|
|
24
|
+
textDecoration: "none",
|
|
25
|
+
}, children: "Go to Settings" })] }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=MissingKeyCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MissingKeyCard.js","sourceRoot":"","sources":["../../../src/client/components/MissingKeyCard.tsx"],"names":[],"mappings":";AAQA,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAuB;IAClF,OAAO,CACL,eACE,KAAK,EAAE;YACL,MAAM,EAAE,mBAAmB;YAC3B,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,WAAW;YACnB,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,QAAQ;SACpB,aAED,cACE,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;oBACf,KAAK,EAAE,SAAS;oBAChB,YAAY,EAAE,CAAC;iBAChB,YAEA,KAAK,GACF,EACN,YAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,YAC7D,OAAO,GACN,EACJ,YACE,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE;oBACL,OAAO,EAAE,cAAc;oBACvB,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;oBACf,KAAK,EAAE,MAAM;oBACb,UAAU,EAAE,SAAS;oBACrB,YAAY,EAAE,CAAC;oBACf,cAAc,EAAE,MAAM;iBACvB,+BAGC,IACA,CACP,CAAC;AACJ,CAAC"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -2,5 +2,6 @@ export { sendToAgentChat, type AgentChatMessage } from "./agent-chat.js";
|
|
|
2
2
|
export { useAgentChatGenerating } from "./use-agent-chat.js";
|
|
3
3
|
export { useFileWatcher } from "./use-file-watcher.js";
|
|
4
4
|
export { cn } from "./utils.js";
|
|
5
|
+
export { ApiKeySettings } from "./components/ApiKeySettings.js";
|
|
5
6
|
export { sendToHarness, onHarnessMessage, requestUserInfo, enterStyleEditing, enterTextEditing, exitSelectionMode, type UserInfo, } from "./harness.js";
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,QAAQ,GACd,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,QAAQ,GACd,MAAM,cAAc,CAAC"}
|
package/dist/client/index.js
CHANGED
|
@@ -2,5 +2,6 @@ export { sendToAgentChat } from "./agent-chat.js";
|
|
|
2
2
|
export { useAgentChatGenerating } from "./use-agent-chat.js";
|
|
3
3
|
export { useFileWatcher } from "./use-file-watcher.js";
|
|
4
4
|
export { cn } from "./utils.js";
|
|
5
|
+
export { ApiKeySettings } from "./components/ApiKeySettings.js";
|
|
5
6
|
export { sendToHarness, onHarnessMessage, requestUserInfo, enterStyleEditing, enterTextEditing, exitSelectionMode, } from "./harness.js";
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-file-watcher.d.ts","sourceRoot":"","sources":["../../src/client/use-file-watcher.ts"],"names":[],"mappings":"AAEA,UAAU,WAAW;IACnB,iBAAiB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CACvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE;IACtC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC1B,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"use-file-watcher.d.ts","sourceRoot":"","sources":["../../src/client/use-file-watcher.ts"],"names":[],"mappings":"AAEA,UAAU,WAAW;IACnB,iBAAiB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CACvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE;IACtC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC1B,GAAG,IAAI,CAgDZ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
2
|
/**
|
|
3
3
|
* Hook that opens an EventSource connection to /api/events and invalidates
|
|
4
4
|
* react-query caches when file changes are detected.
|
|
@@ -10,31 +10,41 @@ import { useEffect } from "react";
|
|
|
10
10
|
* @param options.onEvent - Optional callback for each SSE event
|
|
11
11
|
*/
|
|
12
12
|
export function useFileWatcher(options = {}) {
|
|
13
|
-
const { queryClient,
|
|
14
|
-
const
|
|
15
|
-
|
|
13
|
+
const { queryClient, queryKeys = ["file", "fileTree"], eventsUrl = "/api/events", } = options;
|
|
14
|
+
const url = eventsUrl;
|
|
15
|
+
// Stable refs — updated every render, read inside the effect
|
|
16
|
+
const onEventRef = useRef(options.onEvent);
|
|
17
|
+
onEventRef.current = options.onEvent;
|
|
18
|
+
const keysRef = useRef(queryKeys);
|
|
19
|
+
keysRef.current = queryKeys;
|
|
16
20
|
useEffect(() => {
|
|
17
21
|
const eventSource = new EventSource(url);
|
|
22
|
+
eventSource.onopen = () => {
|
|
23
|
+
// Invalidate all keys on reconnection to catch events missed during downtime
|
|
24
|
+
if (queryClient) {
|
|
25
|
+
for (const key of keysRef.current) {
|
|
26
|
+
queryClient.invalidateQueries({ queryKey: [key] });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
18
30
|
eventSource.onmessage = (event) => {
|
|
19
31
|
try {
|
|
20
32
|
const data = JSON.parse(event.data);
|
|
21
33
|
if (queryClient) {
|
|
22
|
-
for (const key of
|
|
34
|
+
for (const key of keysRef.current) {
|
|
23
35
|
queryClient.invalidateQueries({ queryKey: [key] });
|
|
24
36
|
}
|
|
25
37
|
}
|
|
26
|
-
|
|
38
|
+
onEventRef.current?.(data);
|
|
27
39
|
}
|
|
28
|
-
catch (
|
|
29
|
-
console.
|
|
40
|
+
catch (e) {
|
|
41
|
+
console.warn("[useFileWatcher] Failed to parse SSE event:", e);
|
|
30
42
|
}
|
|
31
43
|
};
|
|
32
|
-
eventSource.onerror = (
|
|
33
|
-
console.
|
|
34
|
-
};
|
|
35
|
-
return () => {
|
|
36
|
-
eventSource.close();
|
|
44
|
+
eventSource.onerror = () => {
|
|
45
|
+
console.warn("[useFileWatcher] EventSource error, will reconnect");
|
|
37
46
|
};
|
|
38
|
-
|
|
47
|
+
return () => eventSource.close();
|
|
48
|
+
}, [url, queryClient]); // only reconnect on genuine config changes
|
|
39
49
|
}
|
|
40
50
|
//# sourceMappingURL=use-file-watcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-file-watcher.js","sourceRoot":"","sources":["../../src/client/use-file-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"use-file-watcher.js","sourceRoot":"","sources":["../../src/client/use-file-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAM1C;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,UAK3B,EAAE;IACJ,MAAM,EACJ,WAAW,EACX,SAAS,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,SAAS,GAAG,aAAa,GAC1B,GAAG,OAAO,CAAC;IAEZ,MAAM,GAAG,GAAG,SAAS,CAAC;IAEtB,6DAA6D;IAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAErC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAE5B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;QAEzC,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE;YACxB,6EAA6E;YAC7E,IAAI,WAAW,EAAE,CAAC;gBAChB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBAClC,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,WAAW,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;YAChC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,WAAW,EAAE,CAAC;oBAChB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;wBAClC,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;gBACD,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC;QAEF,WAAW,CAAC,OAAO,GAAG,GAAG,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACrE,CAAC,CAAC;QAEF,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,2CAA2C;AACrE,CAAC"}
|
package/dist/index.browser.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { sendToAgentChat, useAgentChatGenerating, useFileWatcher, cn, type AgentChatMessage, } from "./client/index.js";
|
|
1
|
+
export { sendToAgentChat, useAgentChatGenerating, useFileWatcher, cn, ApiKeySettings, type AgentChatMessage, } from "./client/index.js";
|
|
2
2
|
export { agentChat } from "./shared/index.js";
|
|
3
3
|
//# sourceMappingURL=index.browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,EAAE,EACF,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,EAAE,EACF,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.browser.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Browser-safe entry — only client & shared exports (no Node/Express/chokidar).
|
|
2
2
|
// Client
|
|
3
|
-
export { sendToAgentChat, useAgentChatGenerating, useFileWatcher, cn, } from "./client/index.js";
|
|
3
|
+
export { sendToAgentChat, useAgentChatGenerating, useFileWatcher, cn, ApiKeySettings, } from "./client/index.js";
|
|
4
4
|
// Shared (isomorphic)
|
|
5
5
|
export { agentChat } from "./shared/index.js";
|
|
6
6
|
//# sourceMappingURL=index.browser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,SAAS;AACT,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,EAAE,
|
|
1
|
+
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,SAAS;AACT,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,EAAE,EACF,cAAc,GAEf,MAAM,mBAAmB,CAAC;AAE3B,sBAAsB;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createServer, createFileWatcher, createSSEHandler, createProductionServer, type CreateServerOptions, type FileWatcherOptions, type SSEHandlerOptions, type ProductionServerOptions, } from "./server/index.js";
|
|
2
|
-
export { sendToAgentChat, useAgentChatGenerating, useFileWatcher, cn, type AgentChatMessage, } from "./client/index.js";
|
|
2
|
+
export { sendToAgentChat, useAgentChatGenerating, useFileWatcher, cn, ApiKeySettings, type AgentChatMessage, } from "./client/index.js";
|
|
3
3
|
export { agentChat } from "./shared/index.js";
|
|
4
4
|
export { runScript, loadEnv, parseArgs, camelCaseArgs, isValidPath, isValidProjectPath, ensureDir, fail, } from "./scripts/index.js";
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,EAAE,EACF,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,EACL,SAAS,EACT,OAAO,EACP,SAAS,EACT,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,IAAI,GACL,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,EAAE,EACF,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,EACL,SAAS,EACT,OAAO,EACP,SAAS,EACT,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,IAAI,GACL,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Server
|
|
4
4
|
export { createServer, createFileWatcher, createSSEHandler, createProductionServer, } from "./server/index.js";
|
|
5
5
|
// Client
|
|
6
|
-
export { sendToAgentChat, useAgentChatGenerating, useFileWatcher, cn, } from "./client/index.js";
|
|
6
|
+
export { sendToAgentChat, useAgentChatGenerating, useFileWatcher, cn, ApiKeySettings, } from "./client/index.js";
|
|
7
7
|
// Shared (isomorphic)
|
|
8
8
|
export { agentChat } from "./shared/index.js";
|
|
9
9
|
// Scripts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,+CAA+C;AAE/C,SAAS;AACT,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,GAKvB,MAAM,mBAAmB,CAAC;AAE3B,SAAS;AACT,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,+CAA+C;AAE/C,SAAS;AACT,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,GAKvB,MAAM,mBAAmB,CAAC;AAE3B,SAAS;AACT,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,EAAE,EACF,cAAc,GAEf,MAAM,mBAAmB,CAAC;AAE3B,sBAAsB;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,UAAU;AACV,OAAO,EACL,SAAS,EACT,OAAO,EACP,SAAS,EACT,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,IAAI,GACL,MAAM,oBAAoB,CAAC"}
|
package/dist/scripts/runner.js
CHANGED
|
@@ -26,7 +26,7 @@ export async function runScript() {
|
|
|
26
26
|
}
|
|
27
27
|
// Dynamically import and run the script
|
|
28
28
|
try {
|
|
29
|
-
const mod = await import(`./${scriptName}.js`);
|
|
29
|
+
const mod = await import(/* @vite-ignore */ `./${scriptName}.js`);
|
|
30
30
|
const args = process.argv.slice(3);
|
|
31
31
|
await mod.default(args);
|
|
32
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/scripts/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,+BAA+B,UAAU,GAAG,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/scripts/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,+BAA+B,UAAU,GAAG,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,KAAK,UAAU,KAAK,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CACX,kBAAkB,UAAU,kDAAkD,CAC/E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,WAAW,UAAU,WAAW,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import express from "express";
|
|
2
2
|
import cors from "cors";
|
|
3
|
+
export interface EnvKeyConfig {
|
|
4
|
+
/** Environment variable name (e.g. "HUBSPOT_ACCESS_TOKEN") */
|
|
5
|
+
key: string;
|
|
6
|
+
/** Human-readable label (e.g. "HubSpot") */
|
|
7
|
+
label: string;
|
|
8
|
+
/** Whether this key is required for the app to function */
|
|
9
|
+
required?: boolean;
|
|
10
|
+
}
|
|
3
11
|
export interface CreateServerOptions {
|
|
4
12
|
/** CORS options. Pass false to disable. Default: enabled with defaults. */
|
|
5
13
|
cors?: cors.CorsOptions | false;
|
|
@@ -9,6 +17,8 @@ export interface CreateServerOptions {
|
|
|
9
17
|
pingMessage?: string;
|
|
10
18
|
/** Disable the /api/ping health check. Default: false */
|
|
11
19
|
disablePing?: boolean;
|
|
20
|
+
/** Env key configuration for the settings UI. Enables /api/env-status and /api/env-vars routes. */
|
|
21
|
+
envKeys?: EnvKeyConfig[];
|
|
12
22
|
}
|
|
13
23
|
/**
|
|
14
24
|
* Create a pre-configured Express app with standard agent-native middleware:
|
|
@@ -16,6 +26,7 @@ export interface CreateServerOptions {
|
|
|
16
26
|
* - JSON body parser (50mb limit)
|
|
17
27
|
* - URL-encoded body parser
|
|
18
28
|
* - /api/ping health check
|
|
29
|
+
* - /api/env-status and /api/env-vars (when envKeys is provided)
|
|
19
30
|
*/
|
|
20
31
|
export declare function createServer(options?: CreateServerOptions): express.Express;
|
|
21
32
|
//# sourceMappingURL=create-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../../src/server/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../../src/server/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AAKxB,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,IAAI,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAChC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mGAAmG;IACnG,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAiED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,OAAO,CAiE/E"}
|
|
@@ -1,11 +1,77 @@
|
|
|
1
1
|
import express from "express";
|
|
2
2
|
import cors from "cors";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { agentEnv } from "../shared/agent-env.js";
|
|
6
|
+
/**
|
|
7
|
+
* Parse a .env file into key-value pairs, preserving comments and empty lines for roundtrip.
|
|
8
|
+
*/
|
|
9
|
+
function parseEnvFile(content) {
|
|
10
|
+
const vars = new Map();
|
|
11
|
+
for (const line of content.split("\n")) {
|
|
12
|
+
const trimmed = line.trim();
|
|
13
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
14
|
+
continue;
|
|
15
|
+
const eqIndex = trimmed.indexOf("=");
|
|
16
|
+
if (eqIndex === -1)
|
|
17
|
+
continue;
|
|
18
|
+
const key = trimmed.slice(0, eqIndex).trim();
|
|
19
|
+
let value = trimmed.slice(eqIndex + 1).trim();
|
|
20
|
+
// Strip surrounding quotes
|
|
21
|
+
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
22
|
+
value = value.slice(1, -1);
|
|
23
|
+
}
|
|
24
|
+
vars.set(key, value);
|
|
25
|
+
}
|
|
26
|
+
return vars;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Upsert vars into a .env file, preserving existing structure.
|
|
30
|
+
*/
|
|
31
|
+
function upsertEnvFile(envPath, vars) {
|
|
32
|
+
let content = "";
|
|
33
|
+
try {
|
|
34
|
+
content = fs.readFileSync(envPath, "utf-8");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// File doesn't exist yet
|
|
38
|
+
}
|
|
39
|
+
const lines = content.split("\n");
|
|
40
|
+
const remaining = new Map(vars.map((v) => [v.key, v.value]));
|
|
41
|
+
// Update existing lines in place
|
|
42
|
+
const updated = lines.map((line) => {
|
|
43
|
+
const trimmed = line.trim();
|
|
44
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
45
|
+
return line;
|
|
46
|
+
const eqIndex = trimmed.indexOf("=");
|
|
47
|
+
if (eqIndex === -1)
|
|
48
|
+
return line;
|
|
49
|
+
const key = trimmed.slice(0, eqIndex).trim();
|
|
50
|
+
if (remaining.has(key)) {
|
|
51
|
+
const value = remaining.get(key);
|
|
52
|
+
remaining.delete(key);
|
|
53
|
+
return `${key}=${value}`;
|
|
54
|
+
}
|
|
55
|
+
return line;
|
|
56
|
+
});
|
|
57
|
+
// Append new vars
|
|
58
|
+
for (const [key, value] of remaining) {
|
|
59
|
+
updated.push(`${key}=${value}`);
|
|
60
|
+
}
|
|
61
|
+
// Ensure trailing newline
|
|
62
|
+
let result = updated.join("\n");
|
|
63
|
+
if (!result.endsWith("\n"))
|
|
64
|
+
result += "\n";
|
|
65
|
+
fs.mkdirSync(path.dirname(envPath), { recursive: true });
|
|
66
|
+
fs.writeFileSync(envPath, result);
|
|
67
|
+
}
|
|
3
68
|
/**
|
|
4
69
|
* Create a pre-configured Express app with standard agent-native middleware:
|
|
5
70
|
* - CORS
|
|
6
71
|
* - JSON body parser (50mb limit)
|
|
7
72
|
* - URL-encoded body parser
|
|
8
73
|
* - /api/ping health check
|
|
74
|
+
* - /api/env-status and /api/env-vars (when envKeys is provided)
|
|
9
75
|
*/
|
|
10
76
|
export function createServer(options = {}) {
|
|
11
77
|
const app = express();
|
|
@@ -22,6 +88,42 @@ export function createServer(options = {}) {
|
|
|
22
88
|
res.json({ message });
|
|
23
89
|
});
|
|
24
90
|
}
|
|
91
|
+
// Env key management routes
|
|
92
|
+
if (options.envKeys) {
|
|
93
|
+
const envKeys = options.envKeys;
|
|
94
|
+
app.get("/api/env-status", (_req, res) => {
|
|
95
|
+
res.json(envKeys.map((cfg) => ({
|
|
96
|
+
key: cfg.key,
|
|
97
|
+
label: cfg.label,
|
|
98
|
+
required: cfg.required ?? false,
|
|
99
|
+
configured: !!process.env[cfg.key],
|
|
100
|
+
})));
|
|
101
|
+
});
|
|
102
|
+
app.post("/api/env-vars", (req, res) => {
|
|
103
|
+
const { vars } = req.body;
|
|
104
|
+
if (!Array.isArray(vars) || vars.length === 0) {
|
|
105
|
+
res.status(400).json({ error: "vars array required" });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// Only allow keys that are in the env config
|
|
109
|
+
const allowedKeys = new Set(envKeys.map((k) => k.key));
|
|
110
|
+
const filtered = vars.filter((v) => allowedKeys.has(v.key));
|
|
111
|
+
if (filtered.length === 0) {
|
|
112
|
+
res.status(400).json({ error: "No recognized env keys in request" });
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Write to .env file
|
|
116
|
+
const envPath = path.join(process.cwd(), ".env");
|
|
117
|
+
upsertEnvFile(envPath, filtered);
|
|
118
|
+
// Update process.env so the app picks up the new values immediately
|
|
119
|
+
for (const { key, value } of filtered) {
|
|
120
|
+
process.env[key] = value;
|
|
121
|
+
}
|
|
122
|
+
// Notify parent (Builder or harness) via postMessage
|
|
123
|
+
agentEnv.setVars(filtered);
|
|
124
|
+
res.json({ saved: filtered.map((v) => v.key) });
|
|
125
|
+
});
|
|
126
|
+
}
|
|
25
127
|
return app;
|
|
26
128
|
}
|
|
27
129
|
//# sourceMappingURL=create-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-server.js","sourceRoot":"","sources":["../../src/server/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"create-server.js","sourceRoot":"","sources":["../../src/server/create-server.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { createServer, type CreateServerOptions } from "./create-server.js";
|
|
1
|
+
export { createServer, type CreateServerOptions, type EnvKeyConfig } from "./create-server.js";
|
|
2
2
|
export { createFileWatcher, createSSEHandler, type FileWatcherOptions, type SSEHandlerOptions, } from "./sse.js";
|
|
3
3
|
export { createProductionServer, type ProductionServerOptions, } from "./production.js";
|
|
4
|
+
export { requireEnvKey, type MissingKeyResponse } from "./missing-key.js";
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|