@opendatalabs/personal-server-ts-core 0.0.1-canary.052d47e → 0.0.1-canary.06bc7b9
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/api/index.d.ts +52 -5
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +47 -3
- package/dist/api/index.js.map +1 -1
- package/dist/api/raw-envelope.d.ts +3 -0
- package/dist/api/raw-envelope.d.ts.map +1 -0
- package/dist/api/raw-envelope.js +215 -0
- package/dist/api/raw-envelope.js.map +1 -0
- package/dist/contracts/sync.d.ts.map +1 -1
- package/dist/contracts/sync.js +1 -0
- package/dist/contracts/sync.js.map +1 -1
- package/dist/derivatives/answer-shape.d.ts +83 -0
- package/dist/derivatives/answer-shape.d.ts.map +1 -0
- package/dist/derivatives/answer-shape.js +320 -0
- package/dist/derivatives/answer-shape.js.map +1 -0
- package/dist/derivatives/api.d.ts +1 -1
- package/dist/derivatives/api.d.ts.map +1 -1
- package/dist/derivatives/api.js +8 -0
- package/dist/derivatives/api.js.map +1 -1
- package/dist/derivatives/compute.d.ts +9 -3
- package/dist/derivatives/compute.d.ts.map +1 -1
- package/dist/derivatives/compute.js +68 -6
- package/dist/derivatives/compute.js.map +1 -1
- package/dist/derivatives/index.d.ts +2 -1
- package/dist/derivatives/index.d.ts.map +1 -1
- package/dist/derivatives/index.js +2 -1
- package/dist/derivatives/index.js.map +1 -1
- package/dist/derivatives/prompt.d.ts +35 -0
- package/dist/derivatives/prompt.d.ts.map +1 -1
- package/dist/derivatives/prompt.js +96 -8
- package/dist/derivatives/prompt.js.map +1 -1
- package/dist/derivatives/registration.d.ts +7 -5
- package/dist/derivatives/registration.d.ts.map +1 -1
- package/dist/derivatives/registration.js +12 -5
- package/dist/derivatives/registration.js.map +1 -1
- package/dist/derivatives/scheduler.d.ts +39 -9
- package/dist/derivatives/scheduler.d.ts.map +1 -1
- package/dist/derivatives/scheduler.js +81 -7
- package/dist/derivatives/scheduler.js.map +1 -1
- package/dist/derivatives/store.d.ts.map +1 -1
- package/dist/derivatives/store.js +2 -0
- package/dist/derivatives/store.js.map +1 -1
- package/dist/derivatives/types.d.ts +13 -3
- package/dist/derivatives/types.d.ts.map +1 -1
- package/dist/derivatives/types.js +2 -0
- package/dist/derivatives/types.js.map +1 -1
- package/dist/mcp/connection-api.d.ts +20 -1
- package/dist/mcp/connection-api.d.ts.map +1 -1
- package/dist/mcp/connection-api.js +88 -7
- package/dist/mcp/connection-api.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/read-client.d.ts +2 -0
- package/dist/mcp/read-client.d.ts.map +1 -1
- package/dist/mcp/read-client.js +4 -1
- package/dist/mcp/read-client.js.map +1 -1
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +154 -15
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/store.d.ts.map +1 -1
- package/dist/mcp/store.js +9 -0
- package/dist/mcp/store.js.map +1 -1
- package/dist/mcp/token-expiry.d.ts +38 -0
- package/dist/mcp/token-expiry.d.ts.map +1 -0
- package/dist/mcp/token-expiry.js +55 -0
- package/dist/mcp/token-expiry.js.map +1 -0
- package/dist/mcp/tools.d.ts +14 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +8 -3
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/types.d.ts +32 -4
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/ports/index.d.ts +4 -0
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js.map +1 -1
- package/dist/storage/adapters/vana.d.ts +1 -1
- package/dist/storage/adapters/vana.d.ts.map +1 -1
- package/dist/storage/adapters/vana.js +6 -1
- package/dist/storage/adapters/vana.js.map +1 -1
- package/dist/sync/engine/sync-manager.d.ts +4 -0
- package/dist/sync/engine/sync-manager.d.ts.map +1 -1
- package/dist/sync/engine/sync-manager.js +39 -1
- package/dist/sync/engine/sync-manager.js.map +1 -1
- package/dist/sync/types.d.ts +2 -0
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/sync/workers/download.d.ts +7 -0
- package/dist/sync/workers/download.d.ts.map +1 -1
- package/dist/sync/workers/download.js +72 -0
- package/dist/sync/workers/download.js.map +1 -1
- package/dist/sync/workers/upload.d.ts +1 -1
- package/dist/sync/workers/upload.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Recompute scheduler: marks registrations stale when one of their source
|
|
3
|
-
* scopes changes and runs the compute
|
|
4
|
-
* per question. Timers and the clock are injectable
|
|
5
|
-
* deterministically.
|
|
3
|
+
* scopes changes and runs the compute when someone actually asks for the
|
|
4
|
+
* answer, one in flight per question. Timers and the clock are injectable
|
|
5
|
+
* so tests drive it deterministically.
|
|
6
|
+
*
|
|
7
|
+
* Compute is just-in-time, not preemptive. A source refresh only marks the
|
|
8
|
+
* answer stale; the recompute happens on the next authorized demand (a read
|
|
9
|
+
* of the derived scope, the reader-facing status route, or an explicit
|
|
10
|
+
* `POST /questions/:id/recompute`). Otherwise the inference bill would
|
|
11
|
+
* scale with how often the owner's sources refresh rather than with how
|
|
12
|
+
* often anyone reads the answer.
|
|
6
13
|
*/
|
|
7
14
|
import type { ComputeOutcome } from "./compute.js";
|
|
8
15
|
import type { QuestionStore } from "./types.js";
|
|
@@ -18,7 +25,11 @@ export interface RecomputeSchedulerOptions {
|
|
|
18
25
|
* void) silently disables automatic retries, so forward it.
|
|
19
26
|
*/
|
|
20
27
|
compute(questionId: string): Promise<ComputeOutcome | void>;
|
|
21
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Quiet period before a recompute that was requested without `immediate`
|
|
30
|
+
* (default 5s). A source change schedules nothing at all, and demand runs
|
|
31
|
+
* at once, so nothing on the default deployment waits on this.
|
|
32
|
+
*/
|
|
22
33
|
debounceMs?: number;
|
|
23
34
|
/**
|
|
24
35
|
* Backoff steps for automatic retry of a compute that failed with the
|
|
@@ -44,12 +55,27 @@ export interface RecomputeScheduler {
|
|
|
44
55
|
/**
|
|
45
56
|
* A scope got a new local version (ingest or sync). Every registration
|
|
46
57
|
* that lists it as a source is marked `stale` (if it had a result) and
|
|
47
|
-
* scheduled. Fire and forget;
|
|
58
|
+
* NOTHING is scheduled: the recompute waits for demand. Fire and forget;
|
|
59
|
+
* failures are logged.
|
|
48
60
|
*/
|
|
49
61
|
markSourceChanged(scope: string, options?: {
|
|
50
62
|
/** `$lineage.sources` of the new version, when it is a derivative. */
|
|
51
63
|
lineageSources?: readonly string[];
|
|
52
64
|
}): void;
|
|
65
|
+
/**
|
|
66
|
+
* An authorized caller asked for the answer behind `derivedScope` — a read
|
|
67
|
+
* of the derived data, or the reader-facing status route. Every
|
|
68
|
+
* `on-change` question on that scope that is waiting for a compute
|
|
69
|
+
* (`stale` or `pending`) runs now; one already running or already
|
|
70
|
+
* scheduled is left alone, so N concurrent readers cause one compute.
|
|
71
|
+
*
|
|
72
|
+
* Callers MUST authorize first: this spends an inference call, and the
|
|
73
|
+
* whole point of running on demand is that the bill follows real reads.
|
|
74
|
+
* A `failed` question is not woken (its backoff chain or an explicit
|
|
75
|
+
* recompute owns it) so that polling a permanently failing question
|
|
76
|
+
* cannot spend a call per poll. Fire and forget; failures are logged.
|
|
77
|
+
*/
|
|
78
|
+
markDemand(derivedScope: string): void;
|
|
53
79
|
/** Schedule one question; `immediate` skips the debounce (owner recompute). */
|
|
54
80
|
requestRecompute(questionId: string, options?: {
|
|
55
81
|
immediate?: boolean;
|
|
@@ -73,10 +99,14 @@ export interface RecomputeScheduler {
|
|
|
73
99
|
/** Cancel pending timers. In-flight computes finish on their own. */
|
|
74
100
|
stop(): void;
|
|
75
101
|
/**
|
|
76
|
-
* Schedule every question left `pending`
|
|
77
|
-
*
|
|
78
|
-
* the
|
|
79
|
-
*
|
|
102
|
+
* Schedule every question left `pending` (immediately). The first call is
|
|
103
|
+
* the boot reschedule: a question that has never produced an answer is
|
|
104
|
+
* owed the compute its registration asked for, and a restarted process
|
|
105
|
+
* only holds what the store holds. A `stale` question is NOT swept — it
|
|
106
|
+
* has an answer to serve and waits for demand, otherwise every restart
|
|
107
|
+
* (and in PS-Lite every tab that opens) would pay for the recomputes this
|
|
108
|
+
* scheduler exists to defer. Later calls resume after `stop()`;
|
|
109
|
+
* idempotent while running.
|
|
80
110
|
*/
|
|
81
111
|
start(): void;
|
|
82
112
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/derivatives/scheduler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/derivatives/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACtD,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,aAAa,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5D;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAChE,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,iBAAiB,CACf,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,sEAAsE;QACtE,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KACpC,GACA,IAAI,CAAC;IACR;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,+EAA+E;IAC/E,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9E;;;;;OAKG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/C;;;;;OAKG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3C,oEAAoE;IACpE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,qEAAqE;IACrE,IAAI,IAAI,IAAI,CAAC;IACb;;;;;;;;;OASG;IACH,KAAK,IAAI,IAAI,CAAC;CACf;AA0DD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,yBAAyB,GACjC,kBAAkB,CA8UpB"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Recompute scheduler: marks registrations stale when one of their source
|
|
3
|
-
* scopes changes and runs the compute
|
|
4
|
-
* per question. Timers and the clock are injectable
|
|
5
|
-
* deterministically.
|
|
3
|
+
* scopes changes and runs the compute when someone actually asks for the
|
|
4
|
+
* answer, one in flight per question. Timers and the clock are injectable
|
|
5
|
+
* so tests drive it deterministically.
|
|
6
|
+
*
|
|
7
|
+
* Compute is just-in-time, not preemptive. A source refresh only marks the
|
|
8
|
+
* answer stale; the recompute happens on the next authorized demand (a read
|
|
9
|
+
* of the derived scope, the reader-facing status route, or an explicit
|
|
10
|
+
* `POST /questions/:id/recompute`). Otherwise the inference bill would
|
|
11
|
+
* scale with how often the owner's sources refresh rather than with how
|
|
12
|
+
* often anyone reads the answer.
|
|
6
13
|
*/
|
|
7
14
|
import { computeDataPointId } from "../sync/data-point-id.js";
|
|
8
15
|
const DEFAULT_RETRY_DELAYS_MS = [60_000, 300_000, 1_800_000];
|
|
@@ -64,6 +71,7 @@ export function createRecomputeScheduler(options) {
|
|
|
64
71
|
retryAtMs: null,
|
|
65
72
|
retryScheduled: false,
|
|
66
73
|
retryRunning: false,
|
|
74
|
+
sourceChangedDuringRun: false,
|
|
67
75
|
};
|
|
68
76
|
states.set(questionId, state);
|
|
69
77
|
}
|
|
@@ -92,6 +100,11 @@ export function createRecomputeScheduler(options) {
|
|
|
92
100
|
state.running = null;
|
|
93
101
|
state.retryAtMs = null;
|
|
94
102
|
state.retryRunning = false;
|
|
103
|
+
// Consumed here whichever branch wins: a rerun and a retry both
|
|
104
|
+
// recompute from current data, so only the branch that schedules
|
|
105
|
+
// nothing has to put the question back to `stale`.
|
|
106
|
+
const sourceChangedDuringRun = state.sourceChangedDuringRun;
|
|
107
|
+
state.sourceChangedDuringRun = false;
|
|
95
108
|
const retryable = isTransientFailureOutcome(outcome) ||
|
|
96
109
|
// A runtime-unavailable skip DURING a chain consumes an attempt
|
|
97
110
|
// instead of ending the chain; on a fresh compute it keeps the
|
|
@@ -122,6 +135,12 @@ export function createRecomputeScheduler(options) {
|
|
|
122
135
|
}
|
|
123
136
|
else {
|
|
124
137
|
state.retryAttempts = 0;
|
|
138
|
+
if (sourceChangedDuringRun) {
|
|
139
|
+
// Fresh data landed while this compute was reading, so the
|
|
140
|
+
// answer it just wrote is already behind. Say so — and
|
|
141
|
+
// schedule nothing: the next reader triggers the recompute.
|
|
142
|
+
await markStale(questionId);
|
|
143
|
+
}
|
|
125
144
|
if (!states.get(questionId)?.timer) {
|
|
126
145
|
states.delete(questionId);
|
|
127
146
|
}
|
|
@@ -147,6 +166,23 @@ export function createRecomputeScheduler(options) {
|
|
|
147
166
|
run(questionId);
|
|
148
167
|
}, delayMs);
|
|
149
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Run this question because someone asked for its answer. Idempotent by
|
|
171
|
+
* design: a compute already in flight or already timed is the compute the
|
|
172
|
+
* demand wants, so concurrent readers collapse into one run. A pending
|
|
173
|
+
* RETRY timer is the exception — its backoff is a fallback for nobody
|
|
174
|
+
* asking, and a reader is asking now — so demand pulls it forward,
|
|
175
|
+
* keeping the attempt count (an exhausting chain stays bounded).
|
|
176
|
+
*/
|
|
177
|
+
function scheduleDemand(questionId) {
|
|
178
|
+
const state = stateFor(questionId);
|
|
179
|
+
if (state.running !== null)
|
|
180
|
+
return;
|
|
181
|
+
if (state.timer !== null && !state.retryScheduled)
|
|
182
|
+
return;
|
|
183
|
+
schedule(questionId, 0);
|
|
184
|
+
state.retryScheduled = false;
|
|
185
|
+
}
|
|
150
186
|
async function markStale(questionId) {
|
|
151
187
|
const registration = await options.store.get(questionId);
|
|
152
188
|
if (!registration)
|
|
@@ -194,12 +230,48 @@ export function createRecomputeScheduler(options) {
|
|
|
194
230
|
// The new version descends from this question's own output.
|
|
195
231
|
continue;
|
|
196
232
|
}
|
|
233
|
+
// A change lands on a question whose compute is in flight: that
|
|
234
|
+
// compute never saw the new data, so its result must not settle
|
|
235
|
+
// as `ready`. Read the flag before and after the store write —
|
|
236
|
+
// the run can finish inside that await.
|
|
237
|
+
const state = states.get(registration.questionId);
|
|
238
|
+
const runningBefore = state?.running != null;
|
|
197
239
|
await markStale(registration.questionId);
|
|
198
|
-
|
|
199
|
-
|
|
240
|
+
if (state && (runningBefore || state.running !== null)) {
|
|
241
|
+
state.sourceChangedDuringRun = true;
|
|
242
|
+
}
|
|
243
|
+
// Nothing is scheduled: the recompute is owed, not started. Any
|
|
244
|
+
// retry timer the question already carries stays as it is; the
|
|
245
|
+
// retry recomputes from current data anyway.
|
|
200
246
|
}
|
|
201
247
|
})().catch((err) => warn({ scope, error: err instanceof Error ? err.name : String(err) }, "Could not mark derivative questions stale")));
|
|
202
248
|
},
|
|
249
|
+
markDemand(derivedScope) {
|
|
250
|
+
if (stopped)
|
|
251
|
+
return;
|
|
252
|
+
void track((async () => {
|
|
253
|
+
const affected = await options.store.list({ derivedScope });
|
|
254
|
+
for (const registration of affected) {
|
|
255
|
+
if (registration.recompute === "snapshot") {
|
|
256
|
+
// A snapshot answers from the version it computed at
|
|
257
|
+
// registration; only an explicit recompute replaces it.
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (registration.status !== "stale" &&
|
|
261
|
+
registration.status !== "pending") {
|
|
262
|
+
// `ready` has nothing to compute, and `failed` belongs to its
|
|
263
|
+
// backoff chain or to an explicit recompute: a reader polling
|
|
264
|
+
// a question that keeps failing must not spend an inference
|
|
265
|
+
// call per poll.
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
scheduleDemand(registration.questionId);
|
|
269
|
+
}
|
|
270
|
+
})().catch((err) => warn({
|
|
271
|
+
derivedScope,
|
|
272
|
+
error: err instanceof Error ? err.name : String(err),
|
|
273
|
+
}, "Could not schedule derivative questions on demand")));
|
|
274
|
+
},
|
|
203
275
|
requestRecompute(questionId, opts) {
|
|
204
276
|
if (stopped)
|
|
205
277
|
return;
|
|
@@ -245,8 +317,10 @@ export function createRecomputeScheduler(options) {
|
|
|
245
317
|
stopped = false;
|
|
246
318
|
void track((async () => {
|
|
247
319
|
for (const registration of await options.store.list()) {
|
|
248
|
-
|
|
249
|
-
|
|
320
|
+
// Only never-answered questions. A `stale` one has a previous
|
|
321
|
+
// version to serve and is recomputed on demand, so a restart
|
|
322
|
+
// costs nothing.
|
|
323
|
+
if (registration.status === "pending") {
|
|
250
324
|
schedule(registration.questionId, 0);
|
|
251
325
|
}
|
|
252
326
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/derivatives/scheduler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/derivatives/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/derivatives/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/derivatives/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAEpB,aAAa,EACb,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAapB,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,oBAAoB,EAClC,MAAM,EAAE,uBAAuB,GAAG,SAAS,GAC1C,OAAO,CAkBT;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAC3B,aAAa,EAAE,oBAAoB,EAAE,GACpC,oBAAoB,EAAE,CAMxB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,GAAE;IACP,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,oBAAoB,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;CAC7B,GACL,aAAa,CA4Cf"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { cloneAnswerShape } from "./answer-shape.js";
|
|
1
2
|
function clone(registration) {
|
|
2
3
|
return {
|
|
3
4
|
...registration,
|
|
4
5
|
// Registrations persisted before the field existed load as null.
|
|
5
6
|
errorCode: registration.errorCode ?? null,
|
|
7
|
+
answerShape: cloneAnswerShape(registration.answerShape ?? null),
|
|
6
8
|
sourceScopes: [...registration.sourceScopes],
|
|
7
9
|
registeredBy: { ...registration.registeredBy },
|
|
8
10
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/derivatives/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/derivatives/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,15 @@
|
|
|
5
5
|
* = the source data points) into the derived scope. See
|
|
6
6
|
* docs/derivative-data-api.md, "Compute (question to derivative)".
|
|
7
7
|
*/
|
|
8
|
+
import { type AnswerShape } from "./answer-shape.js";
|
|
8
9
|
export type QuestionStatus = "pending" | "ready" | "failed" | "stale";
|
|
9
10
|
/**
|
|
10
|
-
* When the answer recomputes: "on-change"
|
|
11
|
-
*
|
|
12
|
-
* and afterwards only on an explicit
|
|
11
|
+
* When the answer recomputes: "on-change" (the default) goes stale on every
|
|
12
|
+
* source change and recomputes on the next authorized demand for the answer;
|
|
13
|
+
* "snapshot" computes at registration and afterwards only on an explicit
|
|
14
|
+
* POST /questions/:id/recompute. Two values, and only these two: the SDK
|
|
15
|
+
* validates the field against them, so the meaning of "on-change" moves
|
|
16
|
+
* rather than the vocabulary.
|
|
13
17
|
*/
|
|
14
18
|
export type QuestionRecompute = "snapshot" | "on-change";
|
|
15
19
|
/**
|
|
@@ -37,6 +41,11 @@ export interface QuestionRegistration {
|
|
|
37
41
|
question: string;
|
|
38
42
|
/** Model override; null = the provider's default. */
|
|
39
43
|
model: string | null;
|
|
44
|
+
/**
|
|
45
|
+
* The declared shape of the answer, enforced at compute time; null = the
|
|
46
|
+
* free-text answer (the original behavior).
|
|
47
|
+
*/
|
|
48
|
+
answerShape: AnswerShape | null;
|
|
40
49
|
recompute: QuestionRecompute;
|
|
41
50
|
registeredBy: QuestionRegisteredBy;
|
|
42
51
|
status: QuestionStatus;
|
|
@@ -77,6 +86,7 @@ export interface QuestionRegistrationView {
|
|
|
77
86
|
sourceScopes: string[];
|
|
78
87
|
question: string;
|
|
79
88
|
model: string | null;
|
|
89
|
+
answerShape: AnswerShape | null;
|
|
80
90
|
recompute: QuestionRecompute;
|
|
81
91
|
registeredBy: QuestionRegisteredBy;
|
|
82
92
|
status: QuestionStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/derivatives/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtE
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/derivatives/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtE;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,WAAW,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAC3B,uBAAuB,GAAG,gBAAgB,GAAG,eAAe,GAAG,UAAU,CAAC;AAE5E,0EAA0E;AAC1E,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,YAAY,EAAE,oBAAoB,CAAC;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0DAA0D;IAC1D,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wEAAwE;IACxE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAC7C,IAAI,CACF,oBAAoB,EAClB,QAAQ,GACR,OAAO,GACP,WAAW,GACX,WAAW,GACX,gBAAgB,GAChB,gBAAgB,GAChB,oBAAoB,CACvB,CACF,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,MAAM,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACxE,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAC9D,MAAM,CAAC,YAAY,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,+DAA+D;IAC/D,MAAM,CACJ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C;AAED,yEAAyE;AACzE,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,YAAY,EAAE,oBAAoB,CAAC;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,oBAAoB,GACjC,wBAAwB,CAmB1B"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* = the source data points) into the derived scope. See
|
|
6
6
|
* docs/derivative-data-api.md, "Compute (question to derivative)".
|
|
7
7
|
*/
|
|
8
|
+
import { cloneAnswerShape } from "./answer-shape.js";
|
|
8
9
|
export function questionRegistrationView(registration) {
|
|
9
10
|
return {
|
|
10
11
|
questionId: registration.questionId,
|
|
@@ -12,6 +13,7 @@ export function questionRegistrationView(registration) {
|
|
|
12
13
|
sourceScopes: [...registration.sourceScopes],
|
|
13
14
|
question: registration.question,
|
|
14
15
|
model: registration.model,
|
|
16
|
+
answerShape: cloneAnswerShape(registration.answerShape),
|
|
15
17
|
recompute: registration.recompute,
|
|
16
18
|
registeredBy: registration.registeredBy,
|
|
17
19
|
status: registration.status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/derivatives/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/derivatives/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAoB,MAAM,mBAAmB,CAAC;AAkHvE,MAAM,UAAU,wBAAwB,CACtC,YAAkC;IAElC,OAAO;QACL,UAAU,EAAE,YAAY,CAAC,UAAU;QACnC,YAAY,EAAE,YAAY,CAAC,YAAY;QACvC,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC;QAC5C,QAAQ,EAAE,YAAY,CAAC,QAAQ;QAC/B,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,WAAW,EAAE,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC;QACvD,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,YAAY,EAAE,YAAY,CAAC,YAAY;QACvC,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,cAAc,EAAE,YAAY,CAAC,cAAc;QAC3C,cAAc,EAAE,YAAY,CAAC,cAAc;QAC3C,kBAAkB,EAAE,YAAY,CAAC,kBAAkB;KACpD,CAAC;AACJ,CAAC"}
|
|
@@ -162,9 +162,28 @@ export interface RedeemMcpOAuthAuthorizationCodeOptions {
|
|
|
162
162
|
connectionStore: McpConnectionStore;
|
|
163
163
|
now?: () => Date;
|
|
164
164
|
}
|
|
165
|
-
export interface
|
|
165
|
+
export interface McpOAuthTokenOutput {
|
|
166
166
|
accessToken: string;
|
|
167
|
+
/** Presented to `grant_type=refresh_token` for the next pair. Single use. */
|
|
168
|
+
refreshToken: string;
|
|
169
|
+
/** Seconds until the bearer stops resolving — RFC 6749 `expires_in`. */
|
|
170
|
+
expiresIn: number;
|
|
167
171
|
scope?: string;
|
|
168
172
|
}
|
|
173
|
+
export type RedeemMcpOAuthAuthorizationCodeOutput = McpOAuthTokenOutput;
|
|
169
174
|
export declare function redeemMcpOAuthAuthorizationCode(input: RedeemMcpOAuthAuthorizationCodeInput, options: RedeemMcpOAuthAuthorizationCodeOptions): Promise<RedeemMcpOAuthAuthorizationCodeOutput>;
|
|
175
|
+
export interface RefreshMcpOAuthTokenInput {
|
|
176
|
+
refreshToken: string;
|
|
177
|
+
clientId: string;
|
|
178
|
+
}
|
|
179
|
+
export interface RefreshMcpOAuthTokenOptions {
|
|
180
|
+
connectionStore: McpConnectionStore;
|
|
181
|
+
now?: () => Date;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* RFC 6749 §6 refresh grant with RFC 9700 §4.14.2 rotation: every exchange
|
|
185
|
+
* mints a new pair and retires the presented refresh token, so the MCP client
|
|
186
|
+
* renews silently instead of re-consenting once an hour.
|
|
187
|
+
*/
|
|
188
|
+
export declare function refreshMcpOAuthToken(input: RefreshMcpOAuthTokenInput, options: RefreshMcpOAuthTokenOptions): Promise<McpOAuthTokenOutput>;
|
|
170
189
|
//# sourceMappingURL=connection-api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-api.d.ts","sourceRoot":"","sources":["../../src/mcp/connection-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EACV,4BAA4B,EAC5B,aAAa,EACd,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"connection-api.d.ts","sourceRoot":"","sources":["../../src/mcp/connection-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,21 @@
|
|
|
14
14
|
import { generateMcpGrantee } from "./grantee.js";
|
|
15
15
|
import { createGrantContract } from "../contracts/index.js";
|
|
16
16
|
import { appUrlFromOAuthRedirectUri, ensureMcpGranteeRegistered, McpGranteeRegistrationError, } from "./builder-registration.js";
|
|
17
|
+
import { isMcpRefreshExpired, MCP_TOKEN_TTL_MS, mcpRefreshExpiry, mcpTokenExpiry, } from "./token-expiry.js";
|
|
17
18
|
const TOKEN_BYTES = 32;
|
|
18
19
|
const OAUTH_AUTHORIZATION_TTL_MS = 10 * 60 * 1000;
|
|
20
|
+
/** Store patch that drops every refresh token a connection still answers to. */
|
|
21
|
+
const CLEARED_REFRESH_FAMILY = {
|
|
22
|
+
refreshTokenHash: undefined,
|
|
23
|
+
previousRefreshTokenHash: undefined,
|
|
24
|
+
refreshExpiresAt: undefined,
|
|
25
|
+
};
|
|
19
26
|
function nowIso(now) {
|
|
20
27
|
return (now ? now() : new Date()).toISOString();
|
|
21
28
|
}
|
|
29
|
+
function nowMs(now) {
|
|
30
|
+
return (now ? now() : new Date()).getTime();
|
|
31
|
+
}
|
|
22
32
|
function randomBytes(byteLength) {
|
|
23
33
|
const bytes = new Uint8Array(byteLength);
|
|
24
34
|
globalThis.crypto.getRandomValues(bytes);
|
|
@@ -60,6 +70,7 @@ export async function createMcpConnection(input, options) {
|
|
|
60
70
|
granteePublicKey: grantee.key.publicKey,
|
|
61
71
|
encryptedGranteePrivateKey: grantee.key.encryptedPrivateKey,
|
|
62
72
|
tokenHash,
|
|
73
|
+
tokenExpiresAt: mcpTokenExpiry(nowMs(options.now)),
|
|
63
74
|
status: "pending",
|
|
64
75
|
grants: [],
|
|
65
76
|
createdAt,
|
|
@@ -136,9 +147,12 @@ export async function revokeMcpConnection(connectionId, options) {
|
|
|
136
147
|
if (existing.status === "revoked")
|
|
137
148
|
return existing;
|
|
138
149
|
const revokedAt = nowIso(options.now);
|
|
150
|
+
// The refresh token outlives the access token by weeks, so a revoke that
|
|
151
|
+
// left it in place would hand the holder a fresh bearer minutes later.
|
|
139
152
|
const updated = await options.store.update(connectionId, {
|
|
140
153
|
status: "revoked",
|
|
141
154
|
revokedAt,
|
|
155
|
+
...CLEARED_REFRESH_FAMILY,
|
|
142
156
|
});
|
|
143
157
|
if (!updated)
|
|
144
158
|
throw new McpConnectionNotFoundError(connectionId);
|
|
@@ -337,12 +351,12 @@ export async function redeemMcpOAuthAuthorizationCode(input, options) {
|
|
|
337
351
|
}))) {
|
|
338
352
|
throw new McpOAuthAuthorizationError("invalid_grant", "PKCE verification failed");
|
|
339
353
|
}
|
|
340
|
-
const
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
});
|
|
345
|
-
if (!
|
|
354
|
+
const issued = await issueMcpTokenPair({
|
|
355
|
+
connectionId: record.connectionId,
|
|
356
|
+
clientId: record.clientId,
|
|
357
|
+
issuedAtMs: nowMs(options.now),
|
|
358
|
+
}, options.connectionStore);
|
|
359
|
+
if (!issued) {
|
|
346
360
|
throw new McpOAuthAuthorizationError("invalid_grant", "MCP connection for authorization no longer exists");
|
|
347
361
|
}
|
|
348
362
|
await options.authorizationStore.update(record.id, {
|
|
@@ -350,10 +364,77 @@ export async function redeemMcpOAuthAuthorizationCode(input, options) {
|
|
|
350
364
|
redeemedAt: (options.now ? options.now() : new Date()).toISOString(),
|
|
351
365
|
});
|
|
352
366
|
return {
|
|
353
|
-
|
|
367
|
+
...issued,
|
|
354
368
|
...(record.scope ? { scope: record.scope } : {}),
|
|
355
369
|
};
|
|
356
370
|
}
|
|
371
|
+
/**
|
|
372
|
+
* RFC 6749 §6 refresh grant with RFC 9700 §4.14.2 rotation: every exchange
|
|
373
|
+
* mints a new pair and retires the presented refresh token, so the MCP client
|
|
374
|
+
* renews silently instead of re-consenting once an hour.
|
|
375
|
+
*/
|
|
376
|
+
export async function refreshMcpOAuthToken(input, options) {
|
|
377
|
+
const presentedHash = await hashMcpRefreshToken(input.refreshToken);
|
|
378
|
+
const connection = await options.connectionStore.getByRefreshTokenHash(presentedHash);
|
|
379
|
+
if (!connection) {
|
|
380
|
+
throw new McpOAuthAuthorizationError("invalid_grant", "Unknown MCP refresh token");
|
|
381
|
+
}
|
|
382
|
+
// Reuse detection. A rotated-out token still matching means two holders have
|
|
383
|
+
// the family — the legitimate client and a thief — and we cannot tell which
|
|
384
|
+
// one is calling, so the whole family dies. The access token keeps its own
|
|
385
|
+
// expiry: cutting it short would only punish the client that behaved.
|
|
386
|
+
if (connection.refreshTokenHash !== presentedHash) {
|
|
387
|
+
await options.connectionStore.update(connection.id, CLEARED_REFRESH_FAMILY);
|
|
388
|
+
throw new McpOAuthAuthorizationError("invalid_grant", "MCP refresh token was already rotated; the refresh family is revoked");
|
|
389
|
+
}
|
|
390
|
+
if (connection.status !== "approved") {
|
|
391
|
+
throw new McpOAuthAuthorizationError("invalid_grant", "MCP connection is not approved");
|
|
392
|
+
}
|
|
393
|
+
if (connection.clientId !== input.clientId) {
|
|
394
|
+
throw new McpOAuthAuthorizationError("invalid_grant", "client_id does not match the issued refresh token");
|
|
395
|
+
}
|
|
396
|
+
if (isMcpRefreshExpired(connection, nowMs(options.now))) {
|
|
397
|
+
throw new McpOAuthAuthorizationError("invalid_grant", "MCP refresh token expired");
|
|
398
|
+
}
|
|
399
|
+
const issued = await issueMcpTokenPair({
|
|
400
|
+
connectionId: connection.id,
|
|
401
|
+
clientId: input.clientId,
|
|
402
|
+
issuedAtMs: nowMs(options.now),
|
|
403
|
+
retiredRefreshHash: presentedHash,
|
|
404
|
+
}, options.connectionStore);
|
|
405
|
+
if (!issued) {
|
|
406
|
+
throw new McpOAuthAuthorizationError("invalid_grant", "MCP connection no longer exists");
|
|
407
|
+
}
|
|
408
|
+
return issued;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Mint one access/refresh pair. The rotation is a single store `update`, so a
|
|
412
|
+
* concurrent refresh either sees the old pair or the new one — never a
|
|
413
|
+
* connection with the old refresh already dead and no new one issued.
|
|
414
|
+
*/
|
|
415
|
+
async function issueMcpTokenPair(input, store) {
|
|
416
|
+
const accessToken = randomToken();
|
|
417
|
+
const refreshToken = randomToken();
|
|
418
|
+
const updated = await store.update(input.connectionId, {
|
|
419
|
+
clientId: input.clientId,
|
|
420
|
+
tokenHash: await hashConnectionToken(accessToken),
|
|
421
|
+
tokenExpiresAt: mcpTokenExpiry(input.issuedAtMs),
|
|
422
|
+
refreshTokenHash: await hashMcpRefreshToken(refreshToken),
|
|
423
|
+
previousRefreshTokenHash: input.retiredRefreshHash,
|
|
424
|
+
refreshExpiresAt: mcpRefreshExpiry(input.issuedAtMs),
|
|
425
|
+
});
|
|
426
|
+
if (!updated)
|
|
427
|
+
return null;
|
|
428
|
+
return {
|
|
429
|
+
accessToken,
|
|
430
|
+
refreshToken,
|
|
431
|
+
expiresIn: Math.floor(MCP_TOKEN_TTL_MS / 1000),
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
/** Domain-separated so a refresh token can never resolve as a bearer. */
|
|
435
|
+
async function hashMcpRefreshToken(token) {
|
|
436
|
+
return hashConnectionToken(`mcp-oauth-refresh:${token}`);
|
|
437
|
+
}
|
|
357
438
|
async function hashMcpOAuthAuthorizationCode(code) {
|
|
358
439
|
return hashConnectionToken(`mcp-oauth-code:${code}`);
|
|
359
440
|
}
|