@oharness/engine 0.6.0 → 0.7.1
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/agent/agent.d.ts +83 -0
- package/dist/agent/agent.js +112 -1
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/memory-backup.d.ts +2 -0
- package/dist/agent/memory-backup.js +9 -1
- package/dist/agent/memory-backup.js.map +1 -1
- package/dist/agent/memory-limits.js +8 -1
- package/dist/agent/memory-limits.js.map +1 -1
- package/dist/agent/memory-usage.d.ts +1 -1
- package/dist/agent/memory-usage.js +2 -3
- package/dist/agent/memory-usage.js.map +1 -1
- package/dist/agent/memory.d.ts +3 -0
- package/dist/agent/memory.js +6 -18
- package/dist/agent/memory.js.map +1 -1
- package/dist/agent/session.d.ts +9 -0
- package/dist/agent/session.js +14 -2
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/settings.js +3 -2
- package/dist/agent/settings.js.map +1 -1
- package/dist/agent/store.d.ts +45 -4
- package/dist/agent/store.js +198 -25
- package/dist/agent/store.js.map +1 -1
- package/dist/artifacts/files.d.ts +52 -0
- package/dist/artifacts/files.js +169 -0
- package/dist/artifacts/files.js.map +1 -0
- package/dist/auth/store.js +3 -2
- package/dist/auth/store.js.map +1 -1
- package/dist/config-files.js +3 -2
- package/dist/config-files.js.map +1 -1
- package/dist/config.d.ts +6 -1
- package/dist/config.js +10 -2
- package/dist/config.js.map +1 -1
- package/dist/harness.d.ts +62 -1
- package/dist/harness.js +174 -12
- package/dist/harness.js.map +1 -1
- package/dist/paths.d.ts +5 -0
- package/dist/paths.js +21 -3
- package/dist/paths.js.map +1 -1
- package/dist/providers/builtin.d.ts +2 -0
- package/dist/providers/builtin.js +38 -24
- package/dist/providers/builtin.js.map +1 -1
- package/dist/providers/catalog.d.ts +5 -0
- package/dist/providers/catalog.js +32 -1
- package/dist/providers/catalog.js.map +1 -1
- package/dist/providers/catalog.json +241 -123
- package/dist/providers/discovery.js +17 -0
- package/dist/providers/discovery.js.map +1 -1
- package/dist/providers/models-dev.d.ts +89 -0
- package/dist/providers/models-dev.js +160 -0
- package/dist/providers/models-dev.js.map +1 -0
- package/dist/providers/models-dev.json +821 -0
- package/dist/providers/registry.d.ts +12 -0
- package/dist/providers/registry.js +33 -1
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/types.d.ts +21 -0
- package/dist/providers/types.js +16 -0
- package/dist/providers/types.js.map +1 -1
- package/dist/runtime-plugins/builtin/memory-migrate.d.ts +5 -21
- package/dist/runtime-plugins/builtin/memory-migrate.js +5 -125
- package/dist/runtime-plugins/builtin/memory-migrate.js.map +1 -1
- package/dist/runtime-plugins/builtin/memory.d.ts +3 -0
- package/dist/runtime-plugins/builtin/memory.js +12 -10
- package/dist/runtime-plugins/builtin/memory.js.map +1 -1
- package/dist/schedule/clock.d.ts +76 -0
- package/dist/schedule/clock.js +147 -0
- package/dist/schedule/clock.js.map +1 -0
- package/dist/schedule/cron.d.ts +9 -0
- package/dist/schedule/cron.js +18 -0
- package/dist/schedule/cron.js.map +1 -1
- package/dist/schedule/lock.d.ts +38 -0
- package/dist/schedule/lock.js +100 -0
- package/dist/schedule/lock.js.map +1 -0
- package/dist/schedule/runner.d.ts +67 -0
- package/dist/schedule/runner.js +100 -0
- package/dist/schedule/runner.js.map +1 -0
- package/dist/schedule/scheduler.d.ts +56 -15
- package/dist/schedule/scheduler.js +80 -107
- package/dist/schedule/scheduler.js.map +1 -1
- package/dist/storage/kv.js +3 -2
- package/dist/storage/kv.js.map +1 -1
- package/dist/storage/project.d.ts +26 -0
- package/dist/storage/project.js +74 -15
- package/dist/storage/project.js.map +1 -1
- package/dist/tools/builtin/routine.d.ts +31 -0
- package/dist/tools/builtin/routine.js +70 -0
- package/dist/tools/builtin/routine.js.map +1 -0
- package/dist/util/fs.d.ts +6 -0
- package/dist/util/fs.js +22 -0
- package/dist/util/fs.js.map +1 -0
- package/package.json +3 -3
|
@@ -85,6 +85,18 @@ export declare class ProviderRegistry {
|
|
|
85
85
|
* `/models` payload can say a model reasons, never which tiers it takes.
|
|
86
86
|
*/
|
|
87
87
|
private discovered;
|
|
88
|
+
/**
|
|
89
|
+
* Drop what a provider no longer lists.
|
|
90
|
+
*
|
|
91
|
+
* A listing is the provider saying what it serves today. A model that was
|
|
92
|
+
* in yesterday's listing and is not in today's has been withdrawn — on
|
|
93
|
+
* OpenRouter that is a model with no endpoints left — and offering it only
|
|
94
|
+
* lets someone pick a name that answers 404. An empty listing proves
|
|
95
|
+
* nothing, so it retires nothing. Only entries in the shape a listing
|
|
96
|
+
* writes, `<provider>/<model>`, are candidates: an entry someone named
|
|
97
|
+
* themselves was put there on purpose and is theirs to remove.
|
|
98
|
+
*/
|
|
99
|
+
private retire;
|
|
88
100
|
/**
|
|
89
101
|
* Register a discovered spec, plus the bare alias that lets `/model kimi-k3`
|
|
90
102
|
* work and not only `/model moonshot/kimi-k3`. First provider to claim a
|
|
@@ -150,10 +150,12 @@ export class ProviderRegistry {
|
|
|
150
150
|
if (!provider.listModels)
|
|
151
151
|
continue;
|
|
152
152
|
try {
|
|
153
|
-
|
|
153
|
+
const specs = await this.discovered(provider);
|
|
154
|
+
for (const spec of specs) {
|
|
154
155
|
this.adopt(spec);
|
|
155
156
|
changed.push(spec);
|
|
156
157
|
}
|
|
158
|
+
this.retire(provider.id, specs);
|
|
157
159
|
}
|
|
158
160
|
catch {
|
|
159
161
|
// A provider that cannot enumerate its models is not fatal; the
|
|
@@ -193,6 +195,7 @@ export class ProviderRegistry {
|
|
|
193
195
|
}
|
|
194
196
|
for (const spec of specs)
|
|
195
197
|
this.adopt(spec);
|
|
198
|
+
this.retire(provider.id, specs);
|
|
196
199
|
return { status: "ok", models: specs };
|
|
197
200
|
}
|
|
198
201
|
/**
|
|
@@ -202,6 +205,35 @@ export class ProviderRegistry {
|
|
|
202
205
|
async discovered(provider) {
|
|
203
206
|
return refineReasoning(await provider.listModels(), this.catalogProviders);
|
|
204
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Drop what a provider no longer lists.
|
|
210
|
+
*
|
|
211
|
+
* A listing is the provider saying what it serves today. A model that was
|
|
212
|
+
* in yesterday's listing and is not in today's has been withdrawn — on
|
|
213
|
+
* OpenRouter that is a model with no endpoints left — and offering it only
|
|
214
|
+
* lets someone pick a name that answers 404. An empty listing proves
|
|
215
|
+
* nothing, so it retires nothing. Only entries in the shape a listing
|
|
216
|
+
* writes, `<provider>/<model>`, are candidates: an entry someone named
|
|
217
|
+
* themselves was put there on purpose and is theirs to remove.
|
|
218
|
+
*/
|
|
219
|
+
retire(providerId, listed) {
|
|
220
|
+
if (!listed.length)
|
|
221
|
+
return;
|
|
222
|
+
const keep = new Set(listed.map((spec) => spec.id));
|
|
223
|
+
const gone = new Set();
|
|
224
|
+
for (const [id, model] of this.models) {
|
|
225
|
+
if (model.provider !== providerId || model.aliasOf || keep.has(id))
|
|
226
|
+
continue;
|
|
227
|
+
if (id !== `${model.provider}/${model.model}`)
|
|
228
|
+
continue;
|
|
229
|
+
this.models.delete(id);
|
|
230
|
+
gone.add(id);
|
|
231
|
+
}
|
|
232
|
+
for (const [id, model] of this.models) {
|
|
233
|
+
if (model.aliasOf && gone.has(model.aliasOf))
|
|
234
|
+
this.models.delete(id);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
205
237
|
/**
|
|
206
238
|
* Register a discovered spec, plus the bare alias that lets `/model kimi-k3`
|
|
207
239
|
* work and not only `/model moonshot/kimi-k3`. First provider to claim a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAMnD;;;;;;GAMG;AACH,MAAM,OAAO,gBAAgB;IACV,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC/C,gBAAgB,GAAoC,EAAE,CAAC;IAE/D;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAChB,OAAgB,EAChB,OAA6E,EAAE;QAE/E,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACxC,QAAQ,CAAC,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;QAE9C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,uEAAuE;YACvE,+DAA+D;YAC/D,QAAQ,CAAC,gBAAgB,CACvB,IAAI,iBAAiB,CACnB,aAAa,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAC3E,CACF,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM;YAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,0EAA0E;IAC1E,YAAY,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,oBAAoB;QAClB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC;IAED,gBAAgB,CAAC,QAAkB;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wEAAwE;IACxE,cAAc,CAAC,QAAkB,EAAE,MAA4B;QAC7D,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,WAAW,CAAC,gCAAgC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1G,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvF,MAAM,IAAI,WAAW,CAAC,4CAA4C,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7D,OAAO,GAAG,EAAE;YACV,4EAA4E;YAC5E,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,QAAQ;gBAAE,OAAO;YACzD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACnC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE;oBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,wBAAwB,CAAC,IAAuD;QAC9E,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,YAAY,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,6DAA6D;IAC7D,uBAAuB,CAAC,KAAsB,EAAE,QAA6B,EAAE;QAC7E,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;QACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,iBAAiB,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,aAAa,CAAC,IAAe;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,GAAW;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAC9E,CAAC;YACF,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,wEAAwE;YACxE,+DAA+D;YAC/D,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnC,OAAO,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QACxE,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,IAAI,WAAW,CACnB,kBAAkB,GAAG,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,OAA+D,EAAE;QAC1E,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,GAAG,CAAC;QACrC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,aAAa;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa,CAAC,UAAmB;QACrC,MAAM,OAAO,GAAG,UAAU;YACxB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;YAChF,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjC,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,UAAU;gBAAE,SAAS;YACnC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,gEAAgE;gBAChE,8BAA8B;gBAC9B,SAAS;YACX,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,WAAW,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,CAAC,UAAU;YAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAE3D,IAAI,KAAkB,CAAC;QACvB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,UAAU,CAAC,QAAkB;QACzC,OAAO,eAAe,CAAC,MAAM,QAAQ,CAAC,UAAW,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9E,CAAC;IAED;;;;;;;;;;OAUG;IACK,MAAM,CAAC,UAAkB,EAAE,MAA4B;QAC7D,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO;QAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YAC7E,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;gBAAE,SAAS;YACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;QACD,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,IAAe;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF;AAaD;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,UAAkB,EAAE,OAAe;IAC3D,OAAO;QACL,EAAE,EAAE,GAAG,UAAU,IAAI,OAAO,EAAE;QAC9B,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,OAAO;QACpB,aAAa,EAAE,OAAO;QACtB,eAAe,EAAE,KAAK;QACtB,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,KAAK;QACrB,yBAAyB,EAAE,IAAI;QAC/B,mBAAmB,EAAE,KAAK;QAC1B,mBAAmB,EAAE,IAAI;QACzB,YAAY,EAAE,MAAM;QACpB,YAAY,EAAE,EAAE;QAChB,gBAAgB,EAAE,IAAI;KACvB,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,SAAS,aAAa,CAAC,KAAsB,EAAE,KAA0B;IACvE,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,WAAW,CAAC,YAAY,KAAK,CAAC,EAAE,8BAA8B,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,IAAI,YAAY,CAAC;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,KAAK;QACR,wEAAwE;QACxE,4DAA4D;QAC5D,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;QAC/C,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,KAAK;QACjB,GAAG;QACH,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,eAAe,EAAE,KAAK,CAAC,SAAS;QAChC,yEAAyE;QACzE,0EAA0E;QAC1E,6CAA6C;QAC7C,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;KACrE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -20,6 +20,13 @@ export interface ModelSpec {
|
|
|
20
20
|
/** The wire model id sent to the API. */
|
|
21
21
|
model: string;
|
|
22
22
|
displayName?: string;
|
|
23
|
+
/**
|
|
24
|
+
* When the model was released, in ms. From models.dev's release date where
|
|
25
|
+
* it knows the model, else the listing's `created` — which some vendors fill
|
|
26
|
+
* with the listing time or a constant, hence second place. Only ever used to
|
|
27
|
+
* order a list; nothing depends on it being exact.
|
|
28
|
+
*/
|
|
29
|
+
releasedAt?: number;
|
|
23
30
|
contextWindow: number;
|
|
24
31
|
maxOutputTokens: number;
|
|
25
32
|
supportsTools: boolean;
|
|
@@ -210,4 +217,18 @@ export interface ProviderCredentials {
|
|
|
210
217
|
* or the API sees two conflicting credentials.
|
|
211
218
|
*/
|
|
212
219
|
export declare function applyAuthHeaders(base: Record<string, string>, resolved: ResolvedAuth | undefined): Record<string, string>;
|
|
220
|
+
/**
|
|
221
|
+
* Confirmed free: both rates quoted, and both of them zero.
|
|
222
|
+
*
|
|
223
|
+
* `undefined === 0` is false, and that is the whole point. Three states live
|
|
224
|
+
* in these two fields — priced, free, and never quoted — and only the middle
|
|
225
|
+
* one is worth putting in front of somebody. Written as `!spec.costPer1MInput`
|
|
226
|
+
* this would fold the outer two into the middle and label every unpriced model
|
|
227
|
+
* free, which is the failure `priceFields` in discovery and `price` in builtin
|
|
228
|
+
* were each written to avoid at their own end.
|
|
229
|
+
*
|
|
230
|
+
* Both rates have to be zero. A model that charges for output alone is a real
|
|
231
|
+
* shape, and it is priced rather than free.
|
|
232
|
+
*/
|
|
233
|
+
export declare function isFree(spec: ModelSpec): boolean;
|
|
213
234
|
export declare function estimateCost(spec: ModelSpec, usage: Usage): number;
|
package/dist/providers/types.js
CHANGED
|
@@ -72,6 +72,22 @@ export function applyAuthHeaders(base, resolved) {
|
|
|
72
72
|
}
|
|
73
73
|
return merged;
|
|
74
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Confirmed free: both rates quoted, and both of them zero.
|
|
77
|
+
*
|
|
78
|
+
* `undefined === 0` is false, and that is the whole point. Three states live
|
|
79
|
+
* in these two fields — priced, free, and never quoted — and only the middle
|
|
80
|
+
* one is worth putting in front of somebody. Written as `!spec.costPer1MInput`
|
|
81
|
+
* this would fold the outer two into the middle and label every unpriced model
|
|
82
|
+
* free, which is the failure `priceFields` in discovery and `price` in builtin
|
|
83
|
+
* were each written to avoid at their own end.
|
|
84
|
+
*
|
|
85
|
+
* Both rates have to be zero. A model that charges for output alone is a real
|
|
86
|
+
* shape, and it is priced rather than free.
|
|
87
|
+
*/
|
|
88
|
+
export function isFree(spec) {
|
|
89
|
+
return spec.costPer1MInput === 0 && spec.costPer1MOutput === 0;
|
|
90
|
+
}
|
|
75
91
|
export function estimateCost(spec, usage) {
|
|
76
92
|
const m = 1_000_000;
|
|
77
93
|
const inTok = usage.inputTokens ?? 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAkGA,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAExG,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5F,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,kBAAkB,CAAC,IAAe;IAChD,OAAO,IAAI,CAAC,YAAY,KAAK,WAAW,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,KAAK,IAAI,CAAC;AAClF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,IAAgC,EAChC,MAAgC;IAEhC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACzD,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACpD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAe,EACf,QAAoC;IAEpC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACrD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC;IAChE,IAAI,QAAQ,EAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,OAAO,KAAK,CAAC;AACf,CAAC;AAYD,sEAAsE;AACtE,MAAM,UAAU,aAAa,CAC3B,IAAe,EACf,SAAkC;IAElC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACrD,IAAI,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACzE,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,KAAK,GAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,0EAA0E;IAC1E,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AA4ED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAA4B,EAC5B,QAAkC;IAElC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,MAAM,GAA2B,EAAE,GAAG,IAAI,EAAE,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,MAAM,CAAC,IAAe;IACpC,OAAO,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAe,EAAE,KAAY;IACxD,MAAM,CAAC,GAAG,SAAS,CAAC;IACpB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAC/C,OAAO,CACL,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACxC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1C,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACvE,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAC1E,CAAC;AACJ,CAAC"}
|
|
@@ -1,35 +1,19 @@
|
|
|
1
1
|
import type { Logger } from "../../util/logger.ts";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* committed for everyone, and gone with the folder. They now sit under the
|
|
8
|
-
* user directory, keyed by the same project id that sessions and cloud sync
|
|
9
|
-
* already use, so every clone of a repository shares one set.
|
|
3
|
+
* Project knowledge is a user-visible project asset. Machine-local indexes,
|
|
4
|
+
* sync baselines and backups stay under the user directory; the Markdown
|
|
5
|
+
* source itself lives at `<project>/MEMORY` and therefore moves and exports
|
|
6
|
+
* with the project.
|
|
10
7
|
*/
|
|
11
|
-
/** Written into a project's notes directory once its old notes have been considered. */
|
|
12
|
-
export declare const LEGACY_MARKER = ".imported-legacy.json";
|
|
13
8
|
export interface MemoryDirectories {
|
|
14
9
|
project: string;
|
|
15
10
|
/** Absent when the user directory is not writable. */
|
|
16
11
|
user?: string;
|
|
17
|
-
/** Notes copied from the old location on this start. */
|
|
18
|
-
migrated: number;
|
|
19
12
|
}
|
|
20
|
-
export declare function
|
|
13
|
+
export declare function projectMemoryDirectory(cwd: string): string;
|
|
21
14
|
export declare function resolveMemoryDirectories(options: {
|
|
22
15
|
cwd: string;
|
|
23
16
|
/** A directory the user configured; used as is, with nothing migrated into it. */
|
|
24
17
|
configured?: string;
|
|
25
18
|
logger?: Logger;
|
|
26
19
|
}): Promise<MemoryDirectories>;
|
|
27
|
-
/**
|
|
28
|
-
* Copy notes from the old directory into the new one, once.
|
|
29
|
-
*
|
|
30
|
-
* Only into an empty directory: merging two sets of notes is sync's job, with
|
|
31
|
-
* its conflict handling, not a startup step's. The marker makes it once — a
|
|
32
|
-
* note someone later deletes in the new place must not return from the old
|
|
33
|
-
* one on the next launch. The old directory is left untouched.
|
|
34
|
-
*/
|
|
35
|
-
export declare function importLegacyMemory(legacy: string, target: string): Promise<number>;
|
|
@@ -1,26 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { copyFile, lstat, mkdir, readdir, stat, writeFile } from "node:fs/promises";
|
|
3
|
-
import { createHash } from "node:crypto";
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
4
2
|
import path from "node:path";
|
|
5
|
-
import { readPluginFile, readUserFile, updateRuntimePluginConfig, writeUserFile } from "../../config-files.js";
|
|
6
3
|
import { userPath } from "../../paths.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* Where memory lives, and moving it there from where it used to.
|
|
10
|
-
*
|
|
11
|
-
* Notes used to sit in `<project>/.oharness/memory`, inside the repository
|
|
12
|
-
* tree: one copy per clone and per worktree, one `git add .` away from being
|
|
13
|
-
* committed for everyone, and gone with the folder. They now sit under the
|
|
14
|
-
* user directory, keyed by the same project id that sessions and cloud sync
|
|
15
|
-
* already use, so every clone of a repository shares one set.
|
|
16
|
-
*/
|
|
17
|
-
/** Written into a project's notes directory once its old notes have been considered. */
|
|
18
|
-
export const LEGACY_MARKER = ".imported-legacy.json";
|
|
19
|
-
export function legacyMemoryDirectory(cwd) {
|
|
20
|
-
return path.join(cwd, ".oharness", "memory");
|
|
4
|
+
export function projectMemoryDirectory(cwd) {
|
|
5
|
+
return path.join(cwd, "MEMORY");
|
|
21
6
|
}
|
|
22
7
|
export async function resolveMemoryDirectories(options) {
|
|
23
|
-
const legacy = legacyMemoryDirectory(options.cwd);
|
|
24
8
|
let user = userPath("memory", "user");
|
|
25
9
|
try {
|
|
26
10
|
await mkdir(user, { recursive: true });
|
|
@@ -30,112 +14,8 @@ export async function resolveMemoryDirectories(options) {
|
|
|
30
14
|
user = undefined;
|
|
31
15
|
}
|
|
32
16
|
if (options.configured) {
|
|
33
|
-
return { project: path.resolve(options.cwd, options.configured), ...(user ? { user } : {})
|
|
34
|
-
}
|
|
35
|
-
const target = userPath("memory", "projects", await projectId(options.cwd));
|
|
36
|
-
try {
|
|
37
|
-
await mkdir(target, { recursive: true });
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
// A container whose home is a read-only layer still has a project volume.
|
|
41
|
-
options.logger?.warn("Memory stays in the project folder: the user directory is not writable", { error: String(error) });
|
|
42
|
-
return { project: legacy, ...(user ? { user } : {}), migrated: 0 };
|
|
43
|
-
}
|
|
44
|
-
let migrated = 0;
|
|
45
|
-
try {
|
|
46
|
-
migrated = await importLegacyMemory(legacy, target);
|
|
47
|
-
if (migrated)
|
|
48
|
-
options.logger?.info("Moved memory notes into the user directory", { count: migrated, from: legacy, to: target });
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
options.logger?.warn("Could not import memory notes from the project folder", { error: String(error) });
|
|
52
|
-
}
|
|
53
|
-
return { project: target, ...(user ? { user } : {}), migrated };
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Copy notes from the old directory into the new one, once.
|
|
57
|
-
*
|
|
58
|
-
* Only into an empty directory: merging two sets of notes is sync's job, with
|
|
59
|
-
* its conflict handling, not a startup step's. The marker makes it once — a
|
|
60
|
-
* note someone later deletes in the new place must not return from the old
|
|
61
|
-
* one on the next launch. The old directory is left untouched.
|
|
62
|
-
*/
|
|
63
|
-
export async function importLegacyMemory(legacy, target) {
|
|
64
|
-
const marker = path.join(target, LEGACY_MARKER);
|
|
65
|
-
if (await exists(marker))
|
|
66
|
-
return 0;
|
|
67
|
-
let names;
|
|
68
|
-
try {
|
|
69
|
-
if ((await lstat(legacy)).isSymbolicLink())
|
|
70
|
-
return 0;
|
|
71
|
-
names = (await readdir(legacy)).filter((name) => name.endsWith(".md"));
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return 0;
|
|
75
|
-
}
|
|
76
|
-
if (!names.length)
|
|
77
|
-
return 0;
|
|
78
|
-
const existing = (await readdir(target)).filter((name) => name.endsWith(".md"));
|
|
79
|
-
if (existing.length) {
|
|
80
|
-
await writeFile(marker, JSON.stringify({ from: legacy, skipped: "target already had notes", at: Date.now() }) + "\n");
|
|
81
|
-
return 0;
|
|
82
|
-
}
|
|
83
|
-
let copied = 0;
|
|
84
|
-
for (const name of names) {
|
|
85
|
-
const from = path.join(legacy, name);
|
|
86
|
-
const info = await lstat(from);
|
|
87
|
-
if (info.isSymbolicLink() || !info.isFile())
|
|
88
|
-
continue;
|
|
89
|
-
try {
|
|
90
|
-
await copyFile(from, path.join(target, name), constants.COPYFILE_EXCL);
|
|
91
|
-
copied++;
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
if (error.code !== "EEXIST")
|
|
95
|
-
throw error;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
await carrySyncSettings(legacy, target);
|
|
99
|
-
await writeFile(marker, JSON.stringify({ from: legacy, copied, at: Date.now() }) + "\n");
|
|
100
|
-
return copied;
|
|
101
|
-
}
|
|
102
|
-
const digest = (value) => createHash("sha256").update(value).digest("hex");
|
|
103
|
-
const object = (x) => !!x && typeof x === "object" && !Array.isArray(x);
|
|
104
|
-
/**
|
|
105
|
-
* Sync consent is keyed by directory. Without carrying it, a person who had
|
|
106
|
-
* switched cloud sync off for the old directory would find it silently on for
|
|
107
|
-
* the new one — the one outcome of a migration that cannot be undone, since
|
|
108
|
-
* an upload cannot be recalled. The baseline goes with it, so the first sync
|
|
109
|
-
* afterwards reconciles rather than treating every note as new.
|
|
110
|
-
*/
|
|
111
|
-
async function carrySyncSettings(legacy, target) {
|
|
112
|
-
const from = digest(path.resolve(legacy));
|
|
113
|
-
const to = digest(path.resolve(target));
|
|
114
|
-
const config = readPluginFile()?.runtimePlugins?.find((plugin) => plugin.id === "memory")?.config;
|
|
115
|
-
const consent = object(config) && object(config.syncTargets) ? config.syncTargets[from] : undefined;
|
|
116
|
-
if (!object(consent))
|
|
117
|
-
return;
|
|
118
|
-
await updateRuntimePluginConfig("memory", (current) => {
|
|
119
|
-
const targets = object(current.syncTargets) ? current.syncTargets : {};
|
|
120
|
-
if (targets[to])
|
|
121
|
-
return current;
|
|
122
|
-
return { ...current, syncTargets: { ...targets, [to]: consent } };
|
|
123
|
-
});
|
|
124
|
-
if (typeof consent.userId === "string" && consent.userId && typeof consent.origin === "string") {
|
|
125
|
-
const oldState = `memory-sync/${digest(`${consent.origin}:${consent.userId}:${from}`)}.json`;
|
|
126
|
-
const newState = `memory-sync/${digest(`${consent.origin}:${consent.userId}:${to}`)}.json`;
|
|
127
|
-
const state = readUserFile(oldState);
|
|
128
|
-
if (state && !readUserFile(newState))
|
|
129
|
-
await writeUserFile(newState, state);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
async function exists(file) {
|
|
133
|
-
try {
|
|
134
|
-
await stat(file);
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
return false;
|
|
17
|
+
return { project: path.resolve(options.cwd, options.configured), ...(user ? { user } : {}) };
|
|
139
18
|
}
|
|
19
|
+
return { project: projectMemoryDirectory(options.cwd), ...(user ? { user } : {}) };
|
|
140
20
|
}
|
|
141
21
|
//# sourceMappingURL=memory-migrate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-migrate.js","sourceRoot":"","sources":["../../../src/runtime-plugins/builtin/memory-migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"memory-migrate.js","sourceRoot":"","sources":["../../../src/runtime-plugins/builtin/memory-migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgB1C,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAK9C;IACC,IAAI,IAAI,GAAuB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,mEAAmE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpH,IAAI,GAAG,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACrF,CAAC"}
|
|
@@ -34,6 +34,8 @@ export interface PullSummary {
|
|
|
34
34
|
interface Options {
|
|
35
35
|
cwd: string;
|
|
36
36
|
directory: string;
|
|
37
|
+
/** Stable logical identity for Home-side consent, baselines and statistics. */
|
|
38
|
+
stateKey?: string;
|
|
37
39
|
/** Which notes this service holds. User-level notes belong to no project. */
|
|
38
40
|
scope?: MemoryScope;
|
|
39
41
|
policy?: MemoryPolicy;
|
|
@@ -55,6 +57,7 @@ interface Options {
|
|
|
55
57
|
coordinator?: MemorySyncCoordinator;
|
|
56
58
|
}
|
|
57
59
|
export interface MemoryPluginOptions extends Omit<Options, "scope"> {
|
|
60
|
+
projectId: string;
|
|
58
61
|
/** User-level notes directory. Omitted when it could not be created. */
|
|
59
62
|
userDirectory?: string;
|
|
60
63
|
/** One reply from the small model, for merge proposals. Without it merges are drafted by hand. */
|
|
@@ -86,9 +86,10 @@ export class MemoryService {
|
|
|
86
86
|
const policy = options.policy ?? DEFAULT_MEMORY_POLICY;
|
|
87
87
|
this.store = new MemoryStore(options.directory, {
|
|
88
88
|
maxNotes: policy.maxNotes, maxNoteBytes: policy.maxNoteBytes, scope: this.scope,
|
|
89
|
+
...(options.stateKey ? { stateKey: options.stateKey } : {}),
|
|
89
90
|
...(options.onWarning ? { onWarning: options.onWarning } : {}),
|
|
90
91
|
});
|
|
91
|
-
this.target = digest(path.resolve(options.directory));
|
|
92
|
+
this.target = digest(options.stateKey ?? path.resolve(options.directory));
|
|
92
93
|
this.coordinator = options.coordinator ?? MemorySyncCoordinator.shared;
|
|
93
94
|
this.syncTarget = {
|
|
94
95
|
scope: this.scope,
|
|
@@ -856,13 +857,13 @@ export function acquireMemoryService(options) {
|
|
|
856
857
|
},
|
|
857
858
|
};
|
|
858
859
|
}
|
|
859
|
-
/** Recall counts per
|
|
860
|
+
/** Recall counts per logical scope, shared so one Home-side file has one writer. */
|
|
860
861
|
const sharedUsage = new Map();
|
|
861
|
-
function usageFor(
|
|
862
|
-
const key =
|
|
862
|
+
function usageFor(stateKey) {
|
|
863
|
+
const key = stateKey;
|
|
863
864
|
let usage = sharedUsage.get(key);
|
|
864
865
|
if (!usage) {
|
|
865
|
-
usage = new MemoryUsage(
|
|
866
|
+
usage = new MemoryUsage(stateKey);
|
|
866
867
|
sharedUsage.set(key, usage);
|
|
867
868
|
}
|
|
868
869
|
return usage;
|
|
@@ -926,15 +927,16 @@ export function createMemoryPlugin(options, onReady) {
|
|
|
926
927
|
setup(ctx) {
|
|
927
928
|
const policy = options.policy ?? DEFAULT_MEMORY_POLICY;
|
|
928
929
|
const warn = options.onWarning ?? ((message) => ctx.logger.warn(message));
|
|
929
|
-
const
|
|
930
|
+
const projectStateKey = `project:${options.projectId}`;
|
|
931
|
+
const projectLease = acquireMemoryService({ ...options, stateKey: projectStateKey, scope: "project", policy, onWarning: warn });
|
|
930
932
|
const userLease = options.userDirectory
|
|
931
|
-
? acquireMemoryService({ ...options, directory: options.userDirectory, scope: "user", policy, onWarning: warn })
|
|
933
|
+
? acquireMemoryService({ ...options, stateKey: "user", directory: options.userDirectory, scope: "user", policy, onWarning: warn })
|
|
932
934
|
: undefined;
|
|
933
935
|
const project = projectLease.service, user = userLease?.service;
|
|
934
936
|
onReady(project, user);
|
|
935
937
|
const services = [project, ...(user ? [user] : [])];
|
|
936
938
|
const stores = { project: project.store, ...(user ? { user: user.store } : {}) };
|
|
937
|
-
const usage = { project: usageFor(
|
|
939
|
+
const usage = { project: usageFor(projectStateKey), ...(user ? { user: usageFor("user") } : {}) };
|
|
938
940
|
let closing;
|
|
939
941
|
const closeAll = () => closing ??= (async () => {
|
|
940
942
|
await Promise.all([projectLease.release(), userLease?.release()]);
|
|
@@ -992,7 +994,7 @@ export function createMemoryPlugin(options, onReady) {
|
|
|
992
994
|
};
|
|
993
995
|
ctx.memory.register(provider);
|
|
994
996
|
// --- consolidation -------------------------------------------------
|
|
995
|
-
const reviewFile = `memory-review/${digest(`${
|
|
997
|
+
const reviewFile = `memory-review/${digest(`${projectStateKey}\0${user ? "user" : ""}`)}.json`;
|
|
996
998
|
const readReview = () => { try {
|
|
997
999
|
return readUserFile(reviewFile) ?? {};
|
|
998
1000
|
}
|
|
@@ -1115,7 +1117,7 @@ export function createMemoryPlugin(options, onReady) {
|
|
|
1115
1117
|
links: { out: links?.outgoing.get(entry.id) ?? [], in: links?.incoming.get(entry.id) ?? [], dangling: links?.dangling.get(entry.id) ?? [] },
|
|
1116
1118
|
}));
|
|
1117
1119
|
const synced = scoped.map((one) => one.lastSync);
|
|
1118
|
-
const backups = await listBackups(50).catch(() => []);
|
|
1120
|
+
const backups = (await listBackups(50).catch(() => [])).filter((backup) => backup.scope === "user" || backup.projectId === options.projectId);
|
|
1119
1121
|
const findings = await review().catch(() => []);
|
|
1120
1122
|
const reviewState = readReview();
|
|
1121
1123
|
return {
|