@privos_ai/app-server 0.6.1 → 0.7.0
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/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/relay/agent-bot-credential.d.ts +71 -0
- package/dist/relay/agent-bot-credential.d.ts.map +1 -0
- package/dist/relay/agent-bot-credential.js +92 -0
- package/dist/relay/agent-bot-credential.js.map +1 -0
- package/dist/relay/hub-rest-as-bot-client.d.ts +77 -0
- package/dist/relay/hub-rest-as-bot-client.d.ts.map +1 -0
- package/dist/relay/hub-rest-as-bot-client.js +136 -0
- package/dist/relay/hub-rest-as-bot-client.js.map +1 -0
- package/dist/relay/relay-client.d.ts +15 -0
- package/dist/relay/relay-client.d.ts.map +1 -1
- package/dist/relay/relay-client.js +7 -2
- package/dist/relay/relay-client.js.map +1 -1
- package/dist/relay/standalone-control.d.ts +2 -1
- package/dist/relay/standalone-control.d.ts.map +1 -1
- package/dist/relay/standalone-control.js +39 -0
- package/dist/relay/standalone-control.js.map +1 -1
- package/dist/relay/standalone-identity.d.ts +9 -0
- package/dist/relay/standalone-identity.d.ts.map +1 -1
- package/dist/relay/standalone-identity.js +12 -1
- package/dist/relay/standalone-identity.js.map +1 -1
- package/dist/runtime-mode.d.ts +1 -1
- package/dist/runtime-mode.d.ts.map +1 -1
- package/dist/runtime-mode.js.map +1 -1
- package/dist/serve-app.d.ts +81 -0
- package/dist/serve-app.d.ts.map +1 -0
- package/dist/serve-app.js +277 -0
- package/dist/serve-app.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -25,10 +25,16 @@ export { DEFAULT_HUB_USER_TOKEN_JWKS_PATH, buildHubUserTokenAuthOptions, extract
|
|
|
25
25
|
export type { HubUserTokenAuthOptions } from './relay/hub-user-token-actor.js';
|
|
26
26
|
export { DEFAULT_STANDALONE_IDENTITY_FILE, StandaloneIdentityError, loadStandaloneIdentity, saveStandaloneIdentity, rotateStandaloneIdentity, standaloneIdentityFileExists, standaloneHubFingerprint, assertStandaloneIdentityShape, } from './relay/standalone-identity.js';
|
|
27
27
|
export type { StandaloneIdentityV2, LoadedStandaloneIdentity, StandaloneIdentityErrorCode, } from './relay/standalone-identity.js';
|
|
28
|
-
export { STANDALONE_SECRET_ROTATE_METHOD, STANDALONE_TRUST_ROTATE_METHOD, STANDALONE_CAPABILITIES_CHANGED_METHOD, StandaloneControlError, isStandaloneControlMethod, createStandaloneRelayIdentityController, loadStandaloneRelayIdentityController, } from './relay/standalone-control.js';
|
|
28
|
+
export { STANDALONE_SECRET_ROTATE_METHOD, STANDALONE_TRUST_ROTATE_METHOD, STANDALONE_CAPABILITIES_CHANGED_METHOD, STANDALONE_AGENT_BOT_CREDENTIAL_METHOD, StandaloneControlError, isStandaloneControlMethod, createStandaloneRelayIdentityController, loadStandaloneRelayIdentityController, } from './relay/standalone-control.js';
|
|
29
29
|
export type { StandaloneEffectiveCapabilities, StandaloneRelayIdentityController, StandaloneRelayIdentityControllerOptions, } from './relay/standalone-control.js';
|
|
30
30
|
export { checkManifestDigestDrift, createStandaloneReadinessCheck, } from './relay/standalone-readiness.js';
|
|
31
31
|
export type { StandaloneReadinessCheckOptions, StandaloneReadinessReason, StandaloneReadinessResult, } from './relay/standalone-readiness.js';
|
|
32
|
+
export { AGENT_BOT_CREDENTIAL_ENV_KEY, AGENT_BOT_USER_ID_ENV_KEY, AGENT_BOT_CREDENTIAL_OPERATOR_INSTRUCTION, readAgentBotCredential, getAgentBotCredentialState, setAdoptedAgentBotCredential, markAgentBotCredentialLive, markAgentBotCredentialRejected, resetAgentBotCredentialOutcomeForTests, } from './relay/agent-bot-credential.js';
|
|
33
|
+
export type { AgentBotCredential, AgentBotCredentialState } from './relay/agent-bot-credential.js';
|
|
34
|
+
export { createAgentBotHubClient, createAgentBotHubClientFromWorkloadIdentity, createAgentBotHubClientFromHubOrigin, AgentBotCredentialAbsentError, AgentBotHubUnreachableError, } from './relay/hub-rest-as-bot-client.js';
|
|
35
|
+
export type { RoomBoundHubClient, RoomBoundHubFetchInit, AgentBotHubClientOptions, } from './relay/hub-rest-as-bot-client.js';
|
|
36
|
+
export { serveApp, DEFAULT_SERVE_APP_PORT } from './serve-app.js';
|
|
37
|
+
export type { ServeAppOptions, ServeAppHandle, ServeAppHandlerContext, ServeAppTransportOverride, ServeAppTestSeams, } from './serve-app.js';
|
|
32
38
|
export { resolveRuntimeMode, RuntimeModeError } from './runtime-mode.js';
|
|
33
39
|
export type { RuntimeMode, RuntimeModeResolution, RuntimeModeErrorCode, ResolveRuntimeModeOptions, } from './runtime-mode.js';
|
|
34
40
|
export { DEFAULT_WORKLOAD_SOCKET, WorkloadIdentityClient, WorkloadIdentityError, WorkloadPermissionDeniedError, RoomBoundWorkloadClient, getWorkloadIdentityClient, } from './workload/workload-identity.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,8 +13,11 @@ export { pairOverWebSocket, pairFromDescriptor, connectRelay, } from './relay/re
|
|
|
13
13
|
export { rawDataToText, MessageTooLargeError } from './relay/message-adapter.js';
|
|
14
14
|
export { DEFAULT_HUB_USER_TOKEN_JWKS_PATH, buildHubUserTokenAuthOptions, extractRelayUserTokenCredential, validateHubUserTokenOrigin, } from './relay/hub-user-token-actor.js';
|
|
15
15
|
export { DEFAULT_STANDALONE_IDENTITY_FILE, StandaloneIdentityError, loadStandaloneIdentity, saveStandaloneIdentity, rotateStandaloneIdentity, standaloneIdentityFileExists, standaloneHubFingerprint, assertStandaloneIdentityShape, } from './relay/standalone-identity.js';
|
|
16
|
-
export { STANDALONE_SECRET_ROTATE_METHOD, STANDALONE_TRUST_ROTATE_METHOD, STANDALONE_CAPABILITIES_CHANGED_METHOD, StandaloneControlError, isStandaloneControlMethod, createStandaloneRelayIdentityController, loadStandaloneRelayIdentityController, } from './relay/standalone-control.js';
|
|
16
|
+
export { STANDALONE_SECRET_ROTATE_METHOD, STANDALONE_TRUST_ROTATE_METHOD, STANDALONE_CAPABILITIES_CHANGED_METHOD, STANDALONE_AGENT_BOT_CREDENTIAL_METHOD, StandaloneControlError, isStandaloneControlMethod, createStandaloneRelayIdentityController, loadStandaloneRelayIdentityController, } from './relay/standalone-control.js';
|
|
17
17
|
export { checkManifestDigestDrift, createStandaloneReadinessCheck, } from './relay/standalone-readiness.js';
|
|
18
|
+
export { AGENT_BOT_CREDENTIAL_ENV_KEY, AGENT_BOT_USER_ID_ENV_KEY, AGENT_BOT_CREDENTIAL_OPERATOR_INSTRUCTION, readAgentBotCredential, getAgentBotCredentialState, setAdoptedAgentBotCredential, markAgentBotCredentialLive, markAgentBotCredentialRejected, resetAgentBotCredentialOutcomeForTests, } from './relay/agent-bot-credential.js';
|
|
19
|
+
export { createAgentBotHubClient, createAgentBotHubClientFromWorkloadIdentity, createAgentBotHubClientFromHubOrigin, AgentBotCredentialAbsentError, AgentBotHubUnreachableError, } from './relay/hub-rest-as-bot-client.js';
|
|
20
|
+
export { serveApp, DEFAULT_SERVE_APP_PORT } from './serve-app.js';
|
|
18
21
|
export { resolveRuntimeMode, RuntimeModeError } from './runtime-mode.js';
|
|
19
22
|
export { DEFAULT_WORKLOAD_SOCKET, WorkloadIdentityClient, WorkloadIdentityError, WorkloadPermissionDeniedError, RoomBoundWorkloadClient, getWorkloadIdentityClient, } from './workload/workload-identity.js';
|
|
20
23
|
export { BoundedRuntimeDispatchReplayConsumerV3, assertRuntimeDispatchRelayAffinityV3, assertRuntimeDispatchTrustConfigurationV3, extractRuntimeDispatchRelayEnvelopeV3, isExactRuntimeReadinessRpcV3, isUnsignedRuntimeReadinessRpcV3, parseRuntimeDispatchTrustV3Json, sha256RuntimeDispatchBodyV3, verifyClusterDispatchAssertionV3, verifyDispatchAssertion, verifyRuntimeDispatchAssertionV3, } from './workload/dispatch-assertion.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQxE,OAAO,EACN,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,8BAA8B,EAC9B,6BAA6B,GAC7B,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EACpB,0BAA0B,GAC1B,MAAM,kCAAkC,CAAC;AAO1C,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,cAAc,GACd,MAAM,sBAAsB,CAAC;AAW9B,OAAO,EACN,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,oBAAoB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,mBAAmB,EACnB,aAAa,EACb,uBAAuB,GACvB,MAAM,wBAAwB,CAAC;AAahC,OAAO,EACN,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EACN,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,GACxB,MAAM,0BAA0B,CAAC;AASlC,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,GACZ,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EACN,gCAAgC,EAChC,4BAA4B,EAC5B,+BAA+B,EAC/B,0BAA0B,GAC1B,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACN,gCAAgC,EAChC,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,EACxB,6BAA6B,GAC7B,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EACN,+BAA+B,EAC/B,8BAA8B,EAC9B,sCAAsC,EACtC,sBAAsB,EACtB,yBAAyB,EACzB,uCAAuC,EACvC,qCAAqC,GACrC,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EACN,wBAAwB,EACxB,8BAA8B,GAC9B,MAAM,iCAAiC,CAAC;AAOzC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAQzE,OAAO,EACN,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,uBAAuB,EACvB,yBAAyB,GACzB,MAAM,iCAAiC,CAAC;AAWzC,OAAO,EACN,sCAAsC,EACtC,oCAAoC,EACpC,yCAAyC,EACzC,qCAAqC,EACrC,4BAA4B,EAC5B,+BAA+B,EAC/B,+BAA+B,EAC/B,2BAA2B,EAC3B,gCAAgC,EAChC,uBAAuB,EACvB,gCAAgC,GAChC,MAAM,kCAAkC,CAAC;AAkB1C,OAAO,EACN,gCAAgC,EAChC,+CAA+C,EAC/C,6CAA6C,GAC7C,MAAM,uCAAuC,CAAC;AAc/C,OAAO,EACN,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,kCAAkC,GAClC,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An app's own installation-bot credential, read from its own environment or
|
|
3
|
+
* adopted live over the standalone control channel.
|
|
4
|
+
*
|
|
5
|
+
* There is no issuance code path here. A workspace admin issues (or re-issues)
|
|
6
|
+
* the credential from Hub's admin app settings page; Hub mints it, then
|
|
7
|
+
* delivers it to the running app one of two ways:
|
|
8
|
+
* - managed / marketplace: written into the app's encrypted env config, so it
|
|
9
|
+
* arrives as an environment variable at container (re)start;
|
|
10
|
+
* - standalone-production: pushed as a signed control assertion over the Relay
|
|
11
|
+
* WebSocket (see `standalone-control.ts`), which persists it into the
|
|
12
|
+
* identity file and adopts it in-process HOT — no restart required.
|
|
13
|
+
*
|
|
14
|
+
* This module therefore does exactly these things, and nothing else:
|
|
15
|
+
* - read the two reserved env vars, fresh, every time (env is the operator
|
|
16
|
+
* override and always wins);
|
|
17
|
+
* - fall back to a live-adopted / identity-file-persisted value when the env
|
|
18
|
+
* vars are absent (the standalone hot-adoption path);
|
|
19
|
+
* - derive a coarse state from the last outcome of actually using them;
|
|
20
|
+
* - let the transport that uses them report what happened, without ever
|
|
21
|
+
* handing the token itself to anything but the transport's own headers.
|
|
22
|
+
*
|
|
23
|
+
* No function here returns, logs, or throws the credential value beyond the
|
|
24
|
+
* opaque pair `readAgentBotCredential` returns for the transport to place
|
|
25
|
+
* directly into request headers.
|
|
26
|
+
*/
|
|
27
|
+
/** The reserved manifest env keys Hub uses to deliver this credential. */
|
|
28
|
+
export declare const AGENT_BOT_CREDENTIAL_ENV_KEY = "PRIVOS_AGENT_BOT_CREDENTIAL";
|
|
29
|
+
export declare const AGENT_BOT_USER_ID_ENV_KEY = "PRIVOS_AGENT_BOT_USER_ID";
|
|
30
|
+
/**
|
|
31
|
+
* Derived credential state — never owned, always recomputed:
|
|
32
|
+
* - `absent`: neither the env pair nor an adopted value is available. Normal
|
|
33
|
+
* for a fresh install; the credential arrives later and out-of-band.
|
|
34
|
+
* - `live`: a credential is available and the most recent call using it (if
|
|
35
|
+
* any) did not come back 401. Optimistic default before any call.
|
|
36
|
+
* - `rejected`: the most recent call using this exact credential came back
|
|
37
|
+
* 401. Every re-issue rotates the previous token dead, and revocation has
|
|
38
|
+
* more causes than loss (grant change, suspension, upgrade cutover,
|
|
39
|
+
* uninstall) — this app cannot distinguish them and cannot fix any of them.
|
|
40
|
+
* Only a newly delivered credential (env restart, or a fresh control-channel
|
|
41
|
+
* push) can return to `live`.
|
|
42
|
+
*/
|
|
43
|
+
export type AgentBotCredentialState = 'absent' | 'live' | 'rejected';
|
|
44
|
+
/** Opaque header pair. Never stringify, log, or embed this outside a request header. */
|
|
45
|
+
export interface AgentBotCredential {
|
|
46
|
+
readonly botUserId: string;
|
|
47
|
+
readonly token: string;
|
|
48
|
+
}
|
|
49
|
+
/** Operator-facing instruction shown while the app cannot use its own credential. */
|
|
50
|
+
export declare const AGENT_BOT_CREDENTIAL_OPERATOR_INSTRUCTION: string;
|
|
51
|
+
/**
|
|
52
|
+
* Adopt a credential delivered out-of-band (standalone control channel, or a
|
|
53
|
+
* boot-time seed from the persisted identity file). Env always overrides this,
|
|
54
|
+
* so adopting never masks an operator-set env value. A fresh adoption clears the
|
|
55
|
+
* last outcome so a previously-rejected token does not keep the state `rejected`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function setAdoptedAgentBotCredential(credential: AgentBotCredential): void;
|
|
58
|
+
/**
|
|
59
|
+
* Read the credential: the env pair first (operator override), then any
|
|
60
|
+
* adopted / persisted value. `null` when neither is available.
|
|
61
|
+
*/
|
|
62
|
+
export declare function readAgentBotCredential(): AgentBotCredential | null;
|
|
63
|
+
/** Current derived state. Safe to expose to a UI: never carries the token. */
|
|
64
|
+
export declare function getAgentBotCredentialState(): AgentBotCredentialState;
|
|
65
|
+
/** Record that the credential was just used successfully. */
|
|
66
|
+
export declare function markAgentBotCredentialLive(): void;
|
|
67
|
+
/** Record that Hub just rejected this exact credential with 401. */
|
|
68
|
+
export declare function markAgentBotCredentialRejected(): void;
|
|
69
|
+
/** Test-only: reset all in-process state so cases do not leak into each other. */
|
|
70
|
+
export declare function resetAgentBotCredentialOutcomeForTests(): void;
|
|
71
|
+
//# sourceMappingURL=agent-bot-credential.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-bot-credential.d.ts","sourceRoot":"","sources":["../../src/relay/agent-bot-credential.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,0EAA0E;AAC1E,eAAO,MAAM,4BAA4B,gCAAgC,CAAC;AAC1E,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AAEpE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAErE,wFAAwF;AACxF,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,qFAAqF;AACrF,eAAO,MAAM,yCAAyC,QAE2C,CAAC;AAiBlG;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAKjF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,kBAAkB,GAAG,IAAI,CAQlE;AAED,8EAA8E;AAC9E,wBAAgB,0BAA0B,IAAI,uBAAuB,CAGpE;AAED,6DAA6D;AAC7D,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED,oEAAoE;AACpE,wBAAgB,8BAA8B,IAAI,IAAI,CAErD;AAED,kFAAkF;AAClF,wBAAgB,sCAAsC,IAAI,IAAI,CAG7D"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An app's own installation-bot credential, read from its own environment or
|
|
3
|
+
* adopted live over the standalone control channel.
|
|
4
|
+
*
|
|
5
|
+
* There is no issuance code path here. A workspace admin issues (or re-issues)
|
|
6
|
+
* the credential from Hub's admin app settings page; Hub mints it, then
|
|
7
|
+
* delivers it to the running app one of two ways:
|
|
8
|
+
* - managed / marketplace: written into the app's encrypted env config, so it
|
|
9
|
+
* arrives as an environment variable at container (re)start;
|
|
10
|
+
* - standalone-production: pushed as a signed control assertion over the Relay
|
|
11
|
+
* WebSocket (see `standalone-control.ts`), which persists it into the
|
|
12
|
+
* identity file and adopts it in-process HOT — no restart required.
|
|
13
|
+
*
|
|
14
|
+
* This module therefore does exactly these things, and nothing else:
|
|
15
|
+
* - read the two reserved env vars, fresh, every time (env is the operator
|
|
16
|
+
* override and always wins);
|
|
17
|
+
* - fall back to a live-adopted / identity-file-persisted value when the env
|
|
18
|
+
* vars are absent (the standalone hot-adoption path);
|
|
19
|
+
* - derive a coarse state from the last outcome of actually using them;
|
|
20
|
+
* - let the transport that uses them report what happened, without ever
|
|
21
|
+
* handing the token itself to anything but the transport's own headers.
|
|
22
|
+
*
|
|
23
|
+
* No function here returns, logs, or throws the credential value beyond the
|
|
24
|
+
* opaque pair `readAgentBotCredential` returns for the transport to place
|
|
25
|
+
* directly into request headers.
|
|
26
|
+
*/
|
|
27
|
+
/** The reserved manifest env keys Hub uses to deliver this credential. */
|
|
28
|
+
export const AGENT_BOT_CREDENTIAL_ENV_KEY = 'PRIVOS_AGENT_BOT_CREDENTIAL';
|
|
29
|
+
export const AGENT_BOT_USER_ID_ENV_KEY = 'PRIVOS_AGENT_BOT_USER_ID';
|
|
30
|
+
/** Operator-facing instruction shown while the app cannot use its own credential. */
|
|
31
|
+
export const AGENT_BOT_CREDENTIAL_OPERATOR_INSTRUCTION = 'A workspace admin must issue or re-issue this app’s credential from Hub → Admin → Apps '
|
|
32
|
+
+ '→ this app → Settings, then press Apply. This app cannot issue or repair its own credential.';
|
|
33
|
+
// Last observed outcome of actually using the credential. `null` means no
|
|
34
|
+
// call has been made yet in this process, which reads as `live` (optimistic)
|
|
35
|
+
// per the state machine above.
|
|
36
|
+
let lastOutcome = null;
|
|
37
|
+
// A credential adopted at boot (seeded from the persisted identity file) or
|
|
38
|
+
// hot over the standalone control channel. Env always wins over this; it is the
|
|
39
|
+
// fallback that makes standalone delivery without a restart observable at all.
|
|
40
|
+
let adopted = null;
|
|
41
|
+
function normalize(botUserId, token) {
|
|
42
|
+
if (!token.trim() || !botUserId.trim())
|
|
43
|
+
return null;
|
|
44
|
+
return Object.freeze({ botUserId: botUserId.trim(), token });
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Adopt a credential delivered out-of-band (standalone control channel, or a
|
|
48
|
+
* boot-time seed from the persisted identity file). Env always overrides this,
|
|
49
|
+
* so adopting never masks an operator-set env value. A fresh adoption clears the
|
|
50
|
+
* last outcome so a previously-rejected token does not keep the state `rejected`.
|
|
51
|
+
*/
|
|
52
|
+
export function setAdoptedAgentBotCredential(credential) {
|
|
53
|
+
const next = normalize(credential.botUserId, credential.token);
|
|
54
|
+
if (!next)
|
|
55
|
+
return;
|
|
56
|
+
adopted = next;
|
|
57
|
+
lastOutcome = null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Read the credential: the env pair first (operator override), then any
|
|
61
|
+
* adopted / persisted value. `null` when neither is available.
|
|
62
|
+
*/
|
|
63
|
+
export function readAgentBotCredential() {
|
|
64
|
+
const token = process.env[AGENT_BOT_CREDENTIAL_ENV_KEY];
|
|
65
|
+
const botUserId = process.env[AGENT_BOT_USER_ID_ENV_KEY];
|
|
66
|
+
if (token && botUserId) {
|
|
67
|
+
const fromEnv = normalize(botUserId, token);
|
|
68
|
+
if (fromEnv)
|
|
69
|
+
return fromEnv;
|
|
70
|
+
}
|
|
71
|
+
return adopted;
|
|
72
|
+
}
|
|
73
|
+
/** Current derived state. Safe to expose to a UI: never carries the token. */
|
|
74
|
+
export function getAgentBotCredentialState() {
|
|
75
|
+
if (!readAgentBotCredential())
|
|
76
|
+
return 'absent';
|
|
77
|
+
return lastOutcome === 'rejected' ? 'rejected' : 'live';
|
|
78
|
+
}
|
|
79
|
+
/** Record that the credential was just used successfully. */
|
|
80
|
+
export function markAgentBotCredentialLive() {
|
|
81
|
+
lastOutcome = 'live';
|
|
82
|
+
}
|
|
83
|
+
/** Record that Hub just rejected this exact credential with 401. */
|
|
84
|
+
export function markAgentBotCredentialRejected() {
|
|
85
|
+
lastOutcome = 'rejected';
|
|
86
|
+
}
|
|
87
|
+
/** Test-only: reset all in-process state so cases do not leak into each other. */
|
|
88
|
+
export function resetAgentBotCredentialOutcomeForTests() {
|
|
89
|
+
lastOutcome = null;
|
|
90
|
+
adopted = null;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=agent-bot-credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-bot-credential.js","sourceRoot":"","sources":["../../src/relay/agent-bot-credential.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,4BAA4B,GAAG,6BAA6B,CAAC;AAC1E,MAAM,CAAC,MAAM,yBAAyB,GAAG,0BAA0B,CAAC;AAuBpE,qFAAqF;AACrF,MAAM,CAAC,MAAM,yCAAyC,GACrD,yFAAyF;MACvF,8FAA8F,CAAC;AAElG,0EAA0E;AAC1E,6EAA6E;AAC7E,+BAA+B;AAC/B,IAAI,WAAW,GAA+B,IAAI,CAAC;AAEnD,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,IAAI,OAAO,GAA8B,IAAI,CAAC;AAE9C,SAAS,SAAS,CAAC,SAAiB,EAAE,KAAa;IAClD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAA8B;IAC1E,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,OAAO,GAAG,IAAI,CAAC;IACf,WAAW,GAAG,IAAI,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzD,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,0BAA0B;IACzC,IAAI,CAAC,sBAAsB,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC/C,OAAO,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,0BAA0B;IACzC,WAAW,GAAG,MAAM,CAAC;AACtB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,8BAA8B;IAC7C,WAAW,GAAG,UAAU,CAAC;AAC1B,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,sCAAsC;IACrD,WAAW,GAAG,IAAI,CAAC;IACnB,OAAO,GAAG,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hub REST transport that authenticates as this app's own installation bot.
|
|
3
|
+
*
|
|
4
|
+
* Hub authenticates a REST call from the header PAIR `x-user-id` +
|
|
5
|
+
* `x-auth-token` (privos-hub `apps/meteor/app/api/server/api.ts` auth path).
|
|
6
|
+
* This transport reads that pair from `agent-bot-credential.ts` on every
|
|
7
|
+
* call — never once at construction — and never carries any Sandbox
|
|
8
|
+
* selector, verified-room binding, or human-actor identity: the bot is a
|
|
9
|
+
* standing, room-independent identity, so this transport needs no
|
|
10
|
+
* `ToolCallContext` at all and works exactly the same inside a live tool
|
|
11
|
+
* call as it does in the background.
|
|
12
|
+
*
|
|
13
|
+
* This is the canonical home of `RoomBoundHubClient` / `RoomBoundHubFetchInit`.
|
|
14
|
+
* Both this bot-credential transport and the per-call room-bound workload
|
|
15
|
+
* client (`workloadIdentityClient.forRoom(context)`) satisfy the same
|
|
16
|
+
* `RoomBoundHubClient` shape, so callers can accept either without a second
|
|
17
|
+
* interface.
|
|
18
|
+
*/
|
|
19
|
+
import type { WorkloadIdentityClient } from '../workload/workload-identity.js';
|
|
20
|
+
/** The room-bound surface a Hub REST caller is allowed to use. */
|
|
21
|
+
export interface RoomBoundHubClient {
|
|
22
|
+
authorizedFetch(input: string, init: RoomBoundHubFetchInit): Promise<Response>;
|
|
23
|
+
}
|
|
24
|
+
export interface RoomBoundHubFetchInit extends RequestInit {
|
|
25
|
+
/** One exact granted permission this call exercises. Documentation only here: this transport carries exactly one identity, not a per-scope token. */
|
|
26
|
+
requiredScope: string;
|
|
27
|
+
retryMode?: 'safe-methods' | 'idempotent' | 'never';
|
|
28
|
+
replayable?: true;
|
|
29
|
+
}
|
|
30
|
+
/** The credential is absent: there is nothing to send. Distinct from a Hub rejection. */
|
|
31
|
+
export declare class AgentBotCredentialAbsentError extends Error {
|
|
32
|
+
constructor();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Hub could not be reached, or its origin could not be resolved. Distinct
|
|
36
|
+
* from a 401: nothing here says the credential itself is wrong. Deliberately
|
|
37
|
+
* carries no cause detail — a caught network error's message is never safe to
|
|
38
|
+
* surface, since nothing guarantees it cannot embed request state.
|
|
39
|
+
*/
|
|
40
|
+
export declare class AgentBotHubUnreachableError extends Error {
|
|
41
|
+
constructor();
|
|
42
|
+
}
|
|
43
|
+
export interface AgentBotHubClientOptions {
|
|
44
|
+
/** Resolve the current Hub origin. `undefined` means Hub is unreachable right now. */
|
|
45
|
+
resolveHubOrigin: () => Promise<string | undefined>;
|
|
46
|
+
fetchImplementation?: typeof fetch;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build the bot-credential transport.
|
|
50
|
+
*
|
|
51
|
+
* Every call re-reads the credential and re-resolves the Hub origin, so a
|
|
52
|
+
* long-lived instance never holds a stale value across a container restart
|
|
53
|
+
* boundary (irrelevant in practice, since a restart is a new process) or
|
|
54
|
+
* across a hot credential re-issue within the same process (relevant: the
|
|
55
|
+
* standalone control channel adopts a re-issued value in-process, and reading
|
|
56
|
+
* fresh here is what makes that observable without a restart).
|
|
57
|
+
*/
|
|
58
|
+
export declare function createAgentBotHubClient(options: AgentBotHubClientOptions): RoomBoundHubClient;
|
|
59
|
+
/**
|
|
60
|
+
* Managed-mode production factory: resolve the Hub origin from the same
|
|
61
|
+
* broker connection the workload identity client already maintains,
|
|
62
|
+
* independent of any verified `ToolCallContext` — `brokerContext()` is
|
|
63
|
+
* available whenever this process is paired, exactly the background-safe
|
|
64
|
+
* property this transport needs. Managed mode only: standalone-production
|
|
65
|
+
* (Relay) never mounts a workload broker, so this factory is not usable
|
|
66
|
+
* there — see `createAgentBotHubClientFromHubOrigin`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function createAgentBotHubClientFromWorkloadIdentity(workloadIdentityClient: WorkloadIdentityClient): RoomBoundHubClient;
|
|
69
|
+
/**
|
|
70
|
+
* Standalone-production factory: there is no workload broker to resolve a
|
|
71
|
+
* Hub origin from in this mode, so the caller supplies the one already
|
|
72
|
+
* pinned in the paired standalone identity file (`loadStandaloneIdentity()`
|
|
73
|
+
* → `relay.privosUrl` — the same origin the Relay OAuth token and WebSocket
|
|
74
|
+
* are reached at).
|
|
75
|
+
*/
|
|
76
|
+
export declare function createAgentBotHubClientFromHubOrigin(hubOrigin: string): RoomBoundHubClient;
|
|
77
|
+
//# sourceMappingURL=hub-rest-as-bot-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-rest-as-bot-client.d.ts","sourceRoot":"","sources":["../../src/relay/hub-rest-as-bot-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAQ/E,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IAClC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACzD,qJAAqJ;IACrJ,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,OAAO,CAAC;IACpD,UAAU,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,yFAAyF;AACzF,qBAAa,6BAA8B,SAAQ,KAAK;;CAKvD;AAED;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;;CAKrD;AAaD,MAAM,WAAW,wBAAwB;IACxC,sFAAsF;IACtF,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpD,mBAAmB,CAAC,EAAE,OAAO,KAAK,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,kBAAkB,CA4D7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,2CAA2C,CAAC,sBAAsB,EAAE,sBAAsB,GAAG,kBAAkB,CAU9H;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,CAE1F"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { markAgentBotCredentialLive, markAgentBotCredentialRejected, readAgentBotCredential, } from './agent-bot-credential.js';
|
|
2
|
+
/** The credential is absent: there is nothing to send. Distinct from a Hub rejection. */
|
|
3
|
+
export class AgentBotCredentialAbsentError extends Error {
|
|
4
|
+
constructor() {
|
|
5
|
+
super('agent_bot_credential_absent');
|
|
6
|
+
this.name = 'AgentBotCredentialAbsentError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Hub could not be reached, or its origin could not be resolved. Distinct
|
|
11
|
+
* from a 401: nothing here says the credential itself is wrong. Deliberately
|
|
12
|
+
* carries no cause detail — a caught network error's message is never safe to
|
|
13
|
+
* surface, since nothing guarantees it cannot embed request state.
|
|
14
|
+
*/
|
|
15
|
+
export class AgentBotHubUnreachableError extends Error {
|
|
16
|
+
constructor() {
|
|
17
|
+
super('agent_bot_hub_unreachable');
|
|
18
|
+
this.name = 'AgentBotHubUnreachableError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const RETRY_ATTEMPTS = 3;
|
|
22
|
+
const RETRY_BASE_DELAY_MS = 200;
|
|
23
|
+
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
24
|
+
const isRetryableMethod = (method, retryMode) => {
|
|
25
|
+
if (retryMode === 'safe-methods')
|
|
26
|
+
return method === 'GET' || method === 'HEAD';
|
|
27
|
+
if (retryMode === 'idempotent')
|
|
28
|
+
return method === 'GET' || method === 'HEAD' || method === 'PUT' || method === 'DELETE';
|
|
29
|
+
return false;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Build the bot-credential transport.
|
|
33
|
+
*
|
|
34
|
+
* Every call re-reads the credential and re-resolves the Hub origin, so a
|
|
35
|
+
* long-lived instance never holds a stale value across a container restart
|
|
36
|
+
* boundary (irrelevant in practice, since a restart is a new process) or
|
|
37
|
+
* across a hot credential re-issue within the same process (relevant: the
|
|
38
|
+
* standalone control channel adopts a re-issued value in-process, and reading
|
|
39
|
+
* fresh here is what makes that observable without a restart).
|
|
40
|
+
*/
|
|
41
|
+
export function createAgentBotHubClient(options) {
|
|
42
|
+
const doFetch = options.fetchImplementation ?? fetch;
|
|
43
|
+
async function attempt(url, init, credential) {
|
|
44
|
+
const { requiredScope: _requiredScope, retryMode: _retryMode, replayable: _replayable, headers, ...rest } = init;
|
|
45
|
+
const response = await doFetch(url, {
|
|
46
|
+
...rest,
|
|
47
|
+
headers: {
|
|
48
|
+
...headers,
|
|
49
|
+
'x-user-id': credential.botUserId,
|
|
50
|
+
'x-auth-token': credential.token,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
if (response.status === 401)
|
|
54
|
+
markAgentBotCredentialRejected();
|
|
55
|
+
else if (response.ok)
|
|
56
|
+
markAgentBotCredentialLive();
|
|
57
|
+
return response;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
async authorizedFetch(input, init) {
|
|
61
|
+
const credential = readAgentBotCredential();
|
|
62
|
+
if (!credential)
|
|
63
|
+
throw new AgentBotCredentialAbsentError();
|
|
64
|
+
let hubOrigin;
|
|
65
|
+
try {
|
|
66
|
+
hubOrigin = await options.resolveHubOrigin();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
hubOrigin = undefined;
|
|
70
|
+
}
|
|
71
|
+
if (!hubOrigin)
|
|
72
|
+
throw new AgentBotHubUnreachableError();
|
|
73
|
+
const url = `${hubOrigin}${input}`;
|
|
74
|
+
const method = (init.method || 'GET').toUpperCase();
|
|
75
|
+
const retryable = isRetryableMethod(method, init.retryMode);
|
|
76
|
+
const maxAttempts = retryable ? RETRY_ATTEMPTS : 1;
|
|
77
|
+
for (let index = 0; index < maxAttempts; index += 1) {
|
|
78
|
+
try {
|
|
79
|
+
const response = await attempt(url, init, credential);
|
|
80
|
+
// A 401 is a definitive rejection: retrying with the SAME stale
|
|
81
|
+
// credential cannot succeed, so it is never retried.
|
|
82
|
+
if (response.status === 401)
|
|
83
|
+
return response;
|
|
84
|
+
if (response.status >= 500 && retryable && index < maxAttempts - 1) {
|
|
85
|
+
await delay(RETRY_BASE_DELAY_MS * 2 ** index);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
return response;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Network/DNS/timeout failure. The caught error is discarded
|
|
92
|
+
// entirely and never inspected: nothing guarantees its message
|
|
93
|
+
// cannot embed request state, and none of it is safe to surface.
|
|
94
|
+
if (!retryable || index >= maxAttempts - 1)
|
|
95
|
+
throw new AgentBotHubUnreachableError();
|
|
96
|
+
await delay(RETRY_BASE_DELAY_MS * 2 ** index);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Unreachable in practice (the loop above always returns or throws),
|
|
100
|
+
// kept only so this function has an exhaustive static return type.
|
|
101
|
+
throw new AgentBotHubUnreachableError();
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Managed-mode production factory: resolve the Hub origin from the same
|
|
107
|
+
* broker connection the workload identity client already maintains,
|
|
108
|
+
* independent of any verified `ToolCallContext` — `brokerContext()` is
|
|
109
|
+
* available whenever this process is paired, exactly the background-safe
|
|
110
|
+
* property this transport needs. Managed mode only: standalone-production
|
|
111
|
+
* (Relay) never mounts a workload broker, so this factory is not usable
|
|
112
|
+
* there — see `createAgentBotHubClientFromHubOrigin`.
|
|
113
|
+
*/
|
|
114
|
+
export function createAgentBotHubClientFromWorkloadIdentity(workloadIdentityClient) {
|
|
115
|
+
return createAgentBotHubClient({
|
|
116
|
+
resolveHubOrigin: async () => {
|
|
117
|
+
try {
|
|
118
|
+
return (await workloadIdentityClient.brokerContext()).hubOrigin;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Standalone-production factory: there is no workload broker to resolve a
|
|
128
|
+
* Hub origin from in this mode, so the caller supplies the one already
|
|
129
|
+
* pinned in the paired standalone identity file (`loadStandaloneIdentity()`
|
|
130
|
+
* → `relay.privosUrl` — the same origin the Relay OAuth token and WebSocket
|
|
131
|
+
* are reached at).
|
|
132
|
+
*/
|
|
133
|
+
export function createAgentBotHubClientFromHubOrigin(hubOrigin) {
|
|
134
|
+
return createAgentBotHubClient({ resolveHubOrigin: async () => hubOrigin });
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=hub-rest-as-bot-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-rest-as-bot-client.js","sourceRoot":"","sources":["../../src/relay/hub-rest-as-bot-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,14 @@ export interface PairAppMeta {
|
|
|
11
11
|
icon?: string;
|
|
12
12
|
scopes?: string[];
|
|
13
13
|
permissions?: AppPermissionDescriptor[];
|
|
14
|
+
/**
|
|
15
|
+
* The app's own `privos-app.json`, announced at pairing so no admin ever
|
|
16
|
+
* handles the file. A Hub that accepts it registers a v3 app carrying this
|
|
17
|
+
* contract, declared but unapproved: the app holds credentials and no grant
|
|
18
|
+
* until an admin approves a ceiling, and no dispatch trust until it pairs
|
|
19
|
+
* again against the approved app. Omit it to register a legacy relay app.
|
|
20
|
+
*/
|
|
21
|
+
manifest?: unknown;
|
|
14
22
|
}
|
|
15
23
|
export interface PairingResult {
|
|
16
24
|
privosUrl: string;
|
|
@@ -24,6 +32,13 @@ export interface PairingResult {
|
|
|
24
32
|
fingerprint?: string;
|
|
25
33
|
/** Absolute path the standalone identity file was written to, when persisted. */
|
|
26
34
|
identityFilePath?: string;
|
|
35
|
+
/**
|
|
36
|
+
* The Hub registered this app from its announced manifest and is waiting for
|
|
37
|
+
* an admin to approve a permission ceiling. The credentials above are real,
|
|
38
|
+
* but the app is granted nothing and carries no dispatch trust yet — pair
|
|
39
|
+
* again once approved to receive it.
|
|
40
|
+
*/
|
|
41
|
+
awaitingApproval?: boolean;
|
|
27
42
|
}
|
|
28
43
|
export interface PairOverWebSocketOptions {
|
|
29
44
|
timeoutMs?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../../src/relay/relay-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAA2B,MAAM,IAAI,CAAC;AAE7C,OAAO,EAEN,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAWzD,OAAO,EACN,gBAAgB,EAIhB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAEN,KAAK,iCAAiC,EACtC,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAIN,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAE3B,MAAM,mCAAmC,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../../src/relay/relay-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,12 +48,15 @@ export function pairOverWebSocket(pairUrl, appMeta, WebSocketImpl = WebSocket, o
|
|
|
48
48
|
}, timeoutMs);
|
|
49
49
|
async function finishPairing(input) {
|
|
50
50
|
if (input.pairingVersion !== 2) {
|
|
51
|
-
// v1 Hub
|
|
51
|
+
// Either a v1 Hub, or a manifest-announced registration still awaiting
|
|
52
|
+
// approval: both hand back credentials and nothing to persist, because
|
|
53
|
+
// trust is minted with the generation an approved ceiling creates.
|
|
52
54
|
return {
|
|
53
55
|
privosUrl: input.privosUrl,
|
|
54
56
|
clientId: input.clientId,
|
|
55
57
|
clientSecret: input.clientSecret,
|
|
56
58
|
mcpAppId: input.mcpAppId,
|
|
59
|
+
...(input.awaitingApproval ? { awaitingApproval: true } : {}),
|
|
57
60
|
};
|
|
58
61
|
}
|
|
59
62
|
assertRuntimeDispatchTrustConfigurationV3(input.trust);
|
|
@@ -97,6 +100,7 @@ export function pairOverWebSocket(pairUrl, appMeta, WebSocketImpl = WebSocket, o
|
|
|
97
100
|
...(appMeta.icon && { icon: appMeta.icon }),
|
|
98
101
|
...(appMeta.scopes?.length && { scopes: appMeta.scopes }),
|
|
99
102
|
...(appMeta.permissions?.length && { permissions: appMeta.permissions }),
|
|
103
|
+
...(appMeta.manifest !== undefined && { manifest: appMeta.manifest }),
|
|
100
104
|
}));
|
|
101
105
|
}
|
|
102
106
|
catch (err) {
|
|
@@ -111,7 +115,7 @@ export function pairOverWebSocket(pairUrl, appMeta, WebSocketImpl = WebSocket, o
|
|
|
111
115
|
return;
|
|
112
116
|
}
|
|
113
117
|
if (msg.result?.paired) {
|
|
114
|
-
const { clientId, clientSecret, relayUrl, app, mcpAppId, appId, pairingVersion, trust, fingerprint } = msg.result;
|
|
118
|
+
const { clientId, clientSecret, relayUrl, app, mcpAppId, appId, pairingVersion, trust, fingerprint, awaitingApproval } = msg.result;
|
|
115
119
|
if (!clientId || !clientSecret || !relayUrl) {
|
|
116
120
|
settle(() => reject(new Error('Pairing response missing credentials')));
|
|
117
121
|
return;
|
|
@@ -132,6 +136,7 @@ export function pairOverWebSocket(pairUrl, appMeta, WebSocketImpl = WebSocket, o
|
|
|
132
136
|
pairingVersion,
|
|
133
137
|
trust,
|
|
134
138
|
fingerprint,
|
|
139
|
+
awaitingApproval: awaitingApproval === true,
|
|
135
140
|
})
|
|
136
141
|
.then(resolve)
|
|
137
142
|
.catch(reject);
|