patchwork-os 1.2.0-beta.2.canary.612 → 1.2.0-beta.2.canary.613
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/patchworkConfig.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, statSync } from "node:fs";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
3
|
import { deleteSecretJsonSync, getSecretJsonSync, storeSecretJsonSync, } from "./connectors/tokenStorage.js";
|
|
4
4
|
import { patchworkPath, warnIfLegacyConfigStranded } from "./patchworkHome.js";
|
|
@@ -94,6 +94,28 @@ export function getApiKeysPresent() {
|
|
|
94
94
|
// cuts the per-webhook 9+ kernel-call burst to ~1 per 30 s at steady state.
|
|
95
95
|
const _configCache = new Map();
|
|
96
96
|
const _CONFIG_TTL_MS = 30_000;
|
|
97
|
+
/**
|
|
98
|
+
* Identity of the file backing a cache entry.
|
|
99
|
+
*
|
|
100
|
+
* The TTL alone was not enough: a cached entry stayed authoritative for 30s
|
|
101
|
+
* regardless of what happened to the file, so an operator's hand edit was
|
|
102
|
+
* invisible to the next read — and every runtime write is a read-modify-write
|
|
103
|
+
* built on that read, so the edit was then written straight over. Silently
|
|
104
|
+
* (#1361).
|
|
105
|
+
*
|
|
106
|
+
* `-1` for a missing file is a real value, not a sentinel for "unknown": it
|
|
107
|
+
* distinguishes "no config on disk" from any real stat, so creating or
|
|
108
|
+
* deleting the file both count as a change.
|
|
109
|
+
*/
|
|
110
|
+
function fileStamp(path) {
|
|
111
|
+
try {
|
|
112
|
+
const st = statSync(path);
|
|
113
|
+
return { mtimeMs: st.mtimeMs, size: st.size };
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return { mtimeMs: -1, size: -1 };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
97
119
|
/** Clear the loadConfig cache. Exposed for tests and after saveConfig. */
|
|
98
120
|
export function clearConfigCache() {
|
|
99
121
|
_configCache.clear();
|
|
@@ -113,15 +135,27 @@ export function loadConfig(path = defaultConfigPath()) {
|
|
|
113
135
|
// Say so when an override is active but the real config was left behind.
|
|
114
136
|
warnIfLegacyConfigStranded("config.json");
|
|
115
137
|
const now = Date.now();
|
|
138
|
+
const stamp = fileStamp(path);
|
|
116
139
|
const cached = _configCache.get(path);
|
|
117
|
-
|
|
140
|
+
// Serve from cache only when the file is BOTH un-expired and unchanged.
|
|
141
|
+
// Size as well as mtime, because a filesystem whose timestamps are coarse
|
|
142
|
+
// can give an edit the same mtime as the write before it.
|
|
143
|
+
if (cached &&
|
|
144
|
+
now < cached.expires &&
|
|
145
|
+
cached.mtimeMs === stamp.mtimeMs &&
|
|
146
|
+
cached.size === stamp.size) {
|
|
118
147
|
return cached.result;
|
|
148
|
+
}
|
|
119
149
|
if (!existsSync(path)) {
|
|
120
150
|
const fromStore = loadApiKeysFromSecureStore();
|
|
121
151
|
const result = withHomeDefaults(Object.keys(fromStore).length > 0
|
|
122
152
|
? { ...DEFAULTS, apiKeys: fromStore }
|
|
123
153
|
: { ...DEFAULTS });
|
|
124
|
-
_configCache.set(path, {
|
|
154
|
+
_configCache.set(path, {
|
|
155
|
+
result,
|
|
156
|
+
expires: now + _CONFIG_TTL_MS,
|
|
157
|
+
...stamp,
|
|
158
|
+
});
|
|
125
159
|
return result;
|
|
126
160
|
}
|
|
127
161
|
const raw = readFileSync(path, "utf8");
|
|
@@ -174,7 +208,11 @@ export function loadConfig(path = defaultConfigPath()) {
|
|
|
174
208
|
// Don't cache migrated configs — the file has just been rewritten; next load
|
|
175
209
|
// should see the stripped version. This path is once-per-key, not hot.
|
|
176
210
|
if (!migrated)
|
|
177
|
-
_configCache.set(path, {
|
|
211
|
+
_configCache.set(path, {
|
|
212
|
+
result,
|
|
213
|
+
expires: now + _CONFIG_TTL_MS,
|
|
214
|
+
...stamp,
|
|
215
|
+
});
|
|
178
216
|
return result;
|
|
179
217
|
}
|
|
180
218
|
export function saveConfig(config, path = defaultConfigPath()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patchworkConfig.js","sourceRoot":"","sources":["../src/patchworkConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"patchworkConfig.js","sourceRoot":"","sources":["../src/patchworkConfig.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "patchwork-os",
|
|
3
|
-
"version": "1.2.0-beta.2.canary.
|
|
3
|
+
"version": "1.2.0-beta.2.canary.613",
|
|
4
4
|
"description": "Your personal AI runtime, local-first. Patchwork OS gives any AI model a consistent set of tools, YAML recipes, a delegation policy with approval queue, and a durable trace memory — all on your machine, all under your policy.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|