antpath 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 (68) hide show
  1. package/README.md +67 -0
  2. package/dist/client.d.ts +14 -0
  3. package/dist/client.js +36 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/credentials.d.ts +3 -0
  6. package/dist/credentials.js +27 -0
  7. package/dist/credentials.js.map +1 -0
  8. package/dist/errors.d.ts +25 -0
  9. package/dist/errors.js +39 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/files/downloader.d.ts +3 -0
  12. package/dist/files/downloader.js +35 -0
  13. package/dist/files/downloader.js.map +1 -0
  14. package/dist/index.d.ts +5 -0
  15. package/dist/index.js +5 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/providers/anthropic/provider.d.ts +30 -0
  18. package/dist/providers/anthropic/provider.js +302 -0
  19. package/dist/providers/anthropic/provider.js.map +1 -0
  20. package/dist/providers/types.d.ts +42 -0
  21. package/dist/providers/types.js +2 -0
  22. package/dist/providers/types.js.map +1 -0
  23. package/dist/run/controller.d.ts +27 -0
  24. package/dist/run/controller.js +224 -0
  25. package/dist/run/controller.js.map +1 -0
  26. package/dist/skills/packager.d.ts +11 -0
  27. package/dist/skills/packager.js +76 -0
  28. package/dist/skills/packager.js.map +1 -0
  29. package/dist/template/compiler.d.ts +28 -0
  30. package/dist/template/compiler.js +116 -0
  31. package/dist/template/compiler.js.map +1 -0
  32. package/dist/template/index.d.ts +10 -0
  33. package/dist/template/index.js +14 -0
  34. package/dist/template/index.js.map +1 -0
  35. package/dist/template/types.d.ts +67 -0
  36. package/dist/template/types.js +2 -0
  37. package/dist/template/types.js.map +1 -0
  38. package/dist/types.d.ts +129 -0
  39. package/dist/types.js +2 -0
  40. package/dist/types.js.map +1 -0
  41. package/dist/utils/events.d.ts +6 -0
  42. package/dist/utils/events.js +41 -0
  43. package/dist/utils/events.js.map +1 -0
  44. package/dist/utils/paths.d.ts +3 -0
  45. package/dist/utils/paths.js +21 -0
  46. package/dist/utils/paths.js.map +1 -0
  47. package/dist/utils/secrets.d.ts +10 -0
  48. package/dist/utils/secrets.js +59 -0
  49. package/dist/utils/secrets.js.map +1 -0
  50. package/dist/utils/stable.d.ts +2 -0
  51. package/dist/utils/stable.js +20 -0
  52. package/dist/utils/stable.js.map +1 -0
  53. package/docs/cleanup.md +15 -0
  54. package/docs/credentials.md +23 -0
  55. package/docs/mcp.md +18 -0
  56. package/docs/outputs.md +16 -0
  57. package/docs/quickstart.md +13 -0
  58. package/docs/release.md +22 -0
  59. package/docs/skills.md +16 -0
  60. package/docs/templates.md +24 -0
  61. package/docs/testing.md +27 -0
  62. package/examples/mcp-static-bearer.ts +30 -0
  63. package/examples/quickstart.ts +23 -0
  64. package/package.json +51 -0
  65. package/references/architecture-decisions.md +203 -0
  66. package/references/implementation-plan.md +527 -0
  67. package/references/research-sources.md +30 -0
  68. package/references/testing-strategy.md +108 -0
@@ -0,0 +1,42 @@
1
+ import type { CleanupResult, CredentialInput, ProviderEvent, ProviderFile, ProviderResourceIds, UsageSummary } from "../types.js";
2
+ import type { ResolvedTemplate } from "../template/compiler.js";
3
+ export interface UploadFileInput {
4
+ filename: string;
5
+ data: Uint8Array;
6
+ mimeType?: string | undefined;
7
+ }
8
+ export interface SessionResourceInput {
9
+ type: "file";
10
+ fileId: string;
11
+ mountPath?: string | undefined;
12
+ }
13
+ export interface CreatedCredential {
14
+ id: string;
15
+ }
16
+ export interface ManagedAgentProvider {
17
+ createEnvironment(template: ResolvedTemplate): Promise<string>;
18
+ uploadFile(input: UploadFileInput): Promise<string>;
19
+ createAgent(template: ResolvedTemplate, providerSkillRefs: ProviderSkillRef[]): Promise<string>;
20
+ createVault(displayName: string, metadata?: Record<string, string>): Promise<string>;
21
+ createCredential(vaultId: string, serverUrl: string, credential: CredentialInput): Promise<CreatedCredential>;
22
+ createSession(agentId: string, environmentId: string, vaultIds: string[], resources: SessionResourceInput[]): Promise<string>;
23
+ sendUserMessage(sessionId: string, message: string): Promise<void>;
24
+ streamEvents(sessionId: string, signal?: AbortSignal): AsyncIterable<ProviderEvent>;
25
+ getSession(sessionId: string): Promise<{
26
+ status?: string | undefined;
27
+ usage?: UsageSummary | undefined;
28
+ }>;
29
+ listFiles(sessionId: string): Promise<ProviderFile[]>;
30
+ downloadFile(fileId: string): Promise<Uint8Array>;
31
+ terminateSession(sessionId: string, reason?: string): Promise<void>;
32
+ cleanup(ids: ProviderResourceIds, policy?: string): Promise<CleanupResult>;
33
+ }
34
+ export type ProviderSkillRef = {
35
+ type: "anthropic";
36
+ skill_id: string;
37
+ version?: string | undefined;
38
+ } | {
39
+ type: "custom";
40
+ skill_id: string;
41
+ version?: string | undefined;
42
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import type { ManagedAgentProvider } from "../providers/types.js";
2
+ import type { ResolvedTemplate } from "../template/compiler.js";
3
+ import type { CleanupPolicy, CleanupResult, CredentialInput, DownloadOutputsOptions, DownloadOutputsResult, Logger, ProviderFile, RunEvent, RunResult, RunStatus, UsageSummary } from "../types.js";
4
+ export interface RunControllerOptions {
5
+ provider: ManagedAgentProvider;
6
+ template: ResolvedTemplate;
7
+ credentials: Record<string, CredentialInput>;
8
+ cleanupPolicy: CleanupPolicy;
9
+ timeoutMs?: number | undefined;
10
+ signal?: AbortSignal | undefined;
11
+ logger?: Logger | undefined;
12
+ }
13
+ export declare class RunController {
14
+ #private;
15
+ constructor(options: RunControllerOptions);
16
+ start(): Promise<void>;
17
+ status(): RunStatus;
18
+ streamEvents(): AsyncIterable<RunEvent>;
19
+ wait(): Promise<RunResult>;
20
+ listFiles(): Promise<ProviderFile[]>;
21
+ downloadFile(fileId: string, destination: string): Promise<void>;
22
+ downloadOutputs(options: DownloadOutputsOptions | string): Promise<DownloadOutputsResult>;
23
+ cleanup(policy?: CleanupPolicy): Promise<CleanupResult>;
24
+ terminate(reason?: string): Promise<void>;
25
+ usage(): Promise<UsageSummary | undefined>;
26
+ result(): Promise<RunResult>;
27
+ }
@@ -0,0 +1,224 @@
1
+ import { CleanupError, RunStateError } from "../errors.js";
2
+ import { downloadOutputs as downloadAllOutputs } from "../files/downloader.js";
3
+ import { prepareSkills, toSessionResources } from "../skills/packager.js";
4
+ import { AsyncEventBus } from "../utils/events.js";
5
+ import { redactSecrets } from "../utils/secrets.js";
6
+ export class RunController {
7
+ #provider;
8
+ #template;
9
+ #credentials;
10
+ #cleanupPolicy;
11
+ #timeoutMs;
12
+ #signal;
13
+ #logger;
14
+ #events = new AsyncEventBus();
15
+ #startedAt = new Date().toISOString();
16
+ #ids = { credentialIds: [], uploadedFileIds: [] };
17
+ #status = "initializing";
18
+ #messageIndex = 0;
19
+ #resultPromise;
20
+ #resolveResult;
21
+ #rejectResult;
22
+ #finalResult;
23
+ #outputManifest;
24
+ #cleanupState = "not_started";
25
+ #userTerminated = false;
26
+ constructor(options) {
27
+ this.#provider = options.provider;
28
+ this.#template = options.template;
29
+ this.#credentials = options.credentials;
30
+ this.#cleanupPolicy = options.cleanupPolicy;
31
+ this.#timeoutMs = options.timeoutMs;
32
+ this.#signal = options.signal;
33
+ this.#logger = options.logger;
34
+ this.#resultPromise = new Promise((resolve, reject) => {
35
+ this.#resolveResult = resolve;
36
+ this.#rejectResult = reject;
37
+ });
38
+ }
39
+ async start() {
40
+ this.#consume().catch((error) => {
41
+ this.#fail(error instanceof Error ? error : new RunStateError(String(error)));
42
+ });
43
+ }
44
+ status() {
45
+ return this.#status;
46
+ }
47
+ streamEvents() {
48
+ return this.#events.stream();
49
+ }
50
+ wait() {
51
+ return this.#resultPromise;
52
+ }
53
+ async listFiles() {
54
+ if (!this.#ids.sessionId) {
55
+ throw new RunStateError("Cannot list files before session is created");
56
+ }
57
+ return this.#provider.listFiles(this.#ids.sessionId);
58
+ }
59
+ async downloadFile(fileId, destination) {
60
+ const { dirname, basename } = await import("node:path");
61
+ const { writeFileSafe } = await import("../utils/paths.js");
62
+ const content = await this.#provider.downloadFile(fileId);
63
+ await writeFileSafe(dirname(destination), basename(destination), content);
64
+ }
65
+ async downloadOutputs(options) {
66
+ if (!this.#ids.sessionId) {
67
+ throw new RunStateError("Cannot download outputs before session is created");
68
+ }
69
+ this.#setStatus("downloading_outputs");
70
+ const result = await downloadAllOutputs(this.#provider, this.#ids.sessionId, typeof options === "string" ? { directory: options } : options);
71
+ this.#outputManifest = result.manifest;
72
+ return result;
73
+ }
74
+ async cleanup(policy = this.#cleanupPolicy) {
75
+ this.#cleanupState = "pending";
76
+ const result = await this.#provider.cleanup(this.#ids, policy);
77
+ this.#cleanupState = result.state;
78
+ for (const operation of result.operations) {
79
+ this.#emit({ type: "sdk.cleanup", operation: operation.operation, status: operation.status, error: operation.error, at: new Date().toISOString() });
80
+ }
81
+ if (result.state === "cleaned_up") {
82
+ this.#setStatus("cleaned_up");
83
+ }
84
+ if (result.state === "partial") {
85
+ throw new CleanupError("Cleanup partially failed", result.operations);
86
+ }
87
+ return result;
88
+ }
89
+ async terminate(reason) {
90
+ if (!this.#ids.sessionId) {
91
+ return;
92
+ }
93
+ this.#userTerminated = true;
94
+ this.#setStatus("terminating");
95
+ await this.#provider.terminateSession(this.#ids.sessionId, reason);
96
+ this.#finish("terminated");
97
+ }
98
+ async usage() {
99
+ if (!this.#ids.sessionId) {
100
+ return undefined;
101
+ }
102
+ return (await this.#provider.getSession(this.#ids.sessionId)).usage;
103
+ }
104
+ result() {
105
+ return this.wait();
106
+ }
107
+ async #consume() {
108
+ this.#setStatus("creating_provider_resources");
109
+ const prepared = await prepareSkills(this.#template);
110
+ this.#ids.environmentId = await this.#provider.createEnvironment(this.#template);
111
+ for (const upload of prepared.uploads) {
112
+ this.#ids.uploadedFileIds.push(await this.#provider.uploadFile(upload.input));
113
+ }
114
+ this.#ids.agentId = await this.#provider.createAgent(this.#template, prepared.providerSkillRefs);
115
+ if (Object.keys(this.#credentials).length > 0) {
116
+ this.#ids.vaultId = await this.#provider.createVault(`${this.#template.name}-${this.#template.hash.slice(0, 8)}`, {
117
+ antpath_template_hash: this.#template.hash
118
+ });
119
+ for (const server of this.#template.mcpServers) {
120
+ const credential = this.#credentials[server.key];
121
+ if (credential && this.#ids.vaultId) {
122
+ const created = await this.#provider.createCredential(this.#ids.vaultId, server.url, credential);
123
+ this.#ids.credentialIds.push(created.id);
124
+ }
125
+ }
126
+ }
127
+ this.#ids.sessionId = await this.#provider.createSession(this.#ids.agentId, this.#ids.environmentId, this.#ids.vaultId ? [this.#ids.vaultId] : [], toSessionResources(this.#ids.uploadedFileIds, prepared));
128
+ const abort = new AbortController();
129
+ this.#signal?.addEventListener("abort", () => abort.abort(this.#signal?.reason), { once: true });
130
+ const timeout = this.#timeoutMs === undefined
131
+ ? undefined
132
+ : setTimeout(() => {
133
+ void this.terminate("timeout");
134
+ }, this.#timeoutMs);
135
+ try {
136
+ const stream = this.#provider.streamEvents(this.#ids.sessionId, abort.signal);
137
+ await this.#sendNextMessage();
138
+ for await (const event of stream) {
139
+ this.#emit({ type: "provider.event", event, at: new Date().toISOString() });
140
+ if (event.type === "session.error") {
141
+ this.#fail(new RunStateError("Provider session.error event received", event));
142
+ return;
143
+ }
144
+ if (event.type === "session.status_terminated") {
145
+ this.#finish(this.#userTerminated ? "terminated" : "failed", this.#userTerminated ? undefined : "Provider session terminated");
146
+ return;
147
+ }
148
+ if (event.type === "session.status_idle") {
149
+ if (this.#messageIndex < this.#template.messages.length) {
150
+ this.#setStatus("idle_waiting_to_send_next_message");
151
+ await this.#sendNextMessage();
152
+ }
153
+ else {
154
+ this.#finish("succeeded");
155
+ return;
156
+ }
157
+ }
158
+ }
159
+ }
160
+ finally {
161
+ if (timeout)
162
+ clearTimeout(timeout);
163
+ abort.abort();
164
+ this.#events.close();
165
+ }
166
+ }
167
+ async #sendNextMessage() {
168
+ if (!this.#ids.sessionId) {
169
+ throw new RunStateError("Cannot send message before session is created");
170
+ }
171
+ const message = this.#template.messages[this.#messageIndex];
172
+ if (message === undefined) {
173
+ return;
174
+ }
175
+ this.#setStatus("running");
176
+ await this.#provider.sendUserMessage(this.#ids.sessionId, message);
177
+ this.#emit({ type: "sdk.message_sent", index: this.#messageIndex, at: new Date().toISOString() });
178
+ this.#messageIndex++;
179
+ }
180
+ async #buildResult(status, error) {
181
+ const session = this.#ids.sessionId ? await this.#provider.getSession(this.#ids.sessionId).catch(() => undefined) : undefined;
182
+ const result = {
183
+ status,
184
+ templateHash: this.#template.hash,
185
+ providerIds: { ...this.#ids, credentialIds: [...this.#ids.credentialIds], uploadedFileIds: [...this.#ids.uploadedFileIds] },
186
+ cleanupState: this.#cleanupState,
187
+ startedAt: this.#startedAt,
188
+ endedAt: new Date().toISOString()
189
+ };
190
+ if (session?.usage)
191
+ result.usage = session.usage;
192
+ if (error)
193
+ result.error = redactSecrets(error);
194
+ if (this.#outputManifest)
195
+ result.outputManifest = this.#outputManifest;
196
+ return result;
197
+ }
198
+ #setStatus(status) {
199
+ this.#status = status;
200
+ const event = { type: "sdk.status", status, at: new Date().toISOString() };
201
+ this.#emit(event);
202
+ }
203
+ #emit(event) {
204
+ this.#logger?.debug?.("antpath event", redactSecrets({ event }));
205
+ this.#events.emit(redactSecrets(event));
206
+ }
207
+ #finish(status, error) {
208
+ this.#setStatus(status);
209
+ this.#buildResult(status, error).then((result) => {
210
+ this.#finalResult = result;
211
+ this.#resolveResult(result);
212
+ this.#events.close();
213
+ }, this.#rejectResult);
214
+ }
215
+ #fail(error) {
216
+ this.#setStatus("failed");
217
+ this.#buildResult("failed", error.message).then((result) => {
218
+ this.#finalResult = result;
219
+ this.#resolveResult(result);
220
+ this.#events.close();
221
+ }, this.#rejectResult);
222
+ }
223
+ }
224
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/run/controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ResolvedTemplate } from "../template/compiler.js";
2
+ import type { SessionResourceInput, UploadFileInput, ProviderSkillRef } from "../providers/types.js";
3
+ export interface PreparedSkills {
4
+ providerSkillRefs: ProviderSkillRef[];
5
+ uploads: Array<{
6
+ input: UploadFileInput;
7
+ mountPath: string;
8
+ }>;
9
+ }
10
+ export declare function prepareSkills(template: ResolvedTemplate): Promise<PreparedSkills>;
11
+ export declare function toSessionResources(uploadedFileIds: string[], prepared: PreparedSkills): SessionResourceInput[];
@@ -0,0 +1,76 @@
1
+ import { readFile, stat, readdir } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ import { zipSync, strToU8 } from "fflate";
4
+ export async function prepareSkills(template) {
5
+ const providerSkillRefs = [];
6
+ const uploads = [];
7
+ for (const skill of template.skills) {
8
+ if (skill.type === "anthropic") {
9
+ providerSkillRefs.push(skill.version ? { type: "anthropic", skill_id: skill.skillId, version: skill.version } : { type: "anthropic", skill_id: skill.skillId });
10
+ }
11
+ else if (skill.type === "custom") {
12
+ providerSkillRefs.push(skill.version ? { type: "custom", skill_id: skill.skillId, version: skill.version } : { type: "custom", skill_id: skill.skillId });
13
+ }
14
+ else if (skill.type === "inline") {
15
+ const filename = `${skill.name}.md`;
16
+ uploads.push({
17
+ mountPath: skill.mountPath ?? `/antpath/skills/${filename}`,
18
+ input: {
19
+ filename,
20
+ mimeType: "text/markdown",
21
+ data: strToU8(skill.content)
22
+ }
23
+ });
24
+ }
25
+ else {
26
+ uploads.push({
27
+ mountPath: skill.mountPath ?? `/antpath/skills/${skill.name}.zip`,
28
+ input: await packageLocalSkill(skill)
29
+ });
30
+ }
31
+ }
32
+ return { providerSkillRefs, uploads };
33
+ }
34
+ export function toSessionResources(uploadedFileIds, prepared) {
35
+ return uploadedFileIds.map((fileId, index) => {
36
+ const resource = { type: "file", fileId };
37
+ const mountPath = prepared.uploads[index]?.mountPath;
38
+ if (mountPath)
39
+ resource.mountPath = mountPath;
40
+ return resource;
41
+ });
42
+ }
43
+ async function packageLocalSkill(skill) {
44
+ const pathStat = await stat(skill.path);
45
+ if (pathStat.isFile()) {
46
+ return {
47
+ filename: basename(skill.path),
48
+ data: await readFile(skill.path)
49
+ };
50
+ }
51
+ const entries = await collectFiles(skill.path);
52
+ const zipped = {};
53
+ for (const [relativePath, absolutePath] of entries) {
54
+ zipped[relativePath] = await readFile(absolutePath);
55
+ }
56
+ return {
57
+ filename: `${skill.name}.zip`,
58
+ mimeType: "application/zip",
59
+ data: zipSync(zipped)
60
+ };
61
+ }
62
+ async function collectFiles(root, current = root) {
63
+ const entries = await readdir(current, { withFileTypes: true });
64
+ const result = [];
65
+ for (const entry of entries) {
66
+ const absolute = join(current, entry.name);
67
+ if (entry.isDirectory()) {
68
+ result.push(...await collectFiles(root, absolute));
69
+ }
70
+ else if (entry.isFile()) {
71
+ result.push([absolute.slice(root.length + 1).replace(/\\/g, "/"), absolute]);
72
+ }
73
+ }
74
+ return result.sort(([a], [b]) => a.localeCompare(b));
75
+ }
76
+ //# sourceMappingURL=packager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packager.js","sourceRoot":"","sources":["../../src/skills/packager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { CredentialRequirement, EnvironmentDefinition, OutputDefinition, SkillDefinition, TemplateDefinition } from "./types.js";
2
+ export interface ResolvedMcpServer {
3
+ key: string;
4
+ name: string;
5
+ url: string;
6
+ auth?: CredentialRequirement | undefined;
7
+ tools?: {
8
+ allow?: string[] | undefined;
9
+ deny?: string[] | undefined;
10
+ } | undefined;
11
+ }
12
+ export interface ResolvedTemplate {
13
+ name: string;
14
+ hash: string;
15
+ model: string | {
16
+ id: string;
17
+ speed?: "standard" | "fast";
18
+ };
19
+ system?: string | undefined;
20
+ messages: string[];
21
+ mcpServers: ResolvedMcpServer[];
22
+ environment: EnvironmentDefinition;
23
+ skills: SkillDefinition[];
24
+ outputs: Required<Pick<OutputDefinition, "recommendedPath">> & Omit<OutputDefinition, "recommendedPath">;
25
+ metadata: Record<string, string>;
26
+ credentialRequirements: Record<string, CredentialRequirement>;
27
+ }
28
+ export declare function compileTemplate(template: TemplateDefinition, variables?: Record<string, string>): ResolvedTemplate;
@@ -0,0 +1,116 @@
1
+ import { TemplateValidationError } from "../errors.js";
2
+ import { containsSecretLikeValue } from "../utils/secrets.js";
3
+ import { sha256, stableStringify } from "../utils/stable.js";
4
+ const ESCAPED_OPEN = "\u0000ANTPATH_ESCAPED_OPEN\u0000";
5
+ const VARIABLE_PATTERN = /{{\s*([A-Za-z_][A-Za-z0-9_]*)\s*}}/g;
6
+ export function compileTemplate(template, variables = {}) {
7
+ assertTemplateShape(template);
8
+ const values = resolveVariableValues(template, variables);
9
+ const resolved = {
10
+ name: template.name,
11
+ model: resolveValue(template.model, values, template.variables ?? {}),
12
+ system: template.system === undefined ? undefined : resolveValue(template.system, values, template.variables ?? {}),
13
+ messages: template.messages.map((message) => resolveValue(message, values, template.variables ?? {})),
14
+ mcpServers: resolveMcpServers(template.mcpServers ?? {}, values, template.variables ?? {}),
15
+ environment: resolveValue(template.environment ?? {}, values, template.variables ?? {}),
16
+ skills: resolveValue(template.skills ?? [], values, template.variables ?? {}),
17
+ outputs: {
18
+ recommendedPath: "/antpath/outputs",
19
+ ...resolveValue(template.outputs ?? {}, values, template.variables ?? {})
20
+ },
21
+ metadata: resolveValue(template.metadata ?? {}, values, template.variables ?? {}),
22
+ credentialRequirements: {}
23
+ };
24
+ resolved.credentialRequirements = Object.fromEntries(resolved.mcpServers.filter((server) => server.auth).map((server) => [server.key, server.auth]));
25
+ scanForSecrets(resolved);
26
+ return {
27
+ ...resolved,
28
+ hash: sha256(stableStringify(resolved))
29
+ };
30
+ }
31
+ function assertTemplateShape(template) {
32
+ if (!template.name?.trim()) {
33
+ throw new TemplateValidationError("Template name is required");
34
+ }
35
+ if (!template.model) {
36
+ throw new TemplateValidationError("Template model is required");
37
+ }
38
+ if (!Array.isArray(template.messages) || template.messages.length === 0) {
39
+ throw new TemplateValidationError("Template must define at least one user message");
40
+ }
41
+ for (const [key, server] of Object.entries(template.mcpServers ?? {})) {
42
+ if (!/^[A-Za-z0-9_-]+$/.test(key)) {
43
+ throw new TemplateValidationError(`MCP server key '${key}' must use letters, numbers, underscores, or hyphens`);
44
+ }
45
+ if (server.tools?.allow && server.tools.deny) {
46
+ throw new TemplateValidationError(`MCP server '${key}' cannot define both allow and deny tool policies`);
47
+ }
48
+ }
49
+ }
50
+ function resolveVariableValues(template, variables) {
51
+ const definitions = template.variables ?? {};
52
+ const resolved = {};
53
+ for (const [key, definition] of Object.entries(definitions)) {
54
+ const value = variables[key] ?? definition.default;
55
+ if (value === undefined) {
56
+ continue;
57
+ }
58
+ if (typeof value !== "string") {
59
+ throw new TemplateValidationError(`Variable '${key}' must resolve to a string`);
60
+ }
61
+ resolved[key] = value;
62
+ }
63
+ for (const key of Object.keys(variables)) {
64
+ if (!definitions[key]) {
65
+ throw new TemplateValidationError(`Unknown Template variable '${key}'`);
66
+ }
67
+ }
68
+ return resolved;
69
+ }
70
+ function resolveMcpServers(servers, values, definitions) {
71
+ return Object.entries(servers).map(([key, server]) => {
72
+ const resolved = {
73
+ key,
74
+ name: key,
75
+ url: resolveValue(server.url, values, definitions ?? {})
76
+ };
77
+ if (server.auth)
78
+ resolved.auth = server.auth;
79
+ if (server.tools)
80
+ resolved.tools = resolveValue(server.tools, values, definitions ?? {});
81
+ return resolved;
82
+ });
83
+ }
84
+ function resolveValue(value, variables, definitions) {
85
+ if (typeof value === "string") {
86
+ return resolveString(value, variables, definitions);
87
+ }
88
+ if (Array.isArray(value)) {
89
+ return value.map((item) => resolveValue(item, variables, definitions));
90
+ }
91
+ if (value && typeof value === "object") {
92
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, resolveValue(item, variables, definitions)]));
93
+ }
94
+ return value;
95
+ }
96
+ function resolveString(input, variables, definitions) {
97
+ const protectedInput = input.replace(/\\{{/g, ESCAPED_OPEN);
98
+ const resolved = protectedInput.replace(VARIABLE_PATTERN, (_match, name) => {
99
+ if (!definitions[name]) {
100
+ throw new TemplateValidationError(`Unresolved Template variable '${name}'`);
101
+ }
102
+ const value = variables[name];
103
+ if (value === undefined) {
104
+ throw new TemplateValidationError(`Missing value for Template variable '${name}'`);
105
+ }
106
+ return value;
107
+ });
108
+ return resolved.replace(new RegExp(ESCAPED_OPEN, "g"), "{{");
109
+ }
110
+ function scanForSecrets(value) {
111
+ const serialized = stableStringify(value);
112
+ if (containsSecretLikeValue(serialized)) {
113
+ throw new TemplateValidationError("Template contains a secret-like value; pass secrets through typed credentials instead");
114
+ }
115
+ }
116
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/template/compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CredentialRequirement, TemplateDefinition, TemplateVariableDefinition } from "./types.js";
2
+ export type { TemplateDefinition, TemplateVariableDefinition } from "./types.js";
3
+ export { compileTemplate, type ResolvedTemplate } from "./compiler.js";
4
+ export declare function defineTemplate<TVariables extends Record<string, TemplateVariableDefinition> = Record<string, never>>(definition: TemplateDefinition<TVariables>): TemplateDefinition<TVariables>;
5
+ export declare function string(options?: {
6
+ default?: string;
7
+ description?: string;
8
+ }): TemplateVariableDefinition;
9
+ export declare function requiredStaticBearer(): CredentialRequirement;
10
+ export declare function requiredOAuthAccessToken(): CredentialRequirement;
@@ -0,0 +1,14 @@
1
+ export { compileTemplate } from "./compiler.js";
2
+ export function defineTemplate(definition) {
3
+ return Object.freeze(definition);
4
+ }
5
+ export function string(options = {}) {
6
+ return { type: "string", ...options };
7
+ }
8
+ export function requiredStaticBearer() {
9
+ return { type: "static_bearer", required: true };
10
+ }
11
+ export function requiredOAuthAccessToken() {
12
+ return { type: "oauth_access_token", required: true };
13
+ }
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAyB,MAAM,eAAe,CAAC;AAEvE,MAAM,UAAU,cAAc,CAC5B,UAA0C;IAE1C,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,UAAsD,EAAE;IAC7E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACxD,CAAC"}