veryfront 0.1.241 → 0.1.243
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/esm/cli/templates/manifest.js +77 -77
- package/esm/deno.js +1 -1
- package/esm/src/agent/conversation-root-run-context.d.ts.map +1 -1
- package/esm/src/agent/conversation-root-run-context.js +2 -0
- package/esm/src/agent/conversation-run-context.d.ts +2 -0
- package/esm/src/agent/conversation-run-context.d.ts.map +1 -1
- package/esm/src/agent/durable.d.ts +23 -0
- package/esm/src/agent/durable.d.ts.map +1 -1
- package/esm/src/agent/durable.js +39 -0
- package/esm/src/agent/index.d.ts +1 -1
- package/esm/src/agent/index.d.ts.map +1 -1
- package/esm/src/agent/index.js +1 -1
- package/esm/src/oauth/handlers/callback-handler.d.ts +2 -2
- package/esm/src/oauth/handlers/callback-handler.d.ts.map +1 -1
- package/esm/src/oauth/handlers/callback-handler.js +17 -5
- package/esm/src/oauth/handlers/init-handler.d.ts +24 -4
- package/esm/src/oauth/handlers/init-handler.d.ts.map +1 -1
- package/esm/src/oauth/handlers/init-handler.js +47 -10
- package/esm/src/oauth/providers/base.d.ts +9 -2
- package/esm/src/oauth/providers/base.d.ts.map +1 -1
- package/esm/src/oauth/providers/base.js +12 -5
- package/esm/src/oauth/token-store/index.d.ts +1 -1
- package/esm/src/oauth/token-store/index.d.ts.map +1 -1
- package/esm/src/oauth/token-store/memory.d.ts +21 -9
- package/esm/src/oauth/token-store/memory.d.ts.map +1 -1
- package/esm/src/oauth/token-store/memory.js +42 -28
- package/esm/src/oauth/types.d.ts +33 -7
- package/esm/src/oauth/types.d.ts.map +1 -1
- package/esm/src/platform/compat/framework-source-resolver.d.ts.map +1 -1
- package/esm/src/platform/compat/framework-source-resolver.js +34 -0
- package/esm/src/routing/api/module-loader/loader.d.ts +11 -0
- package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/loader.js +18 -2
- package/esm/src/server/handlers/dev/dashboard/api.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/dashboard/api.js +34 -13
- package/esm/src/server/handlers/dev/files/esbuild-plugins.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/files/esbuild-plugins.js +45 -4
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
- package/src/cli/templates/manifest.js +77 -77
- package/src/deno.js +1 -1
- package/src/src/agent/conversation-root-run-context.ts +2 -0
- package/src/src/agent/durable.ts +60 -0
- package/src/src/agent/index.ts +3 -0
- package/src/src/oauth/handlers/callback-handler.ts +25 -8
- package/src/src/oauth/handlers/init-handler.ts +83 -15
- package/src/src/oauth/providers/base.ts +12 -5
- package/src/src/oauth/token-store/index.ts +1 -1
- package/src/src/oauth/token-store/memory.ts +48 -35
- package/src/src/oauth/types.ts +34 -7
- package/src/src/platform/compat/framework-source-resolver.ts +32 -0
- package/src/src/routing/api/module-loader/loader.ts +18 -2
- package/src/src/server/handlers/dev/dashboard/api.ts +32 -10
- package/src/src/server/handlers/dev/files/esbuild-plugins.ts +54 -5
- package/src/src/utils/version-constant.ts +1 -1
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-root-run-context.d.ts","sourceRoot":"","sources":["../../../src/src/agent/conversation-root-run-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,yBAAyB,EAA8B,MAAM,cAAc,CAAC;AAE1F,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtE;
|
|
1
|
+
{"version":3,"file":"conversation-root-run-context.d.ts","sourceRoot":"","sources":["../../../src/src/agent/conversation-root-run-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,yBAAyB,EAA8B,MAAM,cAAc,CAAC;AAE1F,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtE;AAwBD,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,GAAG,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CACnF,GAAG,0BAA0B,CAO7B;AAED,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,6BAA6B,CAAC;CAC7C,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAwB5C;AAED,wBAAgB,qCAAqC,CAAC,KAAK,EAAE;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,6BAA6B,CAAC;CAC7C,GAAG,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC;IAAE,GAAG,EAAE,yBAAyB,GAAG,IAAI,CAAA;CAAE,CAAC,CAY9F;AAED,wBAAsB,iCAAiC,CAAC,KAAK,EAAE;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,6BAA6B,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CACnF,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAiBtC"}
|
|
@@ -6,6 +6,8 @@ function normalizeProvidedRun(input) {
|
|
|
6
6
|
messageId: input.providedRun.messageId,
|
|
7
7
|
latestEventId: input.providedRun.latestEventId ?? 0,
|
|
8
8
|
latestExternalEventSequence: input.providedRun.latestExternalEventSequence ?? 0,
|
|
9
|
+
waitingToolCallId: null,
|
|
10
|
+
waitingToolName: null,
|
|
9
11
|
status: "running",
|
|
10
12
|
};
|
|
11
13
|
}
|
|
@@ -17,6 +17,8 @@ export declare function createConversationRunContext(input: {
|
|
|
17
17
|
messageId: string;
|
|
18
18
|
latestEventId: number;
|
|
19
19
|
latestExternalEventSequence: number;
|
|
20
|
+
waitingToolCallId: string | null;
|
|
21
|
+
waitingToolName: string | null;
|
|
20
22
|
status: "failed" | "pending" | "completed" | "running" | "cancelled" | "waiting_for_tool";
|
|
21
23
|
} | null;
|
|
22
24
|
effectiveParentRunId: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-run-context.d.ts","sourceRoot":"","sources":["../../../src/src/agent/conversation-run-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,GAAG,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CACpF
|
|
1
|
+
{"version":3,"file":"conversation-run-context.d.ts","sourceRoot":"","sources":["../../../src/src/agent/conversation-run-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,GAAG,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CACpF;;;;;;;;;;;;;sCADoC,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;EAQtE"}
|
|
@@ -35,6 +35,10 @@ export declare const ConversationRunProjectionSchema: z.ZodPipe<z.ZodObject<{
|
|
|
35
35
|
latest_event_id: z.ZodOptional<z.ZodNumber>;
|
|
36
36
|
latestExternalEventSequence: z.ZodOptional<z.ZodNumber>;
|
|
37
37
|
latest_external_event_sequence: z.ZodOptional<z.ZodNumber>;
|
|
38
|
+
waitingToolCallId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
39
|
+
waiting_tool_call_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
40
|
+
waitingToolName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
41
|
+
waiting_tool_name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
38
42
|
status: z.ZodEnum<{
|
|
39
43
|
failed: "failed";
|
|
40
44
|
pending: "pending";
|
|
@@ -49,6 +53,8 @@ export declare const ConversationRunProjectionSchema: z.ZodPipe<z.ZodObject<{
|
|
|
49
53
|
messageId: string;
|
|
50
54
|
latestEventId: number;
|
|
51
55
|
latestExternalEventSequence: number;
|
|
56
|
+
waitingToolCallId: string | null;
|
|
57
|
+
waitingToolName: string | null;
|
|
52
58
|
status: "failed" | "pending" | "completed" | "running" | "cancelled" | "waiting_for_tool";
|
|
53
59
|
}, {
|
|
54
60
|
[x: string]: unknown;
|
|
@@ -63,10 +69,15 @@ export declare const ConversationRunProjectionSchema: z.ZodPipe<z.ZodObject<{
|
|
|
63
69
|
latest_event_id?: number | undefined;
|
|
64
70
|
latestExternalEventSequence?: number | undefined;
|
|
65
71
|
latest_external_event_sequence?: number | undefined;
|
|
72
|
+
waitingToolCallId?: string | null | undefined;
|
|
73
|
+
waiting_tool_call_id?: string | null | undefined;
|
|
74
|
+
waitingToolName?: string | null | undefined;
|
|
75
|
+
waiting_tool_name?: string | null | undefined;
|
|
66
76
|
}>>;
|
|
67
77
|
export type ConversationRunProjection = z.infer<typeof ConversationRunProjectionSchema>;
|
|
68
78
|
export type ActiveConversationRunStatus = Extract<ConversationRunProjection["status"], "pending" | "running" | "waiting_for_tool">;
|
|
69
79
|
export type TerminalConversationRunStatus = Extract<ConversationRunProjection["status"], "completed" | "failed" | "cancelled">;
|
|
80
|
+
export type ConversationRunAppendCursorResyncResult = "advanced" | "non_appendable" | "unchanged";
|
|
70
81
|
export declare const CreateConversationRunAcceptedSchema: z.ZodPipe<z.ZodObject<{
|
|
71
82
|
run: z.ZodObject<{
|
|
72
83
|
runId: z.ZodOptional<z.ZodString>;
|
|
@@ -188,6 +199,18 @@ export declare function parseAppendConversationRunEventsErrorBody(bodyText: stri
|
|
|
188
199
|
export declare function isIgnorableConversationRunAppendError(error: unknown): error is AppendConversationRunEventsError;
|
|
189
200
|
export declare function isCursorMismatchConversationRunAppendError(error: unknown): error is AppendConversationRunEventsError;
|
|
190
201
|
export declare function isActiveConversationRunStatus(status: ConversationRunProjection["status"]): status is ActiveConversationRunStatus;
|
|
202
|
+
export declare function isAppendableConversationRunProjection(run: ConversationRunProjection): boolean;
|
|
203
|
+
export declare function resyncConversationRunAppendCursor(input: {
|
|
204
|
+
authToken: string;
|
|
205
|
+
apiUrl: string;
|
|
206
|
+
conversationId: string;
|
|
207
|
+
runId: string;
|
|
208
|
+
previousLatestExternalEventSequence: number;
|
|
209
|
+
abortSignal?: AbortSignal;
|
|
210
|
+
}): Promise<{
|
|
211
|
+
result: ConversationRunAppendCursorResyncResult;
|
|
212
|
+
run: ConversationRunProjection;
|
|
213
|
+
}>;
|
|
191
214
|
export declare function getConversationRun(input: {
|
|
192
215
|
authToken: string;
|
|
193
216
|
apiUrl: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable.d.ts","sourceRoot":"","sources":["../../../src/src/agent/durable.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAEjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgCxB,eAAO,MAAM,4BAA4B;;;;;;;;;;iBAIvC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,sBAAsB,CAoBzB;AAED,eAAO,MAAM,2BAA2B;;;;;;;EAOtC,CAAC;AAEH,eAAO,MAAM,+BAA+B
|
|
1
|
+
{"version":3,"file":"durable.d.ts","sourceRoot":"","sources":["../../../src/src/agent/durable.ts"],"names":[],"mappings":"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"}
|
package/esm/src/agent/durable.js
CHANGED
|
@@ -71,6 +71,10 @@ export const ConversationRunProjectionSchema = z
|
|
|
71
71
|
latest_event_id: z.number().int().nonnegative().optional(),
|
|
72
72
|
latestExternalEventSequence: z.number().int().nonnegative().optional(),
|
|
73
73
|
latest_external_event_sequence: z.number().int().nonnegative().optional(),
|
|
74
|
+
waitingToolCallId: z.string().min(1).nullable().optional(),
|
|
75
|
+
waiting_tool_call_id: z.string().min(1).nullable().optional(),
|
|
76
|
+
waitingToolName: z.string().nullable().optional(),
|
|
77
|
+
waiting_tool_name: z.string().nullable().optional(),
|
|
74
78
|
status: ConversationRunStatusSchema,
|
|
75
79
|
})
|
|
76
80
|
.passthrough()
|
|
@@ -93,6 +97,8 @@ export const ConversationRunProjectionSchema = z
|
|
|
93
97
|
messageId,
|
|
94
98
|
latestEventId,
|
|
95
99
|
latestExternalEventSequence,
|
|
100
|
+
waitingToolCallId: data.waitingToolCallId ?? data.waiting_tool_call_id ?? null,
|
|
101
|
+
waitingToolName: data.waitingToolName ?? data.waiting_tool_name ?? null,
|
|
96
102
|
status: data.status,
|
|
97
103
|
};
|
|
98
104
|
});
|
|
@@ -227,6 +233,39 @@ export function isCursorMismatchConversationRunAppendError(error) {
|
|
|
227
233
|
export function isActiveConversationRunStatus(status) {
|
|
228
234
|
return status === "pending" || status === "running" || status === "waiting_for_tool";
|
|
229
235
|
}
|
|
236
|
+
export function isAppendableConversationRunProjection(run) {
|
|
237
|
+
return (run.status !== "completed" &&
|
|
238
|
+
run.status !== "failed" &&
|
|
239
|
+
run.status !== "cancelled" &&
|
|
240
|
+
run.status !== "waiting_for_tool" &&
|
|
241
|
+
run.waitingToolCallId === null &&
|
|
242
|
+
run.waitingToolName === null);
|
|
243
|
+
}
|
|
244
|
+
export async function resyncConversationRunAppendCursor(input) {
|
|
245
|
+
const run = await getConversationRun({
|
|
246
|
+
authToken: input.authToken,
|
|
247
|
+
apiUrl: input.apiUrl,
|
|
248
|
+
conversationId: input.conversationId,
|
|
249
|
+
runId: input.runId,
|
|
250
|
+
abortSignal: input.abortSignal,
|
|
251
|
+
});
|
|
252
|
+
if (run.latestExternalEventSequence > input.previousLatestExternalEventSequence) {
|
|
253
|
+
return {
|
|
254
|
+
result: "advanced",
|
|
255
|
+
run,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
if (!isAppendableConversationRunProjection(run)) {
|
|
259
|
+
return {
|
|
260
|
+
result: "non_appendable",
|
|
261
|
+
run,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
result: "unchanged",
|
|
266
|
+
run,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
230
269
|
async function waitForConversationRunPoll(ms, abortSignal) {
|
|
231
270
|
if (ms <= 0 || abortSignal?.aborted) {
|
|
232
271
|
return;
|
package/esm/src/agent/index.d.ts
CHANGED
|
@@ -93,7 +93,7 @@ export { type ConversationRunContext, createConversationRunContext, } from "./co
|
|
|
93
93
|
export { type ConversationRootRunContext, type ConversationRootRunDescriptor, createConversationRootRunContext, createConversationRootRunStartAdapter, prepareConversationRootRunContext, startConversationRootRun, } from "./conversation-root-run-context.js";
|
|
94
94
|
export { bootstrapConversationAgentRun, type BootstrapConversationAgentRunResult, type ConversationMessageRecord, ConversationMessageRecordSchema, type ConversationRecord, ConversationRecordSchema, createConversationMessage, createConversationRecord, ensureConversationProjectLink, fetchConversationRecord, } from "./conversation-bootstrap.js";
|
|
95
95
|
export { type ConversationChildLifecycleContext, type ConversationHostedLifecycleFinalizeInput, createConversationChildLifecycleAdapter, createConversationHostedLifecycleAdapter, type CreateConversationHostedLifecycleAdapterOptions, } from "./conversation-hosted-lifecycle.js";
|
|
96
|
-
export { type ActiveConversationRunStatus, appendConversationRunEvents, AppendConversationRunEventsError, type AppendConversationRunEventsResponse, AppendConversationRunEventsResponseSchema, CompleteConversationRunResponseSchema, type ConversationAgentRunUsage, type ConversationRunProjection, ConversationRunProjectionSchema, ConversationRunStatusSchema, type ConversationRunTargets, ConversationRunTargetsSchema, ConversationRunTerminalStateError, createConversationAgentRun, finalizeConversationAgentRun, getConversationRun, isActiveConversationRunStatus, isCursorMismatchConversationRunAppendError, isIgnorableConversationRunAppendError, monitorConversationRunStatus, parseAppendConversationRunEventsErrorBody, resolveConversationRunTargets, type TerminalConversationRunStatus, } from "./durable.js";
|
|
96
|
+
export { type ActiveConversationRunStatus, appendConversationRunEvents, AppendConversationRunEventsError, type AppendConversationRunEventsResponse, AppendConversationRunEventsResponseSchema, CompleteConversationRunResponseSchema, type ConversationAgentRunUsage, type ConversationRunAppendCursorResyncResult, type ConversationRunProjection, ConversationRunProjectionSchema, ConversationRunStatusSchema, type ConversationRunTargets, ConversationRunTargetsSchema, ConversationRunTerminalStateError, createConversationAgentRun, finalizeConversationAgentRun, getConversationRun, isActiveConversationRunStatus, isAppendableConversationRunProjection, isCursorMismatchConversationRunAppendError, isIgnorableConversationRunAppendError, monitorConversationRunStatus, parseAppendConversationRunEventsErrorBody, resolveConversationRunTargets, resyncConversationRunAppendCursor, type TerminalConversationRunStatus, } from "./durable.js";
|
|
97
97
|
export { buildInvokeAgentChildRunLifecycleCustomEvent, buildInvokeAgentChildRunProgressEvents, buildInvokeAgentChildRunStateDelta, type InvokeAgentChildRunLifecycleCustomEvent, InvokeAgentChildRunLifecycleCustomEventSchema, type InvokeAgentChildRunLifecycleValue, InvokeAgentChildRunLifecycleValueSchema, type InvokeAgentChildRunProgressEvent, type InvokeAgentChildRunProgressInput, type InvokeAgentChildRunStateDelta, InvokeAgentChildRunStateDeltaSchema, publishInvokeAgentChildRunProgress, } from "./invoke-agent-child-runs.js";
|
|
98
98
|
export { type HostedChildLifecycleAdapter, type HostedChildLifecycleRunnerOptions, type HostedChildLifecycleRunResult, type HostedChildLifecycleTerminalState, runHostedChildLifecycle, } from "./hosted-child-lifecycle.js";
|
|
99
99
|
export { type HostedLifecycleAdapter, type HostedLifecycleExecution, type HostedLifecycleRunnerOptions, type HostedLifecycleRunResult, type HostedLifecycleTerminalState, runHostedLifecycle, } from "./hosted-lifecycle.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/agent/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/agent/index.ts"],"names":[],"mappings":"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"}
|
package/esm/src/agent/index.js
CHANGED
|
@@ -92,7 +92,7 @@ export { createConversationRunContext, } from "./conversation-run-context.js";
|
|
|
92
92
|
export { createConversationRootRunContext, createConversationRootRunStartAdapter, prepareConversationRootRunContext, startConversationRootRun, } from "./conversation-root-run-context.js";
|
|
93
93
|
export { bootstrapConversationAgentRun, ConversationMessageRecordSchema, ConversationRecordSchema, createConversationMessage, createConversationRecord, ensureConversationProjectLink, fetchConversationRecord, } from "./conversation-bootstrap.js";
|
|
94
94
|
export { createConversationChildLifecycleAdapter, createConversationHostedLifecycleAdapter, } from "./conversation-hosted-lifecycle.js";
|
|
95
|
-
export { appendConversationRunEvents, AppendConversationRunEventsError, AppendConversationRunEventsResponseSchema, CompleteConversationRunResponseSchema, ConversationRunProjectionSchema, ConversationRunStatusSchema, ConversationRunTargetsSchema, ConversationRunTerminalStateError, createConversationAgentRun, finalizeConversationAgentRun, getConversationRun, isActiveConversationRunStatus, isCursorMismatchConversationRunAppendError, isIgnorableConversationRunAppendError, monitorConversationRunStatus, parseAppendConversationRunEventsErrorBody, resolveConversationRunTargets, } from "./durable.js";
|
|
95
|
+
export { appendConversationRunEvents, AppendConversationRunEventsError, AppendConversationRunEventsResponseSchema, CompleteConversationRunResponseSchema, ConversationRunProjectionSchema, ConversationRunStatusSchema, ConversationRunTargetsSchema, ConversationRunTerminalStateError, createConversationAgentRun, finalizeConversationAgentRun, getConversationRun, isActiveConversationRunStatus, isAppendableConversationRunProjection, isCursorMismatchConversationRunAppendError, isIgnorableConversationRunAppendError, monitorConversationRunStatus, parseAppendConversationRunEventsErrorBody, resolveConversationRunTargets, resyncConversationRunAppendCursor, } from "./durable.js";
|
|
96
96
|
export { buildInvokeAgentChildRunLifecycleCustomEvent, buildInvokeAgentChildRunProgressEvents, buildInvokeAgentChildRunStateDelta, InvokeAgentChildRunLifecycleCustomEventSchema, InvokeAgentChildRunLifecycleValueSchema, InvokeAgentChildRunStateDeltaSchema, publishInvokeAgentChildRunProgress, } from "./invoke-agent-child-runs.js";
|
|
97
97
|
export { runHostedChildLifecycle, } from "./hosted-child-lifecycle.js";
|
|
98
98
|
export { runHostedLifecycle, } from "./hosted-lifecycle.js";
|
|
@@ -10,8 +10,8 @@ export interface OAuthCallbackHandlerOptions {
|
|
|
10
10
|
successRedirect?: string;
|
|
11
11
|
/** Error redirect path */
|
|
12
12
|
errorRedirect?: string;
|
|
13
|
-
/** Custom success callback */
|
|
14
|
-
onSuccess?: (serviceId: string, tokens: unknown) => void | Promise<void>;
|
|
13
|
+
/** Custom success callback (called with the user id the tokens were stored under) */
|
|
14
|
+
onSuccess?: (serviceId: string, tokens: unknown, userId: string) => void | Promise<void>;
|
|
15
15
|
/** Custom error callback */
|
|
16
16
|
onError?: (serviceId: string, error: string) => void | Promise<void>;
|
|
17
17
|
/** Skip state validation for providers that don't return state */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/handlers/callback-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"callback-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/handlers/callback-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,kBAAkB,EAAoB,UAAU,EAAE,MAAM,aAAa,CAAC;AAIpF,MAAM,WAAW,2BAA2B;IAC1C,oDAAoD;IACpD,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,4BAA4B;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,qFAAqF;IACrF,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzF,4BAA4B;IAC5B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,gFAAgF;IAChF,GAAG,CAAC,EAAE,iBAAiB,CAAC;IAExB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,2BAAgC,GACxC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAmIzC"}
|
|
@@ -47,12 +47,20 @@ export function createOAuthCallbackHandler(config, options = {}) {
|
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
if (state) {
|
|
50
|
-
|
|
50
|
+
// Atomic read+delete. Unknown/expired/forged state all return null.
|
|
51
|
+
storedState = await tokenStore.consumeState(state);
|
|
51
52
|
if (!skipStateValidation && !storedState) {
|
|
52
53
|
return handleError(appUrl, "invalid_state", "Invalid or expired state", {
|
|
53
54
|
serviceId: config.serviceId,
|
|
54
55
|
});
|
|
55
56
|
}
|
|
57
|
+
// A state record from a different service must never authorize this one.
|
|
58
|
+
if (storedState && storedState.serviceId !== config.serviceId) {
|
|
59
|
+
return handleError(appUrl, "invalid_state", "State serviceId mismatch", {
|
|
60
|
+
serviceId: config.serviceId,
|
|
61
|
+
stateServiceId: storedState.serviceId,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
56
64
|
}
|
|
57
65
|
const service = new OAuthService(config, tokenStore, envReader);
|
|
58
66
|
const redirectUri = `${appUrl}/api/auth/${config.serviceId}/callback`;
|
|
@@ -65,10 +73,14 @@ export function createOAuthCallbackHandler(config, options = {}) {
|
|
|
65
73
|
if (!result.success || !result.tokens) {
|
|
66
74
|
return handleError(appUrl, result.error ?? "token_exchange_failed", `Token exchange failed for ${config.serviceId}:`, result.error);
|
|
67
75
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
76
|
+
// Without state (skipStateValidation) we have no userId — refuse to
|
|
77
|
+
// store tokens under a shared slot. Callers who need this path must
|
|
78
|
+
// provide a store that handles it themselves (e.g. cookie-scoped).
|
|
79
|
+
if (!storedState) {
|
|
80
|
+
return handleError(appUrl, "invalid_state", `Cannot store tokens for ${config.serviceId}: no state (and thus no userId) available`);
|
|
81
|
+
}
|
|
82
|
+
await tokenStore.setTokens(config.serviceId, storedState.userId, result.tokens);
|
|
83
|
+
await onSuccess?.(config.serviceId, result.tokens, storedState.userId);
|
|
72
84
|
const successUrl = new URL(successRedirect, appUrl);
|
|
73
85
|
successUrl.searchParams.set("connected", config.serviceId);
|
|
74
86
|
return Response.redirect(successUrl.toString());
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type EnvironmentConfig } from "../../config/environment-config.js";
|
|
2
2
|
import { type EnvReader } from "../providers/base.js";
|
|
3
3
|
import type { AuthorizationUrlOptions, OAuthServiceConfig, TokenStore } from "../types.js";
|
|
4
|
+
/** Signature for resolving the authenticated user's id from a request. */
|
|
5
|
+
export type GetUserIdFn = (req: Request) => string | null | Promise<string | null>;
|
|
4
6
|
export interface OAuthInitHandlerOptions {
|
|
5
7
|
/** Token store to use (defaults to memory store) */
|
|
6
8
|
tokenStore?: TokenStore;
|
|
@@ -12,8 +14,21 @@ export interface OAuthInitHandlerOptions {
|
|
|
12
14
|
env?: EnvironmentConfig;
|
|
13
15
|
/** EnvReader for dynamic env vars (defaults to getEnv) */
|
|
14
16
|
envReader?: EnvReader;
|
|
17
|
+
/**
|
|
18
|
+
* Optional authentication check. If supplied and returns false the request
|
|
19
|
+
* is rejected with 401. Independent from `getUserId` which always runs.
|
|
20
|
+
*/
|
|
21
|
+
isAuthenticated?: (req: Request) => boolean | Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* REQUIRED. Resolve the authenticated user's id. The returned id is
|
|
24
|
+
* persisted with the OAuth `state` so the callback stores tokens in that
|
|
25
|
+
* user's slot. Return `null` (or an empty string) to reject unauthenticated
|
|
26
|
+
* requests with 401. NEVER return a shared constant like "anonymous" —
|
|
27
|
+
* that re-introduces VULN-AUTH-2.
|
|
28
|
+
*/
|
|
29
|
+
getUserId: GetUserIdFn;
|
|
15
30
|
}
|
|
16
|
-
export declare function createOAuthInitHandler(config: OAuthServiceConfig, options
|
|
31
|
+
export declare function createOAuthInitHandler(config: OAuthServiceConfig, options: OAuthInitHandlerOptions): (req: Request) => Promise<Response>;
|
|
17
32
|
export interface OAuthStatusHandlerOptions {
|
|
18
33
|
/** Token store to use (defaults to memory store) */
|
|
19
34
|
tokenStore?: TokenStore;
|
|
@@ -21,11 +36,16 @@ export interface OAuthStatusHandlerOptions {
|
|
|
21
36
|
envReader?: EnvReader;
|
|
22
37
|
/** Optional authentication check — return true if the request is authenticated */
|
|
23
38
|
isAuthenticated?: (req: Request) => boolean | Promise<boolean>;
|
|
39
|
+
/** REQUIRED. Resolve the authenticated user's id (see OAuthInitHandlerOptions). */
|
|
40
|
+
getUserId: GetUserIdFn;
|
|
24
41
|
}
|
|
25
|
-
export declare function createOAuthStatusHandler(config: OAuthServiceConfig, options
|
|
26
|
-
export
|
|
42
|
+
export declare function createOAuthStatusHandler(config: OAuthServiceConfig, options: OAuthStatusHandlerOptions): (req: Request) => Promise<Response>;
|
|
43
|
+
export interface OAuthDisconnectHandlerOptions {
|
|
27
44
|
tokenStore?: TokenStore;
|
|
28
45
|
/** Optional authentication check — return true if the request is authenticated */
|
|
29
46
|
isAuthenticated?: (req: Request) => boolean | Promise<boolean>;
|
|
30
|
-
|
|
47
|
+
/** REQUIRED. Resolve the authenticated user's id (see OAuthInitHandlerOptions). */
|
|
48
|
+
getUserId: GetUserIdFn;
|
|
49
|
+
}
|
|
50
|
+
export declare function createOAuthDisconnectHandler(config: OAuthServiceConfig, options: OAuthDisconnectHandlerOptions): (req: Request) => Promise<Response>;
|
|
31
51
|
//# sourceMappingURL=init-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/handlers/init-handler.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"init-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/handlers/init-handler.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA2D3F,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAEnF,MAAM,WAAW,uBAAuB;IACtC,oDAAoD;IACpD,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,uCAAuC;IACvC,WAAW,CAAC,EAAE,uBAAuB,CAAC;IAEtC,gFAAgF;IAChF,GAAG,CAAC,EAAE,iBAAiB,CAAC;IAExB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/D;;;;;;OAMG;IACH,SAAS,EAAE,WAAW,CAAC;CACxB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,uBAAuB,GAC/B,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA6CrC;AAED,MAAM,WAAW,yBAAyB;IACxC,oDAAoD;IACpD,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,kFAAkF;IAClF,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/D,mFAAmF;IACnF,SAAS,EAAE,WAAW,CAAC;CACxB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,yBAAyB,GACjC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA+BrC;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kFAAkF;IAClF,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,mFAAmF;IACnF,SAAS,EAAE,WAAW,CAAC;CACxB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,6BAA6B,GACrC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAmBrC"}
|
|
@@ -11,6 +11,22 @@ function createUnauthorizedResponse() {
|
|
|
11
11
|
async function isRequestUnauthorized(req, isAuthenticated) {
|
|
12
12
|
return isAuthenticated ? !(await isAuthenticated(req)) : false;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the userId for a request, returning null when anonymous.
|
|
16
|
+
*
|
|
17
|
+
* `getUserId` is required at compile time (see handler option types). We
|
|
18
|
+
* still tolerate `undefined` at runtime (e.g. a JS caller) and treat it as
|
|
19
|
+
* unauthenticated — NEVER fall back to "anonymous": that preserves
|
|
20
|
+
* VULN-AUTH-2 where unrelated users share a single token slot.
|
|
21
|
+
*/
|
|
22
|
+
async function resolveUserId(req, getUserId) {
|
|
23
|
+
if (!getUserId)
|
|
24
|
+
return null;
|
|
25
|
+
const result = await getUserId(req);
|
|
26
|
+
if (!result)
|
|
27
|
+
return null; // null, undefined, or empty string all fail.
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
14
30
|
function resolveAppUrl(baseUrl, env) {
|
|
15
31
|
return baseUrl ?? env.appUrl ?? DEFAULT_APP_URL;
|
|
16
32
|
}
|
|
@@ -26,9 +42,15 @@ function createInitErrorResponse(error) {
|
|
|
26
42
|
details: error instanceof Error ? error.message : "Unknown error",
|
|
27
43
|
}, { status: 500 });
|
|
28
44
|
}
|
|
29
|
-
export function createOAuthInitHandler(config, options
|
|
30
|
-
const { tokenStore = memoryTokenStore, baseUrl, authOptions = {}, env = getEnvironmentConfig(), envReader = getEnv, } = options;
|
|
31
|
-
return async function handler() {
|
|
45
|
+
export function createOAuthInitHandler(config, options) {
|
|
46
|
+
const { tokenStore = memoryTokenStore, baseUrl, authOptions = {}, env = getEnvironmentConfig(), envReader = getEnv, isAuthenticated, getUserId, } = options ?? {};
|
|
47
|
+
return async function handler(req) {
|
|
48
|
+
if (await isRequestUnauthorized(req, isAuthenticated)) {
|
|
49
|
+
return createUnauthorizedResponse();
|
|
50
|
+
}
|
|
51
|
+
const userId = await resolveUserId(req, getUserId);
|
|
52
|
+
if (!userId)
|
|
53
|
+
return createUnauthorizedResponse();
|
|
32
54
|
const service = new OAuthService(config, tokenStore, envReader);
|
|
33
55
|
if (!service.isConfigured()) {
|
|
34
56
|
return createNotConfiguredResponse(config);
|
|
@@ -37,7 +59,15 @@ export function createOAuthInitHandler(config, options = {}) {
|
|
|
37
59
|
const redirectUri = `${appUrl}/api/auth/${config.serviceId}/callback`;
|
|
38
60
|
try {
|
|
39
61
|
const { url, state } = await service.createAuthorizationUrl({ ...authOptions, redirectUri });
|
|
40
|
-
await tokenStore.setState(state
|
|
62
|
+
await tokenStore.setState(state.state, {
|
|
63
|
+
userId,
|
|
64
|
+
serviceId: config.serviceId,
|
|
65
|
+
codeVerifier: state.codeVerifier,
|
|
66
|
+
redirectUri: state.redirectUri,
|
|
67
|
+
scopes: state.scopes,
|
|
68
|
+
createdAt: state.createdAt,
|
|
69
|
+
metadata: state.metadata,
|
|
70
|
+
});
|
|
41
71
|
return Response.redirect(url);
|
|
42
72
|
}
|
|
43
73
|
catch (error) {
|
|
@@ -46,13 +76,16 @@ export function createOAuthInitHandler(config, options = {}) {
|
|
|
46
76
|
}
|
|
47
77
|
};
|
|
48
78
|
}
|
|
49
|
-
export function createOAuthStatusHandler(config, options
|
|
50
|
-
const { tokenStore = memoryTokenStore, envReader = getEnv, isAuthenticated, } = options;
|
|
79
|
+
export function createOAuthStatusHandler(config, options) {
|
|
80
|
+
const { tokenStore = memoryTokenStore, envReader = getEnv, isAuthenticated, getUserId, } = options ?? {};
|
|
51
81
|
return async function handler(req) {
|
|
52
82
|
if (await isRequestUnauthorized(req, isAuthenticated)) {
|
|
53
83
|
return createUnauthorizedResponse();
|
|
54
84
|
}
|
|
55
|
-
const
|
|
85
|
+
const userId = await resolveUserId(req, getUserId);
|
|
86
|
+
if (!userId)
|
|
87
|
+
return createUnauthorizedResponse();
|
|
88
|
+
const tokens = await tokenStore.getTokens(config.serviceId, userId);
|
|
56
89
|
const isConnected = !!tokens?.accessToken;
|
|
57
90
|
const isExpired = tokens?.expiresAt ? Date.now() > tokens.expiresAt : false;
|
|
58
91
|
const hasRefreshToken = !!tokens?.refreshToken;
|
|
@@ -66,13 +99,17 @@ export function createOAuthStatusHandler(config, options = {}) {
|
|
|
66
99
|
});
|
|
67
100
|
};
|
|
68
101
|
}
|
|
69
|
-
export function createOAuthDisconnectHandler(config, options
|
|
70
|
-
const { tokenStore = memoryTokenStore, isAuthenticated } = options
|
|
102
|
+
export function createOAuthDisconnectHandler(config, options) {
|
|
103
|
+
const { tokenStore = memoryTokenStore, isAuthenticated, getUserId } = options ??
|
|
104
|
+
{};
|
|
71
105
|
return async function handler(req) {
|
|
72
106
|
if (await isRequestUnauthorized(req, isAuthenticated)) {
|
|
73
107
|
return createUnauthorizedResponse();
|
|
74
108
|
}
|
|
75
|
-
await
|
|
109
|
+
const userId = await resolveUserId(req, getUserId);
|
|
110
|
+
if (!userId)
|
|
111
|
+
return createUnauthorizedResponse();
|
|
112
|
+
await tokenStore.clearTokens(config.serviceId, userId);
|
|
76
113
|
return Response.json({
|
|
77
114
|
success: true,
|
|
78
115
|
message: `Disconnected from ${config.displayName}`,
|
|
@@ -32,7 +32,14 @@ export declare class OAuthService extends OAuthProvider {
|
|
|
32
32
|
url: string;
|
|
33
33
|
state: OAuthState;
|
|
34
34
|
}>;
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Get a valid access token for the given user, refreshing if needed.
|
|
37
|
+
*
|
|
38
|
+
* `userId` is required — this store is keyed by `(serviceId, userId)` to
|
|
39
|
+
* prevent one user's OAuth completion from overwriting another user's
|
|
40
|
+
* tokens. See VULN-AUTH-2.
|
|
41
|
+
*/
|
|
42
|
+
getAccessToken(userId: string): Promise<string | null>;
|
|
43
|
+
fetch<T>(userId: string, endpoint: string, options?: RequestInit): Promise<T>;
|
|
37
44
|
}
|
|
38
45
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/providers/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EAEV,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACX,MAAM,aAAa,CAAC;AAUrB,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAuB5D,qBAAa,aAAa;IACxB,SAAS,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACtC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC;gBAEnB,MAAM,EAAE,mBAAmB,EAAE,SAAS,GAAE,SAAkB;IAKtE,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,YAAY,IAAI,OAAO;IAIjB,sBAAsB,CAC1B,OAAO,GAAE,uBAAuB,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAO,GACnE,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;IA0C9C,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,kBAAkB;YAyCZ,gBAAgB;IAe9B,OAAO,CAAC,4BAA4B;YAQtB,aAAa;IA+BrB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+BzE,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwBjE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAiBnD;AAED,qBAAa,YAAa,SAAQ,aAAa;IAC7C,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC;IAC5C,SAAS,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;gBAEtB,MAAM,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,SAAS;IAMtF,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEQ,sBAAsB,CAC7B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/providers/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EAEV,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACX,MAAM,aAAa,CAAC;AAUrB,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAuB5D,qBAAa,aAAa;IACxB,SAAS,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACtC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC;gBAEnB,MAAM,EAAE,mBAAmB,EAAE,SAAS,GAAE,SAAkB;IAKtE,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,YAAY,IAAI,OAAO;IAIjB,sBAAsB,CAC1B,OAAO,GAAE,uBAAuB,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAO,GACnE,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;IA0C9C,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,kBAAkB;YAyCZ,gBAAgB;IAe9B,OAAO,CAAC,4BAA4B;YAQtB,aAAa;IA+BrB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+BzE,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwBjE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAiBnD;AAED,qBAAa,YAAa,SAAQ,aAAa;IAC7C,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC;IAC5C,SAAS,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;gBAEtB,MAAM,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,SAAS;IAMtF,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEQ,sBAAsB,CAC7B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;IAO9C;;;;;;OAMG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBtD,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,CAAC,CAAC;CA4BxF"}
|
|
@@ -224,8 +224,15 @@ export class OAuthService extends OAuthProvider {
|
|
|
224
224
|
defaultScopes: this.serviceConfig.defaultScopes,
|
|
225
225
|
});
|
|
226
226
|
}
|
|
227
|
-
|
|
228
|
-
|
|
227
|
+
/**
|
|
228
|
+
* Get a valid access token for the given user, refreshing if needed.
|
|
229
|
+
*
|
|
230
|
+
* `userId` is required — this store is keyed by `(serviceId, userId)` to
|
|
231
|
+
* prevent one user's OAuth completion from overwriting another user's
|
|
232
|
+
* tokens. See VULN-AUTH-2.
|
|
233
|
+
*/
|
|
234
|
+
async getAccessToken(userId) {
|
|
235
|
+
const tokens = await this.tokenStore?.getTokens(this.serviceId, userId);
|
|
229
236
|
if (!tokens)
|
|
230
237
|
return null;
|
|
231
238
|
const isExpired = tokens.expiresAt && Date.now() > tokens.expiresAt - TOKEN_REFRESH_BUFFER_MS;
|
|
@@ -239,11 +246,11 @@ export class OAuthService extends OAuthProvider {
|
|
|
239
246
|
if (!this.tokenStore) {
|
|
240
247
|
throw new Error("TokenStore not configured");
|
|
241
248
|
}
|
|
242
|
-
await this.tokenStore.setTokens(this.serviceId, result.tokens);
|
|
249
|
+
await this.tokenStore.setTokens(this.serviceId, userId, result.tokens);
|
|
243
250
|
return result.tokens.accessToken;
|
|
244
251
|
}
|
|
245
|
-
async fetch(endpoint, options = {}) {
|
|
246
|
-
const token = await this.getAccessToken();
|
|
252
|
+
async fetch(userId, endpoint, options = {}) {
|
|
253
|
+
const token = await this.getAccessToken(userId);
|
|
247
254
|
if (!token) {
|
|
248
255
|
throw TOKEN_STORAGE_ERROR.create({
|
|
249
256
|
detail: `Not authenticated with ${this.serviceConfig.displayName}`,
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
* @module oauth/token-store
|
|
5
5
|
*/
|
|
6
6
|
export { MemoryTokenStore, memoryTokenStore } from "./memory.js";
|
|
7
|
-
export type { OAuthState, OAuthTokens, TokenStore } from "../types.js";
|
|
7
|
+
export type { OAuthState, OAuthTokens, StoredOAuthState, TokenStore } from "../types.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/token-store/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/token-store/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,20 +1,32 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { OAuthTokens, StoredOAuthState, TokenStore } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* In-memory TokenStore keyed by `(serviceId, userId)`.
|
|
4
|
+
*
|
|
5
|
+
* Suitable for development and tests. For production use a persistent store
|
|
6
|
+
* (Redis, Postgres, ...) keyed the same way. Never share a single slot per
|
|
7
|
+
* service across users — see VULN-AUTH-2.
|
|
8
|
+
*/
|
|
2
9
|
export declare class MemoryTokenStore implements TokenStore {
|
|
3
10
|
private tokens;
|
|
4
11
|
private states;
|
|
5
12
|
private projectId;
|
|
6
13
|
constructor(projectId?: string);
|
|
7
14
|
private scopedKey;
|
|
8
|
-
getTokens(serviceId: string): Promise<OAuthTokens | null>;
|
|
9
|
-
setTokens(serviceId: string, tokens: OAuthTokens): Promise<void>;
|
|
10
|
-
clearTokens(serviceId: string): Promise<void>;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
getTokens(serviceId: string, userId: string): Promise<OAuthTokens | null>;
|
|
16
|
+
setTokens(serviceId: string, userId: string, tokens: OAuthTokens): Promise<void>;
|
|
17
|
+
clearTokens(serviceId: string, userId: string): Promise<void>;
|
|
18
|
+
setState(state: string, meta: StoredOAuthState): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Atomically read and delete state (one-shot). Returns null for unknown or
|
|
21
|
+
* expired entries. Expired entries are removed on read.
|
|
22
|
+
*/
|
|
23
|
+
consumeState(state: string): Promise<StoredOAuthState | null>;
|
|
14
24
|
private cleanupExpiredStates;
|
|
25
|
+
/** List connected slots as `${serviceId}:${userId}` strings (test/debug aid). */
|
|
15
26
|
getConnectedServices(): string[];
|
|
16
|
-
|
|
27
|
+
/** Whether a given user has usable tokens for a service. */
|
|
28
|
+
isConnected(serviceId: string, userId: string): boolean;
|
|
17
29
|
clearAll(): void;
|
|
18
30
|
}
|
|
19
|
-
export declare const memoryTokenStore:
|
|
31
|
+
export declare const memoryTokenStore: TokenStore;
|
|
20
32
|
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/token-store/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/src/oauth/token-store/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK7E;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,SAAY;IAIjC,OAAO,CAAC,SAAS;IAIjB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAIzE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhF,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAU7D,OAAO,CAAC,oBAAoB;IAS5B,iFAAiF;IACjF,oBAAoB,IAAI,MAAM,EAAE;IAOhC,4DAA4D;IAC5D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAQvD,QAAQ,IAAI,IAAI;CAIjB;AAED,eAAO,MAAM,gBAAgB,EAAE,UAAmC,CAAC"}
|