@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.
Files changed (109) hide show
  1. package/README.md +122 -0
  2. package/dist/adapters/firestore/adapter.d.ts +47 -0
  3. package/dist/adapters/firestore/adapter.d.ts.map +1 -0
  4. package/dist/adapters/firestore/adapter.js +45 -0
  5. package/dist/adapters/firestore/adapter.js.map +1 -0
  6. package/dist/adapters/firestore/index.d.ts +3 -3
  7. package/dist/adapters/firestore/index.d.ts.map +1 -1
  8. package/dist/adapters/firestore/index.js +2 -3
  9. package/dist/adapters/firestore/index.js.map +1 -1
  10. package/dist/adapters/neon/adapter.d.ts +28 -0
  11. package/dist/adapters/neon/adapter.d.ts.map +1 -0
  12. package/dist/adapters/neon/adapter.js +119 -0
  13. package/dist/adapters/neon/adapter.js.map +1 -0
  14. package/dist/adapters/neon/index.d.ts +3 -0
  15. package/dist/adapters/neon/index.d.ts.map +1 -0
  16. package/dist/adapters/neon/index.js +3 -0
  17. package/dist/adapters/neon/index.js.map +1 -0
  18. package/dist/adapters/supabase/adapter.d.ts +42 -0
  19. package/dist/adapters/supabase/adapter.d.ts.map +1 -0
  20. package/dist/adapters/supabase/adapter.js +126 -0
  21. package/dist/adapters/supabase/adapter.js.map +1 -0
  22. package/dist/adapters/supabase/index.d.ts +3 -0
  23. package/dist/adapters/supabase/index.d.ts.map +1 -0
  24. package/dist/adapters/supabase/index.js +3 -0
  25. package/dist/adapters/supabase/index.js.map +1 -0
  26. package/dist/adapters/{firestore → sync}/config.d.ts +1 -1
  27. package/dist/adapters/sync/config.d.ts.map +1 -0
  28. package/dist/adapters/{firestore → sync}/config.js +1 -1
  29. package/dist/adapters/sync/config.js.map +1 -0
  30. package/dist/adapters/{firestore/sync.d.ts → sync/file-sync.d.ts} +6 -37
  31. package/dist/adapters/sync/file-sync.d.ts.map +1 -0
  32. package/dist/adapters/{firestore/sync.js → sync/file-sync.js} +45 -59
  33. package/dist/adapters/sync/file-sync.js.map +1 -0
  34. package/dist/adapters/sync/index.d.ts +5 -0
  35. package/dist/adapters/sync/index.d.ts.map +1 -0
  36. package/dist/adapters/sync/index.js +4 -0
  37. package/dist/adapters/sync/index.js.map +1 -0
  38. package/dist/adapters/sync/merge.d.ts.map +1 -0
  39. package/dist/adapters/sync/merge.js.map +1 -0
  40. package/dist/adapters/sync/types.d.ts +28 -0
  41. package/dist/adapters/sync/types.d.ts.map +1 -0
  42. package/dist/adapters/sync/types.js +2 -0
  43. package/dist/adapters/sync/types.js.map +1 -0
  44. package/dist/cli/create.d.ts.map +1 -1
  45. package/dist/cli/create.js +41 -3
  46. package/dist/cli/create.js.map +1 -1
  47. package/dist/cli/index.js +15 -10
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/client/components/ApiKeySettings.d.ts +12 -0
  50. package/dist/client/components/ApiKeySettings.d.ts.map +1 -0
  51. package/dist/client/components/ApiKeySettings.js +203 -0
  52. package/dist/client/components/ApiKeySettings.js.map +1 -0
  53. package/dist/client/components/MissingKeyCard.d.ts +7 -0
  54. package/dist/client/components/MissingKeyCard.d.ts.map +1 -0
  55. package/dist/client/components/MissingKeyCard.js +27 -0
  56. package/dist/client/components/MissingKeyCard.js.map +1 -0
  57. package/dist/client/index.d.ts +1 -0
  58. package/dist/client/index.d.ts.map +1 -1
  59. package/dist/client/index.js +1 -0
  60. package/dist/client/index.js.map +1 -1
  61. package/dist/client/use-file-watcher.d.ts.map +1 -1
  62. package/dist/client/use-file-watcher.js +24 -14
  63. package/dist/client/use-file-watcher.js.map +1 -1
  64. package/dist/index.browser.d.ts +1 -1
  65. package/dist/index.browser.d.ts.map +1 -1
  66. package/dist/index.browser.js +1 -1
  67. package/dist/index.browser.js.map +1 -1
  68. package/dist/index.d.ts +1 -1
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +1 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/scripts/runner.js +1 -1
  73. package/dist/scripts/runner.js.map +1 -1
  74. package/dist/server/create-server.d.ts +11 -0
  75. package/dist/server/create-server.d.ts.map +1 -1
  76. package/dist/server/create-server.js +102 -0
  77. package/dist/server/create-server.js.map +1 -1
  78. package/dist/server/index.d.ts +2 -1
  79. package/dist/server/index.d.ts.map +1 -1
  80. package/dist/server/index.js +1 -0
  81. package/dist/server/index.js.map +1 -1
  82. package/dist/server/missing-key.d.ts +17 -0
  83. package/dist/server/missing-key.d.ts.map +1 -0
  84. package/dist/server/missing-key.js +17 -0
  85. package/dist/server/missing-key.js.map +1 -0
  86. package/dist/shared/agent-env.d.ts +23 -0
  87. package/dist/shared/agent-env.d.ts.map +1 -0
  88. package/dist/shared/agent-env.js +36 -0
  89. package/dist/shared/agent-env.js.map +1 -0
  90. package/dist/shared/index.d.ts +1 -0
  91. package/dist/shared/index.d.ts.map +1 -1
  92. package/dist/shared/index.js +1 -0
  93. package/dist/shared/index.js.map +1 -1
  94. package/dist/vite/client.d.ts.map +1 -1
  95. package/dist/vite/client.js +31 -0
  96. package/dist/vite/client.js.map +1 -1
  97. package/package.json +27 -5
  98. package/src/templates/default/.claude/settings.json +68 -0
  99. package/src/templates/default/AGENTS.md +4 -0
  100. package/src/templates/default/data/.gitkeep +0 -0
  101. package/src/templates/default/learnings.md +0 -0
  102. package/dist/adapters/firestore/config.d.ts.map +0 -1
  103. package/dist/adapters/firestore/config.js.map +0 -1
  104. package/dist/adapters/firestore/merge.d.ts.map +0 -1
  105. package/dist/adapters/firestore/merge.js.map +0 -1
  106. package/dist/adapters/firestore/sync.d.ts.map +0 -1
  107. package/dist/adapters/firestore/sync.js.map +0 -1
  108. /package/dist/adapters/{firestore → sync}/merge.d.ts +0 -0
  109. /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"}
@@ -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"}
@@ -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
@@ -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,CAgCZ"}
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, onEvent } = options;
14
- const keys = options.queryKeys ?? ["file", "fileTree"];
15
- const url = options.eventsUrl ?? "/api/events";
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 keys) {
34
+ for (const key of keysRef.current) {
23
35
  queryClient.invalidateQueries({ queryKey: [key] });
24
36
  }
25
37
  }
26
- onEvent?.(data);
38
+ onEventRef.current?.(data);
27
39
  }
28
- catch (err) {
29
- console.error("[useFileWatcher] error parsing event data", err);
40
+ catch (e) {
41
+ console.warn("[useFileWatcher] Failed to parse SSE event:", e);
30
42
  }
31
43
  };
32
- eventSource.onerror = (err) => {
33
- console.error("[useFileWatcher] SSE connection error", err);
34
- };
35
- return () => {
36
- eventSource.close();
44
+ eventSource.onerror = () => {
45
+ console.warn("[useFileWatcher] EventSource error, will reconnect");
37
46
  };
38
- }, [url, queryClient, onEvent, ...keys]);
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;AAMlC;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,UAK3B,EAAE;IACJ,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,aAAa,CAAC;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;QAEzC,WAAW,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;YAChC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEpC,IAAI,WAAW,EAAE,CAAC;oBAChB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;gBAED,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC;QAEF,WAAW,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE;YAC5B,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AAC3C,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"}
@@ -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"}
@@ -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,GAEH,MAAM,mBAAmB,CAAC;AAE3B,sBAAsB;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
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
@@ -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,GAEH,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"}
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"}
@@ -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;QAC/C,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
+ {"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;AAExB,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;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,OAAO,CAmB/E"}
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;AAaxB;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,UAA+B,EAAE;IAC5D,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,aAAa;IACb,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEhD,eAAe;IACf,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC;YAC1E,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"create-server.js","sourceRoot":"","sources":["../../src/server/create-server.ts"],"names":[],"mappings":"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"}
@@ -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