harper-kb 0.4.0 → 0.4.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/hooks.d.ts +22 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +10 -0
- package/dist/hooks.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +14 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/oauth/metadata.d.ts +1 -1
- package/dist/oauth/metadata.d.ts.map +1 -1
- package/dist/oauth/metadata.js +2 -2
- package/dist/oauth/metadata.js.map +1 -1
- package/dist/oauth/middleware.d.ts.map +1 -1
- package/dist/oauth/middleware.js +16 -1
- package/dist/oauth/middleware.js.map +1 -1
- package/package.json +2 -2
package/dist/hooks.d.ts
CHANGED
|
@@ -53,6 +53,19 @@ export interface KnowledgeHooks {
|
|
|
53
53
|
* If not registered, default behavior applies (public reads, role-based writes).
|
|
54
54
|
*/
|
|
55
55
|
onAccessCheck?: (context: AccessCheckContext) => Promise<AccessCheckResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Resolve a kbId from the request when the URL path doesn't contain a valid one.
|
|
58
|
+
*
|
|
59
|
+
* Called by MCP and OAuth metadata handlers when the kbId extracted from
|
|
60
|
+
* the URL path doesn't match an existing KB. Enables hostname-based routing
|
|
61
|
+
* where the host app maps subdomains to knowledge bases.
|
|
62
|
+
*
|
|
63
|
+
* Return a kbId string, or null to indicate no resolution.
|
|
64
|
+
*/
|
|
65
|
+
resolveKbId?: (request: {
|
|
66
|
+
hostname: string;
|
|
67
|
+
pathname: string;
|
|
68
|
+
}) => Promise<string | null>;
|
|
56
69
|
/**
|
|
57
70
|
* URL path for login redirect.
|
|
58
71
|
*
|
|
@@ -82,6 +95,15 @@ export declare function checkAccess(context: AccessCheckContext): Promise<Access
|
|
|
82
95
|
* Get the configured login path (if any).
|
|
83
96
|
*/
|
|
84
97
|
export declare function getLoginPath(): string | null;
|
|
98
|
+
/**
|
|
99
|
+
* Resolve a kbId from the request via the registered hook.
|
|
100
|
+
*
|
|
101
|
+
* Returns null if no hook is registered or if the hook returns null.
|
|
102
|
+
*/
|
|
103
|
+
export declare function resolveKbId(request: {
|
|
104
|
+
hostname: string;
|
|
105
|
+
pathname: string;
|
|
106
|
+
}): Promise<string | null>;
|
|
85
107
|
/**
|
|
86
108
|
* Reset all hooks (for testing).
|
|
87
109
|
*/
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAM3D,MAAM,WAAW,kBAAkB;IAClC,6CAA6C;IAC7C,IAAI,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/D,uCAAuC;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,sBAAsB;IACtB,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,wDAAwD;IACxD,MAAM,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IACjC,8BAA8B;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC9B;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE5E;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAE5D;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAGhG;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAM3D,MAAM,WAAW,kBAAkB;IAClC,6CAA6C;IAC7C,IAAI,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/D,uCAAuC;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,sBAAsB;IACtB,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,wDAAwD;IACxD,MAAM,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IACjC,8BAA8B;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC9B;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE5E;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1F;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAE5D;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAGhG;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGzG;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
package/dist/hooks.js
CHANGED
|
@@ -44,6 +44,16 @@ export async function checkAccess(context) {
|
|
|
44
44
|
export function getLoginPath() {
|
|
45
45
|
return hooks.loginPath || null;
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve a kbId from the request via the registered hook.
|
|
49
|
+
*
|
|
50
|
+
* Returns null if no hook is registered or if the hook returns null.
|
|
51
|
+
*/
|
|
52
|
+
export async function resolveKbId(request) {
|
|
53
|
+
if (!hooks.resolveKbId)
|
|
54
|
+
return null;
|
|
55
|
+
return hooks.resolveKbId(request);
|
|
56
|
+
}
|
|
47
57
|
/**
|
|
48
58
|
* Reset all hooks (for testing).
|
|
49
59
|
*/
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoEH,+EAA+E;AAC/E,yCAAyC;AACzC,+EAA+E;AAE/E,IAAI,KAAK,GAAmB,EAAE,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,QAAwB;IACrD,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC5D,IAAI,CAAC,KAAK,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC3B,OAAO,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA+C;IAChF,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IAC1B,KAAK,GAAG,EAAE,CAAC;AACZ,CAAC"}
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,CACtC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,KAC1C,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,CACtC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,KAC1C,OAAO,CAAC,OAAO,CAAC,CAmJpB"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
import { handleJsonRpc } from "./protocol.js";
|
|
17
17
|
import { validateMcpAuth } from "../oauth/validate.js";
|
|
18
18
|
import { getKnowledgeBase } from "../core/knowledge-base.js";
|
|
19
|
-
import { checkAccess } from "../hooks.js";
|
|
19
|
+
import { checkAccess, resolveKbId } from "../hooks.js";
|
|
20
20
|
import { readBody, getBaseUrl } from "../http-utils.js";
|
|
21
21
|
/**
|
|
22
22
|
* Extract the kbId from the URL path.
|
|
@@ -45,13 +45,22 @@ export function createMcpMiddleware() {
|
|
|
45
45
|
if (!pathname.startsWith('/mcp/')) {
|
|
46
46
|
return next(request);
|
|
47
47
|
}
|
|
48
|
-
// Extract kbId from the path
|
|
49
|
-
|
|
48
|
+
// Extract kbId from the path, falling back to hook-based resolution
|
|
49
|
+
let kbId = extractKbIdFromPath(pathname);
|
|
50
50
|
if (!kbId) {
|
|
51
51
|
return next(request);
|
|
52
52
|
}
|
|
53
|
-
// Validate the KB exists
|
|
54
|
-
|
|
53
|
+
// Validate the KB exists — if not, try hostname-based resolution via hook
|
|
54
|
+
let kb = await getKnowledgeBase(kbId);
|
|
55
|
+
if (!kb) {
|
|
56
|
+
const hostHeader = request.headers?.host || '';
|
|
57
|
+
const hostname = hostHeader.split(':')[0];
|
|
58
|
+
const resolved = await resolveKbId({ hostname, pathname });
|
|
59
|
+
if (resolved) {
|
|
60
|
+
kbId = resolved;
|
|
61
|
+
kb = await getKnowledgeBase(kbId);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
55
64
|
if (!kb) {
|
|
56
65
|
return new Response(JSON.stringify({
|
|
57
66
|
jsonrpc: '2.0',
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAwB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth/metadata.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ import type { HarperRequest } from '../types.ts';
|
|
|
12
12
|
* and what scopes are supported. Each KB has its own protected resource
|
|
13
13
|
* metadata so the resource URL is scoped to that KB.
|
|
14
14
|
*/
|
|
15
|
-
export declare function handleProtectedResourceMetadata(request: HarperRequest, kbId: string): Response;
|
|
15
|
+
export declare function handleProtectedResourceMetadata(request: HarperRequest, kbId: string, resourcePath?: string): Response;
|
|
16
16
|
/**
|
|
17
17
|
* Handle GET /.well-known/oauth-authorization-server
|
|
18
18
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/oauth/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD;;;;;;GAMG;AACH,wBAAgB,+BAA+B,
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/oauth/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC9C,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACnB,QAAQ,CAUV;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAgBzE"}
|
package/dist/oauth/metadata.js
CHANGED
|
@@ -13,10 +13,10 @@ const SCOPES = ['mcp:read', 'mcp:write'];
|
|
|
13
13
|
* and what scopes are supported. Each KB has its own protected resource
|
|
14
14
|
* metadata so the resource URL is scoped to that KB.
|
|
15
15
|
*/
|
|
16
|
-
export function handleProtectedResourceMetadata(request, kbId) {
|
|
16
|
+
export function handleProtectedResourceMetadata(request, kbId, resourcePath) {
|
|
17
17
|
const baseUrl = getBaseUrl(request);
|
|
18
18
|
return jsonResponse(200, {
|
|
19
|
-
resource: `${baseUrl}/mcp/${kbId}`,
|
|
19
|
+
resource: resourcePath ? `${baseUrl}${resourcePath}` : `${baseUrl}/mcp/${kbId}`,
|
|
20
20
|
authorization_servers: [baseUrl],
|
|
21
21
|
scopes_supported: SCOPES,
|
|
22
22
|
bearer_methods_supported: ['header'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/oauth/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/oauth/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAC9C,OAAsB,EACtB,IAAY,EACZ,YAAqB;IAErB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpC,OAAO,YAAY,CAAC,GAAG,EAAE;QACxB,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,IAAI,EAAE;QAC/E,qBAAqB,EAAE,CAAC,OAAO,CAAC;QAChC,gBAAgB,EAAE,MAAM;QACxB,wBAAwB,EAAE,CAAC,QAAQ,CAAC;QACpC,aAAa,EAAE,2BAA2B;KAC1C,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAsB;IAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpC,OAAO,YAAY,CAAC,GAAG,EAAE;QACxB,MAAM,EAAE,OAAO;QACf,sBAAsB,EAAE,GAAG,OAAO,qBAAqB;QACvD,cAAc,EAAE,GAAG,OAAO,iBAAiB;QAC3C,qBAAqB,EAAE,GAAG,OAAO,oBAAoB;QACrD,QAAQ,EAAE,GAAG,OAAO,gBAAgB;QACpC,gBAAgB,EAAE,MAAM;QACxB,wBAAwB,EAAE,CAAC,MAAM,CAAC;QAClC,qBAAqB,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;QAC9D,qCAAqC,EAAE,CAAC,MAAM,CAAC;QAC/C,gCAAgC,EAAE,CAAC,MAAM,CAAC;QAC1C,qBAAqB,EAAE,GAAG,OAAO,GAAG;KACpC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,IAA6B;IAClE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACzC,MAAM;QACN,OAAO,EAAE;YACR,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,sBAAsB;SACvC;KACD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/oauth/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/oauth/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,KAAK,YAAY,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEjH;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,CAwDpD"}
|
package/dist/oauth/middleware.js
CHANGED
|
@@ -18,6 +18,8 @@ import { handleRegister } from "./register.js";
|
|
|
18
18
|
import { handleAuthorizeGet, handleAuthorizePost } from "./authorize.js";
|
|
19
19
|
import { handleToken } from "./token.js";
|
|
20
20
|
import { getJwks } from "./keys.js";
|
|
21
|
+
import { resolveKbId } from "../hooks.js";
|
|
22
|
+
import { getKnowledgeBase } from "../core/knowledge-base.js";
|
|
21
23
|
/**
|
|
22
24
|
* Create the OAuth middleware for Harper's scope.server.http().
|
|
23
25
|
*/
|
|
@@ -28,7 +30,20 @@ export function createOAuthMiddleware() {
|
|
|
28
30
|
// Well-known metadata endpoints — protected resource metadata is per-KB
|
|
29
31
|
const prMatch = pathname.match(/^\/\.well-known\/oauth-protected-resource\/([^/]+)$/);
|
|
30
32
|
if (prMatch && method === 'GET') {
|
|
31
|
-
|
|
33
|
+
let kbId = prMatch[1];
|
|
34
|
+
// If the path kbId isn't a real KB, try hostname-based resolution
|
|
35
|
+
const kb = await getKnowledgeBase(kbId);
|
|
36
|
+
if (!kb) {
|
|
37
|
+
const hostHeader = request.headers?.host || '';
|
|
38
|
+
const hostname = hostHeader.split(':')[0];
|
|
39
|
+
const resolved = await resolveKbId({ hostname, pathname });
|
|
40
|
+
if (resolved) {
|
|
41
|
+
// Resource path uses the original path segment (e.g., /mcp) to
|
|
42
|
+
// match the URL the client connected to (hostname-based routing)
|
|
43
|
+
return handleProtectedResourceMetadata(request, resolved, `/${prMatch[1]}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return handleProtectedResourceMetadata(request, kbId);
|
|
32
47
|
}
|
|
33
48
|
if (pathname === '/.well-known/oauth-authorization-server' && method === 'GET') {
|
|
34
49
|
return handleAuthServerMetadata(request);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/oauth/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,+BAA+B,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/oauth/middleware.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "harper-kb",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Knowledge base plugin for Harper with MCP server integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
},
|
|
53
53
|
"optionalDependencies": {
|
|
54
54
|
"harper-fabric-embeddings": "^0.1.4",
|
|
55
|
-
"harper-fabric-onnx": "^0.
|
|
55
|
+
"harper-fabric-onnx": "^0.3.0"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"harperdb": ">=4.7.0"
|