@agenthifive/openclaw 0.1.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.
Files changed (65) hide show
  1. package/README.md +124 -0
  2. package/dist/client.d.ts +27 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +136 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/index.d.ts +16 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +23 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/jwt-utils.d.ts +29 -0
  11. package/dist/jwt-utils.d.ts.map +1 -0
  12. package/dist/jwt-utils.js +55 -0
  13. package/dist/jwt-utils.js.map +1 -0
  14. package/dist/patch-verify.d.ts +28 -0
  15. package/dist/patch-verify.d.ts.map +1 -0
  16. package/dist/patch-verify.js +72 -0
  17. package/dist/patch-verify.js.map +1 -0
  18. package/dist/pending-approvals.d.ts +55 -0
  19. package/dist/pending-approvals.d.ts.map +1 -0
  20. package/dist/pending-approvals.js +95 -0
  21. package/dist/pending-approvals.js.map +1 -0
  22. package/dist/prompt-reference.d.ts +51 -0
  23. package/dist/prompt-reference.d.ts.map +1 -0
  24. package/dist/prompt-reference.js +645 -0
  25. package/dist/prompt-reference.js.map +1 -0
  26. package/dist/register.d.ts +20 -0
  27. package/dist/register.d.ts.map +1 -0
  28. package/dist/register.js +551 -0
  29. package/dist/register.js.map +1 -0
  30. package/dist/runtime.d.ts +66 -0
  31. package/dist/runtime.d.ts.map +1 -0
  32. package/dist/runtime.js +87 -0
  33. package/dist/runtime.js.map +1 -0
  34. package/dist/session-context.d.ts +39 -0
  35. package/dist/session-context.d.ts.map +1 -0
  36. package/dist/session-context.js +58 -0
  37. package/dist/session-context.js.map +1 -0
  38. package/dist/setup-wizard.d.ts +28 -0
  39. package/dist/setup-wizard.d.ts.map +1 -0
  40. package/dist/setup-wizard.js +303 -0
  41. package/dist/setup-wizard.js.map +1 -0
  42. package/dist/tools.d.ts +27 -0
  43. package/dist/tools.d.ts.map +1 -0
  44. package/dist/tools.js +128 -0
  45. package/dist/tools.js.map +1 -0
  46. package/dist/types.d.ts +93 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/vault-action-proxy.d.ts +75 -0
  51. package/dist/vault-action-proxy.d.ts.map +1 -0
  52. package/dist/vault-action-proxy.js +152 -0
  53. package/dist/vault-action-proxy.js.map +1 -0
  54. package/dist/vault-provider.d.ts +52 -0
  55. package/dist/vault-provider.d.ts.map +1 -0
  56. package/dist/vault-provider.js +37 -0
  57. package/dist/vault-provider.js.map +1 -0
  58. package/dist/vault-token-manager.d.ts +42 -0
  59. package/dist/vault-token-manager.d.ts.map +1 -0
  60. package/dist/vault-token-manager.js +124 -0
  61. package/dist/vault-token-manager.js.map +1 -0
  62. package/openclaw.plugin.json +59 -0
  63. package/package.json +58 -0
  64. package/patches/README.md +85 -0
  65. package/patches/model-auth.patch +44 -0
package/dist/tools.js ADDED
@@ -0,0 +1,128 @@
1
+ const DEFAULT_POLL_TIMEOUT_MS = 300_000; // 5 minutes
2
+ const DEFAULT_POLL_INTERVAL_MS = 5_000; // 5 seconds
3
+ /**
4
+ * Executes an operation via the Vault's Model B brokered proxy.
5
+ * Returns the execution result or approval requirement.
6
+ */
7
+ export async function execute(client, input) {
8
+ const requestBody = {
9
+ model: "B",
10
+ method: input.method,
11
+ url: input.url,
12
+ };
13
+ if (input.connectionId)
14
+ requestBody.connectionId = input.connectionId;
15
+ if (input.service)
16
+ requestBody.service = input.service;
17
+ if (input.query)
18
+ requestBody.query = input.query;
19
+ if (input.headers)
20
+ requestBody.headers = input.headers;
21
+ if (input.body !== undefined)
22
+ requestBody.body = input.body;
23
+ if (input.approvalId)
24
+ requestBody.approvalId = input.approvalId;
25
+ const response = await client.post("/vault/execute", requestBody);
26
+ if (response.approvalRequired) {
27
+ return {
28
+ approvalRequired: true,
29
+ approvalRequestId: response.approvalRequestId ?? "",
30
+ auditId: response.auditId ?? "",
31
+ };
32
+ }
33
+ return {
34
+ status: response.status ?? 0,
35
+ headers: response.headers ?? {},
36
+ body: response.body,
37
+ auditId: response.auditId ?? "",
38
+ };
39
+ }
40
+ /**
41
+ * Creates a step-up approval request.
42
+ * The user must approve before the action is executed.
43
+ */
44
+ export async function approvalRequest(client, input) {
45
+ // Send a Model B execute request that will trigger step-up approval.
46
+ // The Vault will detect the write method and create an approval request.
47
+ const requestBody = {
48
+ model: "B",
49
+ connectionId: input.connectionId,
50
+ method: input.method,
51
+ url: input.url,
52
+ };
53
+ if (input.body !== undefined)
54
+ requestBody.body = input.body;
55
+ const response = await client.post("/vault/execute", requestBody);
56
+ if (!response.approvalRequired) {
57
+ throw new Error("Expected approval requirement but request was executed directly");
58
+ }
59
+ return {
60
+ approvalRequestId: response.approvalRequestId,
61
+ auditId: response.auditId,
62
+ };
63
+ }
64
+ /**
65
+ * Polls approval status until approved/denied/expired or timeout.
66
+ * On approval, the caller should re-submit the original request
67
+ * with the approvalId to execute it.
68
+ */
69
+ export async function approvalCommit(client, input, pollTimeoutMs = DEFAULT_POLL_TIMEOUT_MS, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS) {
70
+ const timeout = input.timeoutMs ?? pollTimeoutMs;
71
+ const deadline = Date.now() + timeout;
72
+ while (Date.now() < deadline) {
73
+ // Check approval status
74
+ const approvals = await client.get("/approvals");
75
+ const approval = approvals.approvals.find((a) => a.id === input.approvalRequestId);
76
+ if (!approval) {
77
+ throw new Error(`Approval request ${input.approvalRequestId} not found`);
78
+ }
79
+ switch (approval.status) {
80
+ case "approved": {
81
+ // Approval granted — return a signal to the caller.
82
+ // The caller should re-submit the original request with approvalId
83
+ // via execute() to actually perform the operation.
84
+ return {
85
+ status: 200,
86
+ headers: {},
87
+ body: { approved: true, approvalRequestId: input.approvalRequestId },
88
+ auditId: "",
89
+ };
90
+ }
91
+ case "consumed":
92
+ throw new Error("Approval request has already been used");
93
+ case "denied":
94
+ throw new Error("Approval request was denied by the user");
95
+ case "expired":
96
+ throw new Error("Approval request expired");
97
+ case "pending":
98
+ // Continue polling
99
+ break;
100
+ default:
101
+ throw new Error(`Unexpected approval status: ${approval.status}`);
102
+ }
103
+ await sleep(pollIntervalMs);
104
+ }
105
+ throw new Error(`Approval wait timed out after ${timeout}ms`);
106
+ }
107
+ /**
108
+ * Lists all connections for the current workspace.
109
+ */
110
+ export async function connectionsList(client) {
111
+ const response = await client.get("/connections");
112
+ return { connections: response.connections };
113
+ }
114
+ /**
115
+ * Revokes a connection immediately.
116
+ */
117
+ export async function connectionRevoke(client, input) {
118
+ const response = await client.post(`/connections/${encodeURIComponent(input.connectionId)}/revoke`);
119
+ return {
120
+ revoked: true,
121
+ connectionId: response.connection.id,
122
+ auditId: response.auditId,
123
+ };
124
+ }
125
+ function sleep(ms) {
126
+ return new Promise((resolve) => setTimeout(resolve, ms));
127
+ }
128
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAeA,MAAM,uBAAuB,GAAG,OAAO,CAAC,CAAC,YAAY;AACrD,MAAM,wBAAwB,GAAG,KAAK,CAAC,CAAC,YAAY;AAEpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAmB,EACnB,KAAmB;IAcnB,MAAM,WAAW,GAA4B;QAC3C,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC;IACF,IAAI,KAAK,CAAC,YAAY;QAAE,WAAW,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;IACtE,IAAI,KAAK,CAAC,OAAO;QAAE,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IACvD,IAAI,KAAK,CAAC,KAAK;QAAE,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACjD,IAAI,KAAK,CAAC,OAAO;QAAE,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IACvD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAC5D,IAAI,KAAK,CAAC,UAAU;QAAE,WAAW,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAEhE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAuB,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAExF,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC9B,OAAO;YACL,gBAAgB,EAAE,IAAI;YACtB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,IAAI,EAAE;YACnD,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;SAChC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;QAC5B,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;QAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;KAChC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAmB,EACnB,KAA2B;IAE3B,qEAAqE;IACrE,yEAAyE;IACzE,MAAM,WAAW,GAA4B;QAC3C,KAAK,EAAE,GAAG;QACV,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,WAAW,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAQ5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAmB,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAEpF,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IAED,OAAO;QACL,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,OAAO,EAAE,QAAQ,CAAC,OAAO;KAC1B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAmB,EACnB,KAA0B,EAC1B,gBAAwB,uBAAuB,EAC/C,iBAAyB,wBAAwB;IAEjD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,IAAI,aAAa,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAYtC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,wBAAwB;QACxB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAoB,YAAY,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAEnF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,iBAAiB,YAAY,CAAC,CAAC;QAC3E,CAAC;QAED,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;YACxB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,oDAAoD;gBACpD,mEAAmE;gBACnE,mDAAmD;gBACnD,OAAO;oBACL,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,EAAE;oBACX,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE;oBACpE,OAAO,EAAE,EAAE;iBACZ,CAAC;YACJ,CAAC;YACD,KAAK,UAAU;gBACb,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,KAAK,QAAQ;gBACX,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC7D,KAAK,SAAS;gBACZ,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,KAAK,SAAS;gBACZ,mBAAmB;gBACnB,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAmB;IAMnB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAsB,cAAc,CAAC,CAAC;IACvE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAmB,EACnB,KAA4B;IAO5B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAChC,gBAAgB,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAChE,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpC,OAAO,EAAE,QAAQ,CAAC,OAAO;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * OpenClaw Gateway plugin configuration.
3
+ */
4
+ export interface OpenClawPluginConfig {
5
+ /** AgentHiFive Vault API base URL (e.g., "https://vault.example.com") */
6
+ baseUrl: string;
7
+ /** Authentication mode for Vault API */
8
+ auth: OpenClawAuthConfig;
9
+ /** Default timeout for polling operations in milliseconds (default: 300_000 = 5 min) */
10
+ pollTimeoutMs?: number;
11
+ /** Polling interval for approval in milliseconds (default: 5_000) */
12
+ pollIntervalMs?: number;
13
+ }
14
+ export type OpenClawAuthConfig = {
15
+ mode: "agent";
16
+ privateKey: JsonWebKey;
17
+ agentId: string;
18
+ tokenAudience?: string;
19
+ } | {
20
+ mode: "bearer";
21
+ token: string;
22
+ };
23
+ /**
24
+ * Tool input/output types.
25
+ */
26
+ export interface ExecuteInput {
27
+ connectionId?: string;
28
+ service?: string;
29
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
30
+ url: string;
31
+ query?: Record<string, string>;
32
+ headers?: Record<string, string>;
33
+ body?: unknown;
34
+ /** Approval request ID to bypass a require_approval guard (from a previous 202 response). */
35
+ approvalId?: string;
36
+ }
37
+ export interface ExecuteOutput {
38
+ status: number;
39
+ headers: Record<string, string>;
40
+ body: unknown;
41
+ auditId: string;
42
+ }
43
+ export interface ExecuteApprovalOutput {
44
+ approvalRequired: true;
45
+ approvalRequestId: string;
46
+ auditId: string;
47
+ }
48
+ export interface ApprovalRequestInput {
49
+ connectionId: string;
50
+ actionDescription: string;
51
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
52
+ url: string;
53
+ body?: unknown;
54
+ }
55
+ export interface ApprovalRequestOutput {
56
+ approvalRequestId: string;
57
+ auditId: string;
58
+ }
59
+ export interface ApprovalCommitInput {
60
+ approvalRequestId: string;
61
+ timeoutMs?: number;
62
+ }
63
+ export interface ApprovalCommitOutput {
64
+ status: number;
65
+ headers: Record<string, string>;
66
+ body: unknown;
67
+ auditId: string;
68
+ }
69
+ export interface ConnectionListItem {
70
+ id: string;
71
+ provider: string;
72
+ label: string;
73
+ status: string;
74
+ grantedScopes: string[];
75
+ createdAt: string;
76
+ }
77
+ export interface ConnectionsListOutput {
78
+ connections: ConnectionListItem[];
79
+ }
80
+ export interface ConnectionRevokeInput {
81
+ connectionId: string;
82
+ }
83
+ export interface ConnectionRevokeOutput {
84
+ revoked: true;
85
+ connectionId: string;
86
+ auditId: string;
87
+ }
88
+ export type { ActionProxy, ProxyRequest, ProxyResponse, } from "./vault-action-proxy.js";
89
+ export type { CredentialProvider, CredentialQuery, CredentialResult, VaultProviderConfig, } from "./vault-provider.js";
90
+ export type { VaultTokenManagerConfig } from "./vault-token-manager.js";
91
+ export type { SessionContext } from "./session-context.js";
92
+ export type { PendingApproval, FallbackNotification, PluginLogger, } from "./pending-approvals.js";
93
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Action proxy abstraction and AgentHiFive Vault implementation.
3
+ *
4
+ * When configured, routes outgoing API calls through the AgentHiFive vault
5
+ * proxy (Model B: brokered proxy) instead of calling provider APIs directly.
6
+ * This enables content filtering, action allowlists, rate limiting, and audit.
7
+ */
8
+ export type ProxyRequest = {
9
+ /** Which connection/credential to use (required for multi-account services) */
10
+ connectionId?: string;
11
+ /** Service ID for singleton services — vault resolves the connection server-side */
12
+ service?: string;
13
+ /** Target provider API */
14
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
15
+ url: string;
16
+ headers?: Record<string, string>;
17
+ body?: unknown;
18
+ /** Redeem a previously approved step-up approval */
19
+ approvalId?: string;
20
+ /** Context for policy evaluation */
21
+ context?: {
22
+ tool: string;
23
+ action: string;
24
+ channel?: string;
25
+ agentId?: string;
26
+ };
27
+ };
28
+ export type ProxyResponse = {
29
+ status: number;
30
+ headers: Record<string, string>;
31
+ body: unknown;
32
+ auditId: string;
33
+ /** If blocked by policy or auth failure, this explains why */
34
+ blocked?: {
35
+ reason: string;
36
+ policy: string;
37
+ /** Actionable hint for the AI agent — tells it how to fix the issue */
38
+ hint?: string;
39
+ /** Present when policy is "step-up-approval" — use to poll and redeem */
40
+ approvalRequestId?: string;
41
+ };
42
+ };
43
+ export interface ActionProxy {
44
+ execute(request: ProxyRequest, signal?: AbortSignal): Promise<ProxyResponse>;
45
+ }
46
+ type VaultActionProxyConfig = {
47
+ baseUrl: string;
48
+ auth: {
49
+ mode: "bearer";
50
+ token: string;
51
+ };
52
+ timeoutMs: number;
53
+ /** Called on 401 to attempt a token refresh. Returns true if refresh succeeded. */
54
+ onTokenRefresh?: () => Promise<boolean>;
55
+ };
56
+ /**
57
+ * Action proxy backed by AgentHiFive Vault.
58
+ *
59
+ * Routes API calls through POST /v1/vault/execute (Model B: brokered proxy).
60
+ * The vault adds the credential (Authorization header), evaluates policies,
61
+ * executes the request, and returns the response with an audit ID.
62
+ */
63
+ export declare class VaultActionProxy implements ActionProxy {
64
+ private config;
65
+ constructor(config: VaultActionProxyConfig);
66
+ execute(request: ProxyRequest, callerSignal?: AbortSignal): Promise<ProxyResponse>;
67
+ /** Vault base URL — used by the approval poller to call GET /v1/approvals/:id */
68
+ get baseUrl(): string;
69
+ /** Build auth header with current bearer token */
70
+ buildAuthHeader(): Record<string, string>;
71
+ /** Force a token refresh. Returns true if the token was successfully refreshed. */
72
+ refreshToken(): Promise<boolean>;
73
+ }
74
+ export {};
75
+ //# sourceMappingURL=vault-action-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-action-proxy.d.ts","sourceRoot":"","sources":["../src/vault-action-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,MAAM,YAAY,GAAG;IACzB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,uEAAuE;QACvE,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,yEAAyE;QACzE,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC9E;AAMD,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,MAAM,CAAyB;gBAE3B,MAAM,EAAE,sBAAsB;IAIpC,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAqIxF,iFAAiF;IACjF,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,kDAAkD;IAClD,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIzC,mFAAmF;IAC7E,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAMvC"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Action proxy abstraction and AgentHiFive Vault implementation.
3
+ *
4
+ * When configured, routes outgoing API calls through the AgentHiFive vault
5
+ * proxy (Model B: brokered proxy) instead of calling provider APIs directly.
6
+ * This enables content filtering, action allowlists, rate limiting, and audit.
7
+ */
8
+ /**
9
+ * Action proxy backed by AgentHiFive Vault.
10
+ *
11
+ * Routes API calls through POST /v1/vault/execute (Model B: brokered proxy).
12
+ * The vault adds the credential (Authorization header), evaluates policies,
13
+ * executes the request, and returns the response with an audit ID.
14
+ */
15
+ export class VaultActionProxy {
16
+ config;
17
+ constructor(config) {
18
+ this.config = config;
19
+ }
20
+ async execute(request, callerSignal) {
21
+ const vaultBody = {
22
+ model: "B",
23
+ method: request.method,
24
+ url: request.url,
25
+ headers: request.headers,
26
+ body: request.body,
27
+ ...(request.context ? { context: request.context } : {}),
28
+ };
29
+ if (request.service) {
30
+ vaultBody.service = request.service;
31
+ }
32
+ if (request.connectionId) {
33
+ vaultBody.connectionId = request.connectionId;
34
+ }
35
+ if (request.approvalId) {
36
+ vaultBody.approvalId = request.approvalId;
37
+ }
38
+ // Combine our own timeout with the caller's abort signal (if any).
39
+ const timeoutSignal = AbortSignal.timeout(this.config.timeoutMs);
40
+ const signal = callerSignal ? AbortSignal.any([timeoutSignal, callerSignal]) : timeoutSignal;
41
+ const doFetch = () => fetch(`${this.config.baseUrl}/v1/vault/execute`, {
42
+ method: "POST",
43
+ headers: {
44
+ "Content-Type": "application/json",
45
+ ...this.buildAuthHeader(),
46
+ },
47
+ body: JSON.stringify(vaultBody),
48
+ signal,
49
+ });
50
+ let response = await doFetch();
51
+ // 401 = token expired — try refreshing once before giving up
52
+ if (response.status === 401 && this.config.onTokenRefresh) {
53
+ const refreshed = await this.config.onTokenRefresh();
54
+ if (refreshed) {
55
+ response = await doFetch();
56
+ }
57
+ }
58
+ // 401 = authentication failure
59
+ if (response.status === 401) {
60
+ const tokenPrefix = this.config.auth.token?.slice(0, 4) || "empty";
61
+ console.warn(`[vault-action-proxy] 401 on POST /v1/vault/execute (token: ${tokenPrefix}..., ` +
62
+ `service: ${request.service ?? "n/a"}, url: ${request.url})`);
63
+ return {
64
+ status: 401,
65
+ headers: {},
66
+ body: null,
67
+ auditId: "",
68
+ blocked: {
69
+ reason: "Vault authentication failed — the agent's access token is invalid or expired.",
70
+ policy: "vault-auth",
71
+ hint: "The vault connection is broken. Ask your admin to generate a bootstrap secret from the AgentHiFive dashboard (Agents → Bootstrap Secret), then run `openclaw configure` to reconnect.",
72
+ },
73
+ };
74
+ }
75
+ // Guard against non-JSON responses
76
+ const contentType = response.headers.get("content-type") ?? "";
77
+ if (!contentType.includes("application/json") && !response.ok) {
78
+ const text = await response.text();
79
+ const preview = text.slice(0, 120).replace(/\n/g, " ");
80
+ throw new Error(`Vault returned HTTP ${response.status} with non-JSON body (${contentType || "no content-type"}): ${preview}`);
81
+ }
82
+ const result = (await response.json());
83
+ // Policy block
84
+ if (result["blocked"]) {
85
+ return {
86
+ status: 0,
87
+ headers: {},
88
+ body: null,
89
+ auditId: result["auditId"] ?? "",
90
+ blocked: {
91
+ reason: result["reason"] ?? "Blocked by policy",
92
+ policy: result["policy"] ?? "unknown",
93
+ },
94
+ };
95
+ }
96
+ // 202 = step-up approval required
97
+ if (response.status === 202 && result["approvalRequired"]) {
98
+ const approvalRequestId = result["approvalRequestId"] ?? undefined;
99
+ const blocked = {
100
+ reason: result["hint"] ?? "This request requires human approval.",
101
+ policy: "step-up-approval",
102
+ };
103
+ if (approvalRequestId) {
104
+ blocked.hint = `Approval required. approvalRequestId: ${approvalRequestId}`;
105
+ blocked.approvalRequestId = approvalRequestId;
106
+ }
107
+ return {
108
+ status: 202,
109
+ headers: {},
110
+ body: null,
111
+ auditId: result["auditId"] ?? "",
112
+ blocked,
113
+ };
114
+ }
115
+ // 403 = policy denial
116
+ if (response.status === 403) {
117
+ return {
118
+ status: 403,
119
+ headers: {},
120
+ body: null,
121
+ auditId: result["auditId"] ?? "",
122
+ blocked: {
123
+ reason: result["error"] ?? "Denied by policy",
124
+ policy: "vault-policy",
125
+ },
126
+ };
127
+ }
128
+ // Success
129
+ return {
130
+ status: result["status"] ?? response.status,
131
+ headers: result["headers"] ?? {},
132
+ body: result["body"] ?? null,
133
+ auditId: result["auditId"] ?? "",
134
+ };
135
+ }
136
+ /** Vault base URL — used by the approval poller to call GET /v1/approvals/:id */
137
+ get baseUrl() {
138
+ return this.config.baseUrl;
139
+ }
140
+ /** Build auth header with current bearer token */
141
+ buildAuthHeader() {
142
+ return { Authorization: `Bearer ${this.config.auth.token}` };
143
+ }
144
+ /** Force a token refresh. Returns true if the token was successfully refreshed. */
145
+ async refreshToken() {
146
+ if (!this.config.onTokenRefresh) {
147
+ return false;
148
+ }
149
+ return this.config.onTokenRefresh();
150
+ }
151
+ }
152
+ //# sourceMappingURL=vault-action-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-action-proxy.js","sourceRoot":"","sources":["../src/vault-action-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Credential provider backed by AgentHiFive Vault.
3
+ *
4
+ * resolve() always returns null — all credential access goes through
5
+ * vault/execute (Model B) or vault/llm proxy. The class is kept for
6
+ * isAvailable(), getConfig(), and buildAuthHeaders() used by capability
7
+ * cache and permission request modules.
8
+ */
9
+ export type CredentialQuery = {
10
+ provider: string;
11
+ scopes?: string[];
12
+ };
13
+ export type CredentialResult = {
14
+ token: string;
15
+ expiresAt?: number;
16
+ };
17
+ export interface CredentialProvider {
18
+ readonly id: string;
19
+ resolve(query: CredentialQuery): Promise<CredentialResult | null>;
20
+ isAvailable(): Promise<boolean>;
21
+ }
22
+ export type VaultProviderConfig = {
23
+ baseUrl: string;
24
+ auth: {
25
+ mode: "bearer";
26
+ token: string;
27
+ };
28
+ timeoutMs: number;
29
+ cacheTtlMs: number;
30
+ /** Providers proxied through AH5 — skip credential resolution for these */
31
+ proxiedProviders?: string[];
32
+ /** Capability checking and permission request configuration */
33
+ capabilities?: {
34
+ enabled: boolean;
35
+ cacheTtl?: number;
36
+ permissionRequest?: {
37
+ enabled: boolean;
38
+ };
39
+ };
40
+ /** Called on 401 to attempt a token refresh. Returns true if refresh succeeded. */
41
+ onTokenRefresh?: () => Promise<boolean>;
42
+ };
43
+ export declare class VaultCredentialProvider implements CredentialProvider {
44
+ readonly id = "agenthifive-vault";
45
+ private config;
46
+ constructor(config: VaultProviderConfig);
47
+ resolve(_query: CredentialQuery): Promise<CredentialResult | null>;
48
+ isAvailable(): Promise<boolean>;
49
+ getConfig(): VaultProviderConfig;
50
+ buildAuthHeaders(): Record<string, string>;
51
+ }
52
+ //# sourceMappingURL=vault-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-provider.d.ts","sourceRoot":"","sources":["../src/vault-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAClE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAMD,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,+DAA+D;IAC/D,YAAY,CAAC,EAAE;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,iBAAiB,CAAC,EAAE;YAClB,OAAO,EAAE,OAAO,CAAC;SAClB,CAAC;KACH,CAAC;IACF,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC,CAAC;AAEF,qBAAa,uBAAwB,YAAW,kBAAkB;IAChE,QAAQ,CAAC,EAAE,uBAAuB;IAElC,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIjC,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAKlE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAWrC,SAAS,IAAI,mBAAmB;IAIhC,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAG3C"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Credential provider backed by AgentHiFive Vault.
3
+ *
4
+ * resolve() always returns null — all credential access goes through
5
+ * vault/execute (Model B) or vault/llm proxy. The class is kept for
6
+ * isAvailable(), getConfig(), and buildAuthHeaders() used by capability
7
+ * cache and permission request modules.
8
+ */
9
+ export class VaultCredentialProvider {
10
+ id = "agenthifive-vault";
11
+ config;
12
+ constructor(config) {
13
+ this.config = config;
14
+ }
15
+ async resolve(_query) {
16
+ // All credential resolution goes through vault/execute (Model B) or vault/llm proxy.
17
+ return null;
18
+ }
19
+ async isAvailable() {
20
+ try {
21
+ const response = await fetch(`${this.config.baseUrl}/v1/health`, {
22
+ signal: AbortSignal.timeout(2000),
23
+ });
24
+ return response.ok;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ getConfig() {
31
+ return this.config;
32
+ }
33
+ buildAuthHeaders() {
34
+ return { Authorization: `Bearer ${this.config.auth.token}` };
35
+ }
36
+ }
37
+ //# sourceMappingURL=vault-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-provider.js","sourceRoot":"","sources":["../src/vault-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6CH,MAAM,OAAO,uBAAuB;IACzB,EAAE,GAAG,mBAAmB,CAAC;IAE1B,MAAM,CAAsB;IAEpC,YAAY,MAA2B;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAuB;QACnC,qFAAqF;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,YAAY,EAAE;gBAC/D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,gBAAgB;QACd,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IAC/D,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ export type VaultTokenManagerConfig = {
2
+ baseUrl: string;
3
+ agentId: string;
4
+ privateKey: JsonWebKey;
5
+ tokenAudience?: string;
6
+ };
7
+ export declare class VaultTokenManager {
8
+ private readonly baseUrl;
9
+ private readonly agentId;
10
+ private readonly privateKeyJWK;
11
+ private readonly tokenAudience;
12
+ private privateKeyObj;
13
+ private accessToken;
14
+ private tokenExpiresAt;
15
+ private refreshTimer;
16
+ private refreshInFlight;
17
+ /** Called after every successful token refresh with the new token. */
18
+ onRefresh: ((newToken: string) => void) | null;
19
+ /** Called when token refresh fails with 401 — indicates the agent's key is no longer valid. */
20
+ onAuthFailure: (() => void) | null;
21
+ constructor(config: VaultTokenManagerConfig);
22
+ /**
23
+ * Perform the initial token exchange and start the background refresh timer.
24
+ * Must be called (and awaited) before getToken().
25
+ */
26
+ init(): Promise<void>;
27
+ /**
28
+ * Get the current bearer token. Synchronous — relies on background refresh.
29
+ * Throws if init() hasn't been called.
30
+ */
31
+ getToken(): string;
32
+ /** Stop the background refresh timer. */
33
+ stop(): void;
34
+ /**
35
+ * Force an immediate token refresh. Called on-demand when a 401 is received.
36
+ * Coalesces concurrent requests — if a refresh is already in flight, callers
37
+ * wait for the same promise instead of hammering the token endpoint.
38
+ */
39
+ forceRefresh(): Promise<boolean>;
40
+ private refreshToken;
41
+ }
42
+ //# sourceMappingURL=vault-token-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-token-manager.d.ts","sourceRoot":"","sources":["../src/vault-token-manager.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,eAAe,CAA8B;IAErD,sEAAsE;IACtE,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEtD,+FAA+F;IAC/F,aAAa,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAQ;gBAE9B,MAAM,EAAE,uBAAuB;IAO3C;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3B;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAOlB,yCAAyC;IACzC,IAAI,IAAI,IAAI;IAOZ;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;YAsBxB,YAAY;CAqC3B"}