@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.
- package/dist/client.d.ts +98 -0
- package/dist/client.js +198 -0
- package/dist/errors.d.ts +46 -0
- package/dist/errors.js +187 -0
- package/dist/generated/AgentAuthority.d.ts +4 -0
- package/dist/generated/AgentAuthority.js +2 -0
- package/dist/generated/AgentListResponse.d.ts +4 -0
- package/dist/generated/AgentListResponse.js +1 -0
- package/dist/generated/AgentProfile.d.ts +29 -0
- package/dist/generated/AgentProfile.js +1 -0
- package/dist/generated/AgentScope.d.ts +4 -0
- package/dist/generated/AgentScope.js +2 -0
- package/dist/generated/AgentTone.d.ts +4 -0
- package/dist/generated/AgentTone.js +2 -0
- package/dist/generated/ApiError.d.ts +25 -0
- package/dist/generated/ApiError.js +1 -0
- package/dist/generated/ApiErrorCode.d.ts +6 -0
- package/dist/generated/ApiErrorCode.js +2 -0
- package/dist/generated/ApiKeyBatchRevokeRequest.d.ts +3 -0
- package/dist/generated/ApiKeyBatchRevokeRequest.js +2 -0
- package/dist/generated/ApiKeyBatchRevokeResponse.d.ts +4 -0
- package/dist/generated/ApiKeyBatchRevokeResponse.js +1 -0
- package/dist/generated/ApiKeyListResponse.d.ts +4 -0
- package/dist/generated/ApiKeyListResponse.js +1 -0
- package/dist/generated/AuthRequest.d.ts +15 -0
- package/dist/generated/AuthRequest.js +2 -0
- package/dist/generated/AuthResponse.d.ts +16 -0
- package/dist/generated/AuthResponse.js +2 -0
- package/dist/generated/ChangePasswordRequest.d.ts +15 -0
- package/dist/generated/ChangePasswordRequest.js +2 -0
- package/dist/generated/Channel.d.ts +8 -0
- package/dist/generated/Channel.js +2 -0
- package/dist/generated/CheckRequest.d.ts +21 -0
- package/dist/generated/CheckRequest.js +1 -0
- package/dist/generated/CreateApiKeyRequest.d.ts +3 -0
- package/dist/generated/CreateApiKeyRequest.js +2 -0
- package/dist/generated/CreateApiKeyResponse.d.ts +8 -0
- package/dist/generated/CreateApiKeyResponse.js +1 -0
- package/dist/generated/CreateInviteRequest.d.ts +8 -0
- package/dist/generated/CreateInviteRequest.js +1 -0
- package/dist/generated/CreateInviteResponse.d.ts +18 -0
- package/dist/generated/CreateInviteResponse.js +1 -0
- package/dist/generated/CreateKnowledgeSourceRequest.d.ts +9 -0
- package/dist/generated/CreateKnowledgeSourceRequest.js +1 -0
- package/dist/generated/CreateRunEventRequest.d.ts +13 -0
- package/dist/generated/CreateRunEventRequest.js +1 -0
- package/dist/generated/CreateRunRequest.d.ts +9 -0
- package/dist/generated/CreateRunRequest.js +1 -0
- package/dist/generated/CreateWorkspaceRequest.d.ts +7 -0
- package/dist/generated/CreateWorkspaceRequest.js +2 -0
- package/dist/generated/DashboardApiKey.d.ts +15 -0
- package/dist/generated/DashboardApiKey.js +2 -0
- package/dist/generated/DashboardKnowledgeSourceKind.d.ts +1 -0
- package/dist/generated/DashboardKnowledgeSourceKind.js +2 -0
- package/dist/generated/Decision.d.ts +17 -0
- package/dist/generated/Decision.js +1 -0
- package/dist/generated/GuardrailGenerateResponse.d.ts +11 -0
- package/dist/generated/GuardrailGenerateResponse.js +1 -0
- package/dist/generated/GuardrailListResponse.d.ts +7 -0
- package/dist/generated/GuardrailListResponse.js +1 -0
- package/dist/generated/InviteListResponse.d.ts +4 -0
- package/dist/generated/InviteListResponse.js +1 -0
- package/dist/generated/InviteStatus.d.ts +4 -0
- package/dist/generated/InviteStatus.js +2 -0
- package/dist/generated/KnowledgeFileInput.d.ts +5 -0
- package/dist/generated/KnowledgeFileInput.js +2 -0
- package/dist/generated/KnowledgeFileMetadata.d.ts +6 -0
- package/dist/generated/KnowledgeFileMetadata.js +2 -0
- package/dist/generated/KnowledgeSource.d.ts +7 -0
- package/dist/generated/KnowledgeSource.js +1 -0
- package/dist/generated/KnowledgeSourceDocument.d.ts +22 -0
- package/dist/generated/KnowledgeSourceDocument.js +1 -0
- package/dist/generated/KnowledgeSourceFileResponse.d.ts +6 -0
- package/dist/generated/KnowledgeSourceFileResponse.js +2 -0
- package/dist/generated/KnowledgeSourceKind.d.ts +1 -0
- package/dist/generated/KnowledgeSourceKind.js +2 -0
- package/dist/generated/KnowledgeSourceListResponse.d.ts +4 -0
- package/dist/generated/KnowledgeSourceListResponse.js +1 -0
- package/dist/generated/KnowledgeSourceStatus.d.ts +1 -0
- package/dist/generated/KnowledgeSourceStatus.js +2 -0
- package/dist/generated/MemberListResponse.d.ts +4 -0
- package/dist/generated/MemberListResponse.js +1 -0
- package/dist/generated/MyWorkspace.d.ts +12 -0
- package/dist/generated/MyWorkspace.js +1 -0
- package/dist/generated/MyWorkspacesResponse.d.ts +4 -0
- package/dist/generated/MyWorkspacesResponse.js +1 -0
- package/dist/generated/PolicyAction.d.ts +4 -0
- package/dist/generated/PolicyAction.js +2 -0
- package/dist/generated/PolicyBatchSetEnabledRequest.d.ts +4 -0
- package/dist/generated/PolicyBatchSetEnabledRequest.js +2 -0
- package/dist/generated/PolicyBatchSetEnabledResponse.d.ts +4 -0
- package/dist/generated/PolicyBatchSetEnabledResponse.js +1 -0
- package/dist/generated/PolicyDocument.d.ts +8 -0
- package/dist/generated/PolicyDocument.js +1 -0
- package/dist/generated/PolicyDraft.d.ts +17 -0
- package/dist/generated/PolicyDraft.js +1 -0
- package/dist/generated/PolicyDraftRequest.d.ts +6 -0
- package/dist/generated/PolicyDraftRequest.js +2 -0
- package/dist/generated/PolicyDraftResponse.d.ts +4 -0
- package/dist/generated/PolicyDraftResponse.js +1 -0
- package/dist/generated/PolicyListResponse.d.ts +4 -0
- package/dist/generated/PolicyListResponse.js +1 -0
- package/dist/generated/PolicyMatchType.d.ts +5 -0
- package/dist/generated/PolicyMatchType.js +2 -0
- package/dist/generated/PolicySetEnabledRequest.d.ts +3 -0
- package/dist/generated/PolicySetEnabledRequest.js +2 -0
- package/dist/generated/PolicySummary.d.ts +9 -0
- package/dist/generated/PolicySummary.js +1 -0
- package/dist/generated/PolicyValidateResponse.d.ts +6 -0
- package/dist/generated/PolicyValidateResponse.js +1 -0
- package/dist/generated/PolicyValidationIssue.d.ts +4 -0
- package/dist/generated/PolicyValidationIssue.js +2 -0
- package/dist/generated/RunDetail.d.ts +8 -0
- package/dist/generated/RunDetail.js +1 -0
- package/dist/generated/RunEventKind.d.ts +1 -0
- package/dist/generated/RunEventKind.js +2 -0
- package/dist/generated/RunEventListResponse.d.ts +4 -0
- package/dist/generated/RunEventListResponse.js +1 -0
- package/dist/generated/RunEventSummary.d.ts +20 -0
- package/dist/generated/RunEventSummary.js +1 -0
- package/dist/generated/RunKind.d.ts +1 -0
- package/dist/generated/RunKind.js +2 -0
- package/dist/generated/RunListResponse.d.ts +4 -0
- package/dist/generated/RunListResponse.js +1 -0
- package/dist/generated/RunStatus.d.ts +1 -0
- package/dist/generated/RunStatus.js +2 -0
- package/dist/generated/RunSummary.d.ts +32 -0
- package/dist/generated/RunSummary.js +1 -0
- package/dist/generated/Severity.d.ts +1 -0
- package/dist/generated/Severity.js +2 -0
- package/dist/generated/Tier.d.ts +4 -0
- package/dist/generated/Tier.js +2 -0
- package/dist/generated/TierResult.d.ts +12 -0
- package/dist/generated/TierResult.js +1 -0
- package/dist/generated/TierStatus.d.ts +4 -0
- package/dist/generated/TierStatus.js +2 -0
- package/dist/generated/TraceListResponse.d.ts +4 -0
- package/dist/generated/TraceListResponse.js +1 -0
- package/dist/generated/TraceSummary.d.ts +13 -0
- package/dist/generated/TraceSummary.js +2 -0
- package/dist/generated/TriggeredPolicy.d.ts +6 -0
- package/dist/generated/TriggeredPolicy.js +1 -0
- package/dist/generated/UpdateRunRequest.d.ts +10 -0
- package/dist/generated/UpdateRunRequest.js +1 -0
- package/dist/generated/Verdict.d.ts +4 -0
- package/dist/generated/Verdict.js +2 -0
- package/dist/generated/WorkspaceInvite.d.ts +20 -0
- package/dist/generated/WorkspaceInvite.js +1 -0
- package/dist/generated/WorkspaceMember.d.ts +13 -0
- package/dist/generated/WorkspaceMember.js +1 -0
- package/dist/generated/WorkspaceRole.d.ts +5 -0
- package/dist/generated/WorkspaceRole.js +2 -0
- package/dist/generated/WorkspaceSettings.d.ts +11 -0
- package/dist/generated/WorkspaceSettings.js +2 -0
- package/dist/guard.d.ts +193 -0
- package/dist/guard.js +211 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.js +64 -0
- package/dist/retry.d.ts +18 -0
- package/dist/retry.js +48 -0
- package/package.json +39 -0
- package/src/client.ts +453 -0
- package/src/errors.ts +202 -0
- package/src/generated/AgentAuthority.ts +3 -0
- package/src/generated/AgentListResponse.ts +4 -0
- package/src/generated/AgentProfile.ts +23 -0
- package/src/generated/AgentScope.ts +3 -0
- package/src/generated/AgentTone.ts +3 -0
- package/src/generated/ApiError.ts +24 -0
- package/src/generated/ApiErrorCode.ts +8 -0
- package/src/generated/ApiKeyBatchRevokeRequest.ts +3 -0
- package/src/generated/ApiKeyBatchRevokeResponse.ts +4 -0
- package/src/generated/ApiKeyListResponse.ts +4 -0
- package/src/generated/AuthRequest.ts +16 -0
- package/src/generated/AuthResponse.ts +15 -0
- package/src/generated/ChangePasswordRequest.ts +15 -0
- package/src/generated/Channel.ts +10 -0
- package/src/generated/CheckRequest.ts +11 -0
- package/src/generated/CreateApiKeyRequest.ts +3 -0
- package/src/generated/CreateApiKeyResponse.ts +8 -0
- package/src/generated/CreateInviteRequest.ts +7 -0
- package/src/generated/CreateInviteResponse.ts +14 -0
- package/src/generated/CreateKnowledgeSourceRequest.ts +5 -0
- package/src/generated/CreateRunEventRequest.ts +8 -0
- package/src/generated/CreateRunRequest.ts +5 -0
- package/src/generated/CreateWorkspaceRequest.ts +7 -0
- package/src/generated/DashboardApiKey.ts +11 -0
- package/src/generated/DashboardKnowledgeSourceKind.ts +3 -0
- package/src/generated/Decision.ts +12 -0
- package/src/generated/GuardrailGenerateResponse.ts +11 -0
- package/src/generated/GuardrailListResponse.ts +7 -0
- package/src/generated/InviteListResponse.ts +4 -0
- package/src/generated/InviteStatus.ts +6 -0
- package/src/generated/KnowledgeFileInput.ts +3 -0
- package/src/generated/KnowledgeFileMetadata.ts +3 -0
- package/src/generated/KnowledgeSource.ts +4 -0
- package/src/generated/KnowledgeSourceDocument.ts +17 -0
- package/src/generated/KnowledgeSourceFileResponse.ts +3 -0
- package/src/generated/KnowledgeSourceKind.ts +3 -0
- package/src/generated/KnowledgeSourceListResponse.ts +4 -0
- package/src/generated/KnowledgeSourceStatus.ts +3 -0
- package/src/generated/MemberListResponse.ts +4 -0
- package/src/generated/MyWorkspace.ts +8 -0
- package/src/generated/MyWorkspacesResponse.ts +4 -0
- package/src/generated/PolicyAction.ts +6 -0
- package/src/generated/PolicyBatchSetEnabledRequest.ts +3 -0
- package/src/generated/PolicyBatchSetEnabledResponse.ts +4 -0
- package/src/generated/PolicyDocument.ts +4 -0
- package/src/generated/PolicyDraft.ts +11 -0
- package/src/generated/PolicyDraftRequest.ts +6 -0
- package/src/generated/PolicyDraftResponse.ts +4 -0
- package/src/generated/PolicyListResponse.ts +4 -0
- package/src/generated/PolicyMatchType.ts +7 -0
- package/src/generated/PolicySetEnabledRequest.ts +3 -0
- package/src/generated/PolicySummary.ts +4 -0
- package/src/generated/PolicyValidateResponse.ts +4 -0
- package/src/generated/PolicyValidationIssue.ts +3 -0
- package/src/generated/README.md +1 -0
- package/src/generated/RunDetail.ts +6 -0
- package/src/generated/RunEventKind.ts +3 -0
- package/src/generated/RunEventListResponse.ts +4 -0
- package/src/generated/RunEventSummary.ts +12 -0
- package/src/generated/RunKind.ts +3 -0
- package/src/generated/RunListResponse.ts +4 -0
- package/src/generated/RunStatus.ts +3 -0
- package/src/generated/RunSummary.ts +21 -0
- package/src/generated/Severity.ts +3 -0
- package/src/generated/Tier.ts +6 -0
- package/src/generated/TierResult.ts +9 -0
- package/src/generated/TierStatus.ts +6 -0
- package/src/generated/TraceListResponse.ts +4 -0
- package/src/generated/TraceSummary.ts +7 -0
- package/src/generated/TriggeredPolicy.ts +4 -0
- package/src/generated/UpdateRunRequest.ts +9 -0
- package/src/generated/Verdict.ts +6 -0
- package/src/generated/WorkspaceInvite.ts +14 -0
- package/src/generated/WorkspaceMember.ts +11 -0
- package/src/generated/WorkspaceRole.ts +7 -0
- package/src/generated/WorkspaceSettings.ts +7 -0
- package/src/guard.ts +492 -0
- package/src/index.ts +97 -0
- 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
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -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';
|
package/dist/retry.d.ts
ADDED
|
@@ -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
|
+
}
|