@trustloopguard/sdk 0.0.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.
Files changed (242) hide show
  1. package/dist/client.d.ts +98 -0
  2. package/dist/client.js +198 -0
  3. package/dist/errors.d.ts +46 -0
  4. package/dist/errors.js +187 -0
  5. package/dist/generated/AgentAuthority.d.ts +4 -0
  6. package/dist/generated/AgentAuthority.js +2 -0
  7. package/dist/generated/AgentListResponse.d.ts +4 -0
  8. package/dist/generated/AgentListResponse.js +1 -0
  9. package/dist/generated/AgentProfile.d.ts +29 -0
  10. package/dist/generated/AgentProfile.js +1 -0
  11. package/dist/generated/AgentScope.d.ts +4 -0
  12. package/dist/generated/AgentScope.js +2 -0
  13. package/dist/generated/AgentTone.d.ts +4 -0
  14. package/dist/generated/AgentTone.js +2 -0
  15. package/dist/generated/ApiError.d.ts +25 -0
  16. package/dist/generated/ApiError.js +1 -0
  17. package/dist/generated/ApiErrorCode.d.ts +6 -0
  18. package/dist/generated/ApiErrorCode.js +2 -0
  19. package/dist/generated/ApiKeyBatchRevokeRequest.d.ts +3 -0
  20. package/dist/generated/ApiKeyBatchRevokeRequest.js +2 -0
  21. package/dist/generated/ApiKeyBatchRevokeResponse.d.ts +4 -0
  22. package/dist/generated/ApiKeyBatchRevokeResponse.js +1 -0
  23. package/dist/generated/ApiKeyListResponse.d.ts +4 -0
  24. package/dist/generated/ApiKeyListResponse.js +1 -0
  25. package/dist/generated/AuthRequest.d.ts +15 -0
  26. package/dist/generated/AuthRequest.js +2 -0
  27. package/dist/generated/AuthResponse.d.ts +16 -0
  28. package/dist/generated/AuthResponse.js +2 -0
  29. package/dist/generated/ChangePasswordRequest.d.ts +15 -0
  30. package/dist/generated/ChangePasswordRequest.js +2 -0
  31. package/dist/generated/Channel.d.ts +8 -0
  32. package/dist/generated/Channel.js +2 -0
  33. package/dist/generated/CheckRequest.d.ts +21 -0
  34. package/dist/generated/CheckRequest.js +1 -0
  35. package/dist/generated/CreateApiKeyRequest.d.ts +3 -0
  36. package/dist/generated/CreateApiKeyRequest.js +2 -0
  37. package/dist/generated/CreateApiKeyResponse.d.ts +8 -0
  38. package/dist/generated/CreateApiKeyResponse.js +1 -0
  39. package/dist/generated/CreateInviteRequest.d.ts +8 -0
  40. package/dist/generated/CreateInviteRequest.js +1 -0
  41. package/dist/generated/CreateInviteResponse.d.ts +18 -0
  42. package/dist/generated/CreateInviteResponse.js +1 -0
  43. package/dist/generated/CreateKnowledgeSourceRequest.d.ts +9 -0
  44. package/dist/generated/CreateKnowledgeSourceRequest.js +1 -0
  45. package/dist/generated/CreateRunEventRequest.d.ts +13 -0
  46. package/dist/generated/CreateRunEventRequest.js +1 -0
  47. package/dist/generated/CreateRunRequest.d.ts +9 -0
  48. package/dist/generated/CreateRunRequest.js +1 -0
  49. package/dist/generated/CreateWorkspaceRequest.d.ts +7 -0
  50. package/dist/generated/CreateWorkspaceRequest.js +2 -0
  51. package/dist/generated/DashboardApiKey.d.ts +15 -0
  52. package/dist/generated/DashboardApiKey.js +2 -0
  53. package/dist/generated/DashboardKnowledgeSourceKind.d.ts +1 -0
  54. package/dist/generated/DashboardKnowledgeSourceKind.js +2 -0
  55. package/dist/generated/Decision.d.ts +17 -0
  56. package/dist/generated/Decision.js +1 -0
  57. package/dist/generated/GuardrailGenerateResponse.d.ts +11 -0
  58. package/dist/generated/GuardrailGenerateResponse.js +1 -0
  59. package/dist/generated/GuardrailListResponse.d.ts +7 -0
  60. package/dist/generated/GuardrailListResponse.js +1 -0
  61. package/dist/generated/InviteListResponse.d.ts +4 -0
  62. package/dist/generated/InviteListResponse.js +1 -0
  63. package/dist/generated/InviteStatus.d.ts +4 -0
  64. package/dist/generated/InviteStatus.js +2 -0
  65. package/dist/generated/KnowledgeFileInput.d.ts +5 -0
  66. package/dist/generated/KnowledgeFileInput.js +2 -0
  67. package/dist/generated/KnowledgeFileMetadata.d.ts +6 -0
  68. package/dist/generated/KnowledgeFileMetadata.js +2 -0
  69. package/dist/generated/KnowledgeSource.d.ts +7 -0
  70. package/dist/generated/KnowledgeSource.js +1 -0
  71. package/dist/generated/KnowledgeSourceDocument.d.ts +22 -0
  72. package/dist/generated/KnowledgeSourceDocument.js +1 -0
  73. package/dist/generated/KnowledgeSourceFileResponse.d.ts +6 -0
  74. package/dist/generated/KnowledgeSourceFileResponse.js +2 -0
  75. package/dist/generated/KnowledgeSourceKind.d.ts +1 -0
  76. package/dist/generated/KnowledgeSourceKind.js +2 -0
  77. package/dist/generated/KnowledgeSourceListResponse.d.ts +4 -0
  78. package/dist/generated/KnowledgeSourceListResponse.js +1 -0
  79. package/dist/generated/KnowledgeSourceStatus.d.ts +1 -0
  80. package/dist/generated/KnowledgeSourceStatus.js +2 -0
  81. package/dist/generated/MemberListResponse.d.ts +4 -0
  82. package/dist/generated/MemberListResponse.js +1 -0
  83. package/dist/generated/MyWorkspace.d.ts +12 -0
  84. package/dist/generated/MyWorkspace.js +1 -0
  85. package/dist/generated/MyWorkspacesResponse.d.ts +4 -0
  86. package/dist/generated/MyWorkspacesResponse.js +1 -0
  87. package/dist/generated/PolicyAction.d.ts +4 -0
  88. package/dist/generated/PolicyAction.js +2 -0
  89. package/dist/generated/PolicyBatchSetEnabledRequest.d.ts +4 -0
  90. package/dist/generated/PolicyBatchSetEnabledRequest.js +2 -0
  91. package/dist/generated/PolicyBatchSetEnabledResponse.d.ts +4 -0
  92. package/dist/generated/PolicyBatchSetEnabledResponse.js +1 -0
  93. package/dist/generated/PolicyDocument.d.ts +8 -0
  94. package/dist/generated/PolicyDocument.js +1 -0
  95. package/dist/generated/PolicyDraft.d.ts +17 -0
  96. package/dist/generated/PolicyDraft.js +1 -0
  97. package/dist/generated/PolicyDraftRequest.d.ts +6 -0
  98. package/dist/generated/PolicyDraftRequest.js +2 -0
  99. package/dist/generated/PolicyDraftResponse.d.ts +4 -0
  100. package/dist/generated/PolicyDraftResponse.js +1 -0
  101. package/dist/generated/PolicyListResponse.d.ts +4 -0
  102. package/dist/generated/PolicyListResponse.js +1 -0
  103. package/dist/generated/PolicyMatchType.d.ts +5 -0
  104. package/dist/generated/PolicyMatchType.js +2 -0
  105. package/dist/generated/PolicySetEnabledRequest.d.ts +3 -0
  106. package/dist/generated/PolicySetEnabledRequest.js +2 -0
  107. package/dist/generated/PolicySummary.d.ts +9 -0
  108. package/dist/generated/PolicySummary.js +1 -0
  109. package/dist/generated/PolicyValidateResponse.d.ts +6 -0
  110. package/dist/generated/PolicyValidateResponse.js +1 -0
  111. package/dist/generated/PolicyValidationIssue.d.ts +4 -0
  112. package/dist/generated/PolicyValidationIssue.js +2 -0
  113. package/dist/generated/RunDetail.d.ts +8 -0
  114. package/dist/generated/RunDetail.js +1 -0
  115. package/dist/generated/RunEventKind.d.ts +1 -0
  116. package/dist/generated/RunEventKind.js +2 -0
  117. package/dist/generated/RunEventListResponse.d.ts +4 -0
  118. package/dist/generated/RunEventListResponse.js +1 -0
  119. package/dist/generated/RunEventSummary.d.ts +20 -0
  120. package/dist/generated/RunEventSummary.js +1 -0
  121. package/dist/generated/RunKind.d.ts +1 -0
  122. package/dist/generated/RunKind.js +2 -0
  123. package/dist/generated/RunListResponse.d.ts +4 -0
  124. package/dist/generated/RunListResponse.js +1 -0
  125. package/dist/generated/RunStatus.d.ts +1 -0
  126. package/dist/generated/RunStatus.js +2 -0
  127. package/dist/generated/RunSummary.d.ts +32 -0
  128. package/dist/generated/RunSummary.js +1 -0
  129. package/dist/generated/Severity.d.ts +1 -0
  130. package/dist/generated/Severity.js +2 -0
  131. package/dist/generated/Tier.d.ts +4 -0
  132. package/dist/generated/Tier.js +2 -0
  133. package/dist/generated/TierResult.d.ts +12 -0
  134. package/dist/generated/TierResult.js +1 -0
  135. package/dist/generated/TierStatus.d.ts +4 -0
  136. package/dist/generated/TierStatus.js +2 -0
  137. package/dist/generated/TraceListResponse.d.ts +4 -0
  138. package/dist/generated/TraceListResponse.js +1 -0
  139. package/dist/generated/TraceSummary.d.ts +13 -0
  140. package/dist/generated/TraceSummary.js +2 -0
  141. package/dist/generated/TriggeredPolicy.d.ts +6 -0
  142. package/dist/generated/TriggeredPolicy.js +1 -0
  143. package/dist/generated/UpdateRunRequest.d.ts +10 -0
  144. package/dist/generated/UpdateRunRequest.js +1 -0
  145. package/dist/generated/Verdict.d.ts +4 -0
  146. package/dist/generated/Verdict.js +2 -0
  147. package/dist/generated/WorkspaceInvite.d.ts +20 -0
  148. package/dist/generated/WorkspaceInvite.js +1 -0
  149. package/dist/generated/WorkspaceMember.d.ts +13 -0
  150. package/dist/generated/WorkspaceMember.js +1 -0
  151. package/dist/generated/WorkspaceRole.d.ts +5 -0
  152. package/dist/generated/WorkspaceRole.js +2 -0
  153. package/dist/generated/WorkspaceSettings.d.ts +11 -0
  154. package/dist/generated/WorkspaceSettings.js +2 -0
  155. package/dist/guard.d.ts +193 -0
  156. package/dist/guard.js +211 -0
  157. package/dist/index.d.ts +64 -0
  158. package/dist/index.js +64 -0
  159. package/dist/retry.d.ts +18 -0
  160. package/dist/retry.js +48 -0
  161. package/package.json +39 -0
  162. package/src/client.ts +453 -0
  163. package/src/errors.ts +202 -0
  164. package/src/generated/AgentAuthority.ts +3 -0
  165. package/src/generated/AgentListResponse.ts +4 -0
  166. package/src/generated/AgentProfile.ts +23 -0
  167. package/src/generated/AgentScope.ts +3 -0
  168. package/src/generated/AgentTone.ts +3 -0
  169. package/src/generated/ApiError.ts +24 -0
  170. package/src/generated/ApiErrorCode.ts +8 -0
  171. package/src/generated/ApiKeyBatchRevokeRequest.ts +3 -0
  172. package/src/generated/ApiKeyBatchRevokeResponse.ts +4 -0
  173. package/src/generated/ApiKeyListResponse.ts +4 -0
  174. package/src/generated/AuthRequest.ts +16 -0
  175. package/src/generated/AuthResponse.ts +15 -0
  176. package/src/generated/ChangePasswordRequest.ts +15 -0
  177. package/src/generated/Channel.ts +10 -0
  178. package/src/generated/CheckRequest.ts +11 -0
  179. package/src/generated/CreateApiKeyRequest.ts +3 -0
  180. package/src/generated/CreateApiKeyResponse.ts +8 -0
  181. package/src/generated/CreateInviteRequest.ts +7 -0
  182. package/src/generated/CreateInviteResponse.ts +14 -0
  183. package/src/generated/CreateKnowledgeSourceRequest.ts +5 -0
  184. package/src/generated/CreateRunEventRequest.ts +8 -0
  185. package/src/generated/CreateRunRequest.ts +5 -0
  186. package/src/generated/CreateWorkspaceRequest.ts +7 -0
  187. package/src/generated/DashboardApiKey.ts +11 -0
  188. package/src/generated/DashboardKnowledgeSourceKind.ts +3 -0
  189. package/src/generated/Decision.ts +12 -0
  190. package/src/generated/GuardrailGenerateResponse.ts +11 -0
  191. package/src/generated/GuardrailListResponse.ts +7 -0
  192. package/src/generated/InviteListResponse.ts +4 -0
  193. package/src/generated/InviteStatus.ts +6 -0
  194. package/src/generated/KnowledgeFileInput.ts +3 -0
  195. package/src/generated/KnowledgeFileMetadata.ts +3 -0
  196. package/src/generated/KnowledgeSource.ts +4 -0
  197. package/src/generated/KnowledgeSourceDocument.ts +17 -0
  198. package/src/generated/KnowledgeSourceFileResponse.ts +3 -0
  199. package/src/generated/KnowledgeSourceKind.ts +3 -0
  200. package/src/generated/KnowledgeSourceListResponse.ts +4 -0
  201. package/src/generated/KnowledgeSourceStatus.ts +3 -0
  202. package/src/generated/MemberListResponse.ts +4 -0
  203. package/src/generated/MyWorkspace.ts +8 -0
  204. package/src/generated/MyWorkspacesResponse.ts +4 -0
  205. package/src/generated/PolicyAction.ts +6 -0
  206. package/src/generated/PolicyBatchSetEnabledRequest.ts +3 -0
  207. package/src/generated/PolicyBatchSetEnabledResponse.ts +4 -0
  208. package/src/generated/PolicyDocument.ts +4 -0
  209. package/src/generated/PolicyDraft.ts +11 -0
  210. package/src/generated/PolicyDraftRequest.ts +6 -0
  211. package/src/generated/PolicyDraftResponse.ts +4 -0
  212. package/src/generated/PolicyListResponse.ts +4 -0
  213. package/src/generated/PolicyMatchType.ts +7 -0
  214. package/src/generated/PolicySetEnabledRequest.ts +3 -0
  215. package/src/generated/PolicySummary.ts +4 -0
  216. package/src/generated/PolicyValidateResponse.ts +4 -0
  217. package/src/generated/PolicyValidationIssue.ts +3 -0
  218. package/src/generated/README.md +1 -0
  219. package/src/generated/RunDetail.ts +6 -0
  220. package/src/generated/RunEventKind.ts +3 -0
  221. package/src/generated/RunEventListResponse.ts +4 -0
  222. package/src/generated/RunEventSummary.ts +12 -0
  223. package/src/generated/RunKind.ts +3 -0
  224. package/src/generated/RunListResponse.ts +4 -0
  225. package/src/generated/RunStatus.ts +3 -0
  226. package/src/generated/RunSummary.ts +21 -0
  227. package/src/generated/Severity.ts +3 -0
  228. package/src/generated/Tier.ts +6 -0
  229. package/src/generated/TierResult.ts +9 -0
  230. package/src/generated/TierStatus.ts +6 -0
  231. package/src/generated/TraceListResponse.ts +4 -0
  232. package/src/generated/TraceSummary.ts +7 -0
  233. package/src/generated/TriggeredPolicy.ts +4 -0
  234. package/src/generated/UpdateRunRequest.ts +9 -0
  235. package/src/generated/Verdict.ts +6 -0
  236. package/src/generated/WorkspaceInvite.ts +14 -0
  237. package/src/generated/WorkspaceMember.ts +11 -0
  238. package/src/generated/WorkspaceRole.ts +7 -0
  239. package/src/generated/WorkspaceSettings.ts +7 -0
  240. package/src/guard.ts +492 -0
  241. package/src/index.ts +97 -0
  242. package/src/retry.ts +67 -0
package/dist/guard.js ADDED
@@ -0,0 +1,211 @@
1
+ // `guard()` — output-boundary helper.
2
+ //
3
+ // Most integrations should create one guardrail at startup and call it before
4
+ // delivering an agent draft:
5
+ //
6
+ // const guardrail = guard({ agentId: 'acme-support-v3' });
7
+ // const reply = await guardrail({ input: userMessage, draft: agentDraft });
8
+ // await sendToCustomer(reply);
9
+ //
10
+ // The lower-level form remains available for custom client ownership:
11
+ //
12
+ // const reply = await guard({
13
+ // client,
14
+ // input,
15
+ // draft,
16
+ // context,
17
+ // agentId: 'acme-support-v3',
18
+ // onBlock: () => cannedSafeReply,
19
+ // onEscalate: () => { humanQueue.push(...); return holdMessage; },
20
+ // });
21
+ // await sendToCustomer(reply);
22
+ //
23
+ // The handler stays the source of truth on what to do per-verdict.
24
+ // `guard` just makes the dispatch ergonomic and applies a fail-open
25
+ // default for transport errors so an outage on our side doesn't take
26
+ // down the agent.
27
+ //
28
+ // Factory guards support three presets:
29
+ // strict -> treat rewrite verdicts as blocked output
30
+ // rewrite -> use safeOutput, block when no safeOutput exists
31
+ // rewrite_or_regenerate -> use safeOutput, otherwise regenerate and check again
32
+ import { Client } from './client';
33
+ import { SdkError } from './errors';
34
+ const DEFAULT_BLOCK_MESSAGE = "I can't help with that request.";
35
+ const DEFAULT_ESCALATE_MESSAGE = 'A human teammate should review this before we continue.';
36
+ export const GuardMode = {
37
+ Strict: 'strict',
38
+ Rewrite: 'rewrite',
39
+ RewriteOrRegenerate: 'rewrite_or_regenerate',
40
+ };
41
+ export function guard(opts) {
42
+ if ('input' in opts && 'draft' in opts) {
43
+ return guardOnce(opts);
44
+ }
45
+ return createOutputGuard(opts);
46
+ }
47
+ async function guardOnce(opts) {
48
+ const start = performance.now();
49
+ const req = {
50
+ agent_id: opts.agentId,
51
+ channel: opts.channel ?? 'chat',
52
+ input: opts.input,
53
+ proposed_output: opts.draft,
54
+ domain: opts.domain ?? null,
55
+ policies: [],
56
+ // Server's `context` is `Record<string, unknown> | null`; null
57
+ // matches the wire shape when no context is supplied.
58
+ context: (opts.context ?? null),
59
+ trace_id: opts.traceId ?? null,
60
+ };
61
+ addDefined(req, 'run_id', opts.runId);
62
+ addDefined(req, 'run_event_id', opts.runEventId);
63
+ addDefined(req, 'run_event', opts.runEvent);
64
+ let decision;
65
+ try {
66
+ decision = await opts.client.check(req, opts.signal);
67
+ }
68
+ catch (e) {
69
+ if (!(e instanceof SdkError))
70
+ throw e;
71
+ const fallback = opts.onError ? await opts.onError(e, opts.draft) : opts.draft; // fail-open default
72
+ opts.log?.({
73
+ trace_id: opts.traceId ?? '',
74
+ // Wire shape doesn't have an "error" verdict; we synthesise the
75
+ // log line for observability without lying about the wire.
76
+ verdict: 'allow',
77
+ branch: 'error',
78
+ latency_ms: Math.round(performance.now() - start),
79
+ });
80
+ return fallback;
81
+ }
82
+ const result = await dispatch(opts, decision);
83
+ opts.log?.({
84
+ trace_id: decision.trace_id,
85
+ verdict: decision.verdict,
86
+ branch: branchFor(decision.verdict),
87
+ latency_ms: Math.round(performance.now() - start),
88
+ });
89
+ return result;
90
+ }
91
+ function createOutputGuard(opts) {
92
+ const client = opts.client ?? new Client(clientOptions(opts));
93
+ return async (call) => {
94
+ const mode = call.mode ?? opts.mode ?? 'rewrite';
95
+ const regenerate = call.regenerate ?? opts.regenerate;
96
+ const maxRegenerations = call.maxRegenerations ?? opts.maxRegenerations ?? 1;
97
+ const onBlock = decisionHandler(call.onBlock ?? opts.onBlock, DEFAULT_BLOCK_MESSAGE);
98
+ const onEscalate = decisionHandler(call.onEscalate ?? opts.onEscalate, DEFAULT_ESCALATE_MESSAGE);
99
+ const onError = errorHandler(call.onError ?? opts.onError, opts.failClosed === true ? DEFAULT_BLOCK_MESSAGE : undefined);
100
+ const runAttempt = async (currentDraft, completedRegenerations) => {
101
+ const onRevise = async (revised, checkedDraft, decision) => {
102
+ if (mode === 'strict')
103
+ return await onBlock(decision);
104
+ if (revised !== null)
105
+ return revised;
106
+ if (mode !== 'rewrite_or_regenerate' ||
107
+ regenerate === undefined ||
108
+ completedRegenerations >= maxRegenerations) {
109
+ return await onBlock(decision);
110
+ }
111
+ const nextAttempt = completedRegenerations + 1;
112
+ const nextDraft = await regenerate({
113
+ input: call.input,
114
+ draft: checkedDraft,
115
+ decision,
116
+ reason: decision.reason,
117
+ safeOutput: decision.safe_output ?? null,
118
+ attempt: nextAttempt,
119
+ maxAttempts: maxRegenerations,
120
+ });
121
+ return await runAttempt(nextDraft, nextAttempt);
122
+ };
123
+ const guardOpts = {
124
+ client,
125
+ agentId: opts.agentId,
126
+ input: call.input,
127
+ draft: currentDraft,
128
+ context: { ...(opts.context ?? {}), ...(call.context ?? {}) },
129
+ onBlock,
130
+ onEscalate,
131
+ onRevise,
132
+ };
133
+ addDefined(guardOpts, 'channel', call.channel ?? opts.channel);
134
+ addDefined(guardOpts, 'domain', call.domain ?? opts.domain);
135
+ addDefined(guardOpts, 'traceId', call.traceId);
136
+ addDefined(guardOpts, 'runId', call.runId);
137
+ addDefined(guardOpts, 'runEventId', call.runEventId);
138
+ addDefined(guardOpts, 'runEvent', call.runEvent);
139
+ addDefined(guardOpts, 'onError', onError);
140
+ addDefined(guardOpts, 'log', call.log ?? opts.log);
141
+ addDefined(guardOpts, 'signal', call.signal);
142
+ return await guardOnce(guardOpts);
143
+ };
144
+ return await runAttempt(call.draft, 0);
145
+ };
146
+ }
147
+ async function dispatch(opts, decision) {
148
+ switch (decision.verdict) {
149
+ case 'allow':
150
+ return opts.onAllow ? await opts.onAllow(opts.draft, decision) : opts.draft;
151
+ case 'rewrite':
152
+ return opts.onRevise
153
+ ? await opts.onRevise(decision.safe_output ?? null, opts.draft, decision)
154
+ : (decision.safe_output ?? opts.draft);
155
+ case 'block':
156
+ return await opts.onBlock(decision);
157
+ case 'escalate':
158
+ return await opts.onEscalate(decision);
159
+ }
160
+ }
161
+ function branchFor(v) {
162
+ if (v === 'rewrite')
163
+ return 'revise';
164
+ return v;
165
+ }
166
+ function decisionHandler(handler, defaultMessage) {
167
+ return async (decision) => {
168
+ if (handler === undefined)
169
+ return defaultMessage;
170
+ if (typeof handler === 'string')
171
+ return handler;
172
+ return await handler(decision);
173
+ };
174
+ }
175
+ function errorHandler(handler, defaultMessage) {
176
+ if (handler === undefined && defaultMessage === undefined)
177
+ return undefined;
178
+ return async (err, draft) => {
179
+ if (handler === undefined)
180
+ return defaultMessage ?? draft;
181
+ if (typeof handler === 'string')
182
+ return handler;
183
+ return await handler(err, draft);
184
+ };
185
+ }
186
+ function env(...names) {
187
+ const proc = globalThis;
188
+ for (const name of names) {
189
+ const value = proc.process?.env?.[name];
190
+ if (value !== undefined && value.length > 0)
191
+ return value;
192
+ }
193
+ return undefined;
194
+ }
195
+ function clientOptions(opts) {
196
+ const clientOpts = {
197
+ baseUrl: opts.baseUrl ??
198
+ env('TL_SERVER_URL', 'TRUSTLOOPGUARD_URL', 'TRUSTLOOP_URL') ??
199
+ 'http://127.0.0.1:8080',
200
+ };
201
+ addDefined(clientOpts, 'apiKey', opts.apiKey ?? env('TL_API_KEY', 'TRUSTLOOPGUARD_API_KEY', 'TRUSTLOOP_API_KEY'));
202
+ addDefined(clientOpts, 'retry', opts.retry);
203
+ addDefined(clientOpts, 'fetchImpl', opts.fetchImpl);
204
+ addDefined(clientOpts, 'onRetry', opts.onRetry);
205
+ return clientOpts;
206
+ }
207
+ function addDefined(target, key, value) {
208
+ if (value !== undefined) {
209
+ target[key] = value;
210
+ }
211
+ }
@@ -0,0 +1,64 @@
1
+ export * from './generated/CheckRequest';
2
+ export * from './generated/Decision';
3
+ export * from './generated/Verdict';
4
+ export * from './generated/Channel';
5
+ export * from './generated/Severity';
6
+ export * from './generated/TriggeredPolicy';
7
+ export * from './generated/AgentAuthority';
8
+ export * from './generated/AgentListResponse';
9
+ export * from './generated/AgentProfile';
10
+ export * from './generated/AgentScope';
11
+ export * from './generated/AgentTone';
12
+ export * from './generated/KnowledgeSource';
13
+ export * from './generated/CreateKnowledgeSourceRequest';
14
+ export * from './generated/DashboardKnowledgeSourceKind';
15
+ export * from './generated/KnowledgeFileInput';
16
+ export * from './generated/KnowledgeFileMetadata';
17
+ export * from './generated/KnowledgeSourceDocument';
18
+ export * from './generated/KnowledgeSourceFileResponse';
19
+ export * from './generated/KnowledgeSourceListResponse';
20
+ export * from './generated/KnowledgeSourceStatus';
21
+ export * from './generated/ApiError';
22
+ export * from './generated/ApiErrorCode';
23
+ export * from './generated/PolicyDocument';
24
+ export * from './generated/PolicyBatchSetEnabledRequest';
25
+ export * from './generated/PolicyBatchSetEnabledResponse';
26
+ export * from './generated/PolicyListResponse';
27
+ export * from './generated/PolicySetEnabledRequest';
28
+ export * from './generated/PolicySummary';
29
+ export * from './generated/PolicyValidateResponse';
30
+ export * from './generated/PolicyValidationIssue';
31
+ export * from './generated/PolicyAction';
32
+ export * from './generated/PolicyMatchType';
33
+ export * from './generated/PolicyDraft';
34
+ export * from './generated/PolicyDraftRequest';
35
+ export * from './generated/PolicyDraftResponse';
36
+ export * from './generated/GuardrailGenerateResponse';
37
+ export * from './generated/GuardrailListResponse';
38
+ export * from './generated/ApiKeyBatchRevokeRequest';
39
+ export * from './generated/ApiKeyBatchRevokeResponse';
40
+ export * from './generated/ApiKeyListResponse';
41
+ export * from './generated/CreateApiKeyRequest';
42
+ export * from './generated/CreateApiKeyResponse';
43
+ export * from './generated/DashboardApiKey';
44
+ export * from './generated/WorkspaceSettings';
45
+ export * from './generated/TraceListResponse';
46
+ export * from './generated/TraceSummary';
47
+ export * from './generated/CreateRunEventRequest';
48
+ export * from './generated/CreateRunRequest';
49
+ export * from './generated/UpdateRunRequest';
50
+ export * from './generated/RunDetail';
51
+ export * from './generated/RunEventKind';
52
+ export * from './generated/RunEventListResponse';
53
+ export * from './generated/RunEventSummary';
54
+ export * from './generated/RunKind';
55
+ export * from './generated/RunListResponse';
56
+ export * from './generated/RunStatus';
57
+ export * from './generated/RunSummary';
58
+ export { Client } from './client';
59
+ export type { ClientOptions } from './client';
60
+ export { GuardMode, guard } from './guard';
61
+ export type { GuardCallbacks, GuardOptions, GuardFactoryOptions, GuardCallOptions, GuardLogEvent, OutputGuard, RegenerateFeedback, } from './guard';
62
+ export { DEFAULT_RETRY, nextDelay } from './retry';
63
+ export type { RetryConfig } from './retry';
64
+ export { SdkError, Invalid, Unauthorized, Forbidden, NotFound, Gone, Unprocessable, RateLimited, Internal, Unavailable, Transport, Decode, codeFromHttpStatus, synthesizeApiError, fromResponse, parseRetryAfter, } from './errors';
package/dist/index.js ADDED
@@ -0,0 +1,64 @@
1
+ // Public surface of the TrustLoopGuard TypeScript SDK.
2
+ // Type definitions are generated from Rust by `cargo run -p tl-codegen`.
3
+ // See README.md in src/generated for regen instructions.
4
+ export * from './generated/CheckRequest';
5
+ export * from './generated/Decision';
6
+ export * from './generated/Verdict';
7
+ export * from './generated/Channel';
8
+ export * from './generated/Severity';
9
+ export * from './generated/TriggeredPolicy';
10
+ export * from './generated/AgentAuthority';
11
+ export * from './generated/AgentListResponse';
12
+ export * from './generated/AgentProfile';
13
+ export * from './generated/AgentScope';
14
+ export * from './generated/AgentTone';
15
+ export * from './generated/KnowledgeSource';
16
+ export * from './generated/CreateKnowledgeSourceRequest';
17
+ export * from './generated/DashboardKnowledgeSourceKind';
18
+ export * from './generated/KnowledgeFileInput';
19
+ export * from './generated/KnowledgeFileMetadata';
20
+ export * from './generated/KnowledgeSourceDocument';
21
+ export * from './generated/KnowledgeSourceFileResponse';
22
+ export * from './generated/KnowledgeSourceListResponse';
23
+ export * from './generated/KnowledgeSourceStatus';
24
+ export * from './generated/ApiError';
25
+ export * from './generated/ApiErrorCode';
26
+ export * from './generated/PolicyDocument';
27
+ export * from './generated/PolicyBatchSetEnabledRequest';
28
+ export * from './generated/PolicyBatchSetEnabledResponse';
29
+ export * from './generated/PolicyListResponse';
30
+ export * from './generated/PolicySetEnabledRequest';
31
+ export * from './generated/PolicySummary';
32
+ export * from './generated/PolicyValidateResponse';
33
+ export * from './generated/PolicyValidationIssue';
34
+ export * from './generated/PolicyAction';
35
+ export * from './generated/PolicyMatchType';
36
+ export * from './generated/PolicyDraft';
37
+ export * from './generated/PolicyDraftRequest';
38
+ export * from './generated/PolicyDraftResponse';
39
+ export * from './generated/GuardrailGenerateResponse';
40
+ export * from './generated/GuardrailListResponse';
41
+ export * from './generated/ApiKeyBatchRevokeRequest';
42
+ export * from './generated/ApiKeyBatchRevokeResponse';
43
+ export * from './generated/ApiKeyListResponse';
44
+ export * from './generated/CreateApiKeyRequest';
45
+ export * from './generated/CreateApiKeyResponse';
46
+ export * from './generated/DashboardApiKey';
47
+ export * from './generated/WorkspaceSettings';
48
+ export * from './generated/TraceListResponse';
49
+ export * from './generated/TraceSummary';
50
+ export * from './generated/CreateRunEventRequest';
51
+ export * from './generated/CreateRunRequest';
52
+ export * from './generated/UpdateRunRequest';
53
+ export * from './generated/RunDetail';
54
+ export * from './generated/RunEventKind';
55
+ export * from './generated/RunEventListResponse';
56
+ export * from './generated/RunEventSummary';
57
+ export * from './generated/RunKind';
58
+ export * from './generated/RunListResponse';
59
+ export * from './generated/RunStatus';
60
+ export * from './generated/RunSummary';
61
+ export { Client } from './client';
62
+ export { GuardMode, guard } from './guard';
63
+ export { DEFAULT_RETRY, nextDelay } from './retry';
64
+ export { SdkError, Invalid, Unauthorized, Forbidden, NotFound, Gone, Unprocessable, RateLimited, Internal, Unavailable, Transport, Decode, codeFromHttpStatus, synthesizeApiError, fromResponse, parseRetryAfter, } from './errors';
@@ -0,0 +1,18 @@
1
+ import { SdkError } from './errors';
2
+ export interface RetryConfig {
3
+ /** Total attempts including the initial one. `1` = no retry. */
4
+ maxAttempts: number;
5
+ /** Hard cap on total wall time including sleeps, in seconds. */
6
+ totalBudgetS: number;
7
+ /** Base for exponential backoff: delay = base * 2^(attempt-1). */
8
+ baseDelayS: number;
9
+ /** Cap on a single retry delay; prevents runaway exponential. */
10
+ maxDelayS: number;
11
+ }
12
+ export declare const DEFAULT_RETRY: Readonly<RetryConfig>;
13
+ /**
14
+ * Compute the delay before the next attempt, or `undefined` to stop.
15
+ * Pure mirror of `tl_sdk_rust::RetryConfig::next_delay` and
16
+ * `trustloopguard.retry.RetryConfig.next_delay`.
17
+ */
18
+ export declare function nextDelay(cfg: RetryConfig, attempt: number, elapsedS: number, err: SdkError, jitterFraction: number): number | undefined;
package/dist/retry.js ADDED
@@ -0,0 +1,48 @@
1
+ // Retry policy for the TrustLoopGuard TypeScript SDK.
2
+ //
3
+ // Mirrors `tl-sdk-rust`'s `RetryConfig` exactly. Same defaults
4
+ // (4 attempts, 30s budget, 200ms base, 8s cap), same `nextDelay`
5
+ // contract: given the attempt number, elapsed time, the error that just
6
+ // occurred, and a jitter fraction, return the delay before the next
7
+ // attempt (in seconds) or `undefined` to stop.
8
+ //
9
+ // The function is pure so it can be unit-tested without spinning up an
10
+ // HTTP server. Production callers feed `Math.random()`; tests pin the
11
+ // value for determinism.
12
+ import { RateLimited, SdkError } from './errors';
13
+ export const DEFAULT_RETRY = Object.freeze({
14
+ maxAttempts: 4,
15
+ totalBudgetS: 30.0,
16
+ baseDelayS: 0.2,
17
+ maxDelayS: 8.0,
18
+ });
19
+ /**
20
+ * Compute the delay before the next attempt, or `undefined` to stop.
21
+ * Pure mirror of `tl_sdk_rust::RetryConfig::next_delay` and
22
+ * `trustloopguard.retry.RetryConfig.next_delay`.
23
+ */
24
+ export function nextDelay(cfg, attempt, elapsedS, err, jitterFraction) {
25
+ if (!err.isRetriable())
26
+ return undefined;
27
+ if (attempt >= cfg.maxAttempts)
28
+ return undefined;
29
+ if (elapsedS >= cfg.totalBudgetS)
30
+ return undefined;
31
+ const exp = cfg.baseDelayS * 2 ** (attempt - 1);
32
+ const capped = Math.min(exp, cfg.maxDelayS);
33
+ // ±25% jitter: jitterFraction in [0,1] maps to multiplier [0.75, 1.25].
34
+ const frac = Math.max(0, Math.min(1, jitterFraction));
35
+ const multiplier = 0.75 + frac * 0.5;
36
+ const jittered = capped * multiplier;
37
+ let delay;
38
+ if (err instanceof RateLimited && err.retryAfter !== undefined) {
39
+ delay = Math.max(err.retryAfter, jittered);
40
+ }
41
+ else {
42
+ delay = jittered;
43
+ }
44
+ const remaining = cfg.totalBudgetS - elapsedS;
45
+ if (remaining <= 0)
46
+ return undefined;
47
+ return Math.min(delay, remaining);
48
+ }
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@trustloopguard/sdk",
3
+ "version": "0.0.1",
4
+ "description": "TypeScript SDK for TrustLoopGuard. Types are generated from Rust via tl-codegen; do not hand-edit src/generated.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./src/index.ts",
12
+ "import": "./src/index.ts",
13
+ "default": "./src/index.ts"
14
+ }
15
+ },
16
+ "publishConfig": {
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js",
21
+ "default": "./dist/index.js"
22
+ }
23
+ }
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "src"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsc",
31
+ "typecheck": "tsc --noEmit",
32
+ "test": "vitest run",
33
+ "clean": "rm -rf dist"
34
+ },
35
+ "devDependencies": {
36
+ "typescript": "^6.0.3",
37
+ "vitest": "^2.1.0"
38
+ }
39
+ }