@shogo-ai/cli 1.4.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.
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/deploy.ts
21
+ var deploy_exports = {};
22
+ __export(deploy_exports, {
23
+ AGENT_NAME_PATTERN: () => AGENT_NAME_PATTERN,
24
+ buildSyncPayload: () => buildSyncPayload,
25
+ normalizeToolEntry: () => normalizeToolEntry,
26
+ runDeploy: () => runDeploy,
27
+ validateManifest: () => validateManifest
28
+ });
29
+ module.exports = __toCommonJS(deploy_exports);
30
+ var AGENT_NAME_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/;
31
+ var KNOWN_KEYS = /* @__PURE__ */ new Set([
32
+ "systemPrompt",
33
+ "tools",
34
+ "characterName",
35
+ "displayName",
36
+ "voiceId",
37
+ "firstMessage",
38
+ "model"
39
+ ]);
40
+ function validateManifest(raw) {
41
+ const issues = [];
42
+ if (raw == null) return { agents: {}, issues };
43
+ if (typeof raw !== "object" || Array.isArray(raw)) {
44
+ issues.push({
45
+ path: "agents",
46
+ message: "`agents` must be an object keyed by agent name"
47
+ });
48
+ return { agents: {}, issues };
49
+ }
50
+ const agents = {};
51
+ for (const [name, value] of Object.entries(raw)) {
52
+ if (!AGENT_NAME_PATTERN.test(name)) {
53
+ issues.push({
54
+ path: `agents.${name}`,
55
+ message: `agent name must match ${AGENT_NAME_PATTERN}`
56
+ });
57
+ continue;
58
+ }
59
+ if (value == null || typeof value !== "object" || Array.isArray(value)) {
60
+ issues.push({
61
+ path: `agents.${name}`,
62
+ message: "value must be an object"
63
+ });
64
+ continue;
65
+ }
66
+ const entry = {};
67
+ for (const [k, v] of Object.entries(value)) {
68
+ if (!KNOWN_KEYS.has(k)) {
69
+ issues.push({
70
+ path: `agents.${name}.${k}`,
71
+ message: `unknown field; supported: ${[...KNOWN_KEYS].join(", ")}`
72
+ });
73
+ continue;
74
+ }
75
+ if (k === "tools") {
76
+ if (!Array.isArray(v)) {
77
+ issues.push({
78
+ path: `agents.${name}.tools`,
79
+ message: "must be an array of strings or { name, description?, inputSchema? } objects"
80
+ });
81
+ continue;
82
+ }
83
+ const tools = [];
84
+ const seenNames = /* @__PURE__ */ new Set();
85
+ let valid = true;
86
+ for (let i = 0; i < v.length; i++) {
87
+ const t = v[i];
88
+ if (typeof t === "string") {
89
+ if (t.length === 0) {
90
+ issues.push({
91
+ path: `agents.${name}.tools[${i}]`,
92
+ message: "tool name must be a non-empty string"
93
+ });
94
+ valid = false;
95
+ continue;
96
+ }
97
+ if (seenNames.has(t)) {
98
+ issues.push({
99
+ path: `agents.${name}.tools[${i}]`,
100
+ message: `duplicate tool name '${t}'`
101
+ });
102
+ valid = false;
103
+ continue;
104
+ }
105
+ seenNames.add(t);
106
+ tools.push(t);
107
+ continue;
108
+ }
109
+ if (t == null || typeof t !== "object" || Array.isArray(t)) {
110
+ issues.push({
111
+ path: `agents.${name}.tools[${i}]`,
112
+ message: "tools entries must be a string or { name, description?, inputSchema? }"
113
+ });
114
+ valid = false;
115
+ continue;
116
+ }
117
+ const obj = t;
118
+ if (typeof obj.name !== "string" || obj.name.length === 0) {
119
+ issues.push({
120
+ path: `agents.${name}.tools[${i}].name`,
121
+ message: "name is required and must be a non-empty string"
122
+ });
123
+ valid = false;
124
+ continue;
125
+ }
126
+ if (seenNames.has(obj.name)) {
127
+ issues.push({
128
+ path: `agents.${name}.tools[${i}]`,
129
+ message: `duplicate tool name '${obj.name}'`
130
+ });
131
+ valid = false;
132
+ continue;
133
+ }
134
+ if (obj.description !== void 0 && typeof obj.description !== "string") {
135
+ issues.push({
136
+ path: `agents.${name}.tools[${i}].description`,
137
+ message: "description must be a string"
138
+ });
139
+ valid = false;
140
+ continue;
141
+ }
142
+ if (obj.inputSchema !== void 0 && (obj.inputSchema === null || typeof obj.inputSchema !== "object" || Array.isArray(obj.inputSchema))) {
143
+ issues.push({
144
+ path: `agents.${name}.tools[${i}].inputSchema`,
145
+ message: "inputSchema must be a JSON Schema object"
146
+ });
147
+ valid = false;
148
+ continue;
149
+ }
150
+ seenNames.add(obj.name);
151
+ const descriptor = { name: obj.name };
152
+ if (typeof obj.description === "string") {
153
+ descriptor.description = obj.description;
154
+ }
155
+ if (obj.inputSchema !== void 0) {
156
+ descriptor.inputSchema = obj.inputSchema;
157
+ }
158
+ tools.push(descriptor);
159
+ }
160
+ if (valid) entry.tools = tools;
161
+ continue;
162
+ }
163
+ if (typeof v !== "string") {
164
+ issues.push({
165
+ path: `agents.${name}.${k}`,
166
+ message: "must be a string"
167
+ });
168
+ continue;
169
+ }
170
+ ;
171
+ entry[k] = v;
172
+ }
173
+ if (entry.voiceId && !entry.firstMessage) {
174
+ issues.push({
175
+ path: `agents.${name}.firstMessage`,
176
+ message: "voiceId is set; consider providing firstMessage so the agent has a greeting"
177
+ });
178
+ }
179
+ agents[name] = entry;
180
+ }
181
+ return { agents, issues };
182
+ }
183
+ function normalizeToolEntry(entry) {
184
+ if (typeof entry === "string") return { name: entry };
185
+ const out = { name: entry.name };
186
+ if (entry.description !== void 0) out.description = entry.description;
187
+ if (entry.inputSchema !== void 0) out.inputSchema = entry.inputSchema;
188
+ return out;
189
+ }
190
+ function buildSyncPayload(opts) {
191
+ const out = { agents: {}, prune: opts.prune, dryRun: opts.dryRun };
192
+ for (const [name, entry] of Object.entries(opts.manifest)) {
193
+ const a = {};
194
+ if (entry.systemPrompt !== void 0) a.systemPrompt = entry.systemPrompt;
195
+ if (entry.tools !== void 0) {
196
+ a.tools = entry.tools.map(normalizeToolEntry);
197
+ }
198
+ if (entry.characterName !== void 0) a.characterName = entry.characterName;
199
+ if (entry.displayName !== void 0) a.displayName = entry.displayName;
200
+ if (entry.voiceId !== void 0) a.voiceId = entry.voiceId;
201
+ if (entry.firstMessage !== void 0) a.firstMessage = entry.firstMessage;
202
+ if (entry.model !== void 0) a.model = entry.model;
203
+ out.agents[name] = a;
204
+ }
205
+ return out;
206
+ }
207
+ function resolveDeployHeaders(options) {
208
+ const headers = {
209
+ "content-type": "application/json"
210
+ };
211
+ const auth = options.auth ?? (options.shogoApiKey ? { kind: "apiKey", apiKey: options.shogoApiKey } : void 0);
212
+ if (!auth) {
213
+ throw new Error(
214
+ 'runDeploy: missing auth \u2014 pass `auth: { kind: "apiKey", apiKey }` or `auth: { kind: "runtimeToken", token }`'
215
+ );
216
+ }
217
+ if (auth.kind === "apiKey") {
218
+ headers.authorization = `Bearer ${auth.apiKey}`;
219
+ } else {
220
+ headers["x-runtime-token"] = auth.token;
221
+ }
222
+ return headers;
223
+ }
224
+ async function runDeploy(options) {
225
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
226
+ if (typeof fetchImpl !== "function") {
227
+ throw new Error("runDeploy: global fetch is unavailable; pass options.fetchImpl");
228
+ }
229
+ const url = `${options.apiUrl.replace(/\/+$/, "")}/api/projects/${encodeURIComponent(options.projectId)}/agents/sync`;
230
+ const payload = buildSyncPayload({
231
+ manifest: options.manifest,
232
+ prune: options.prune,
233
+ dryRun: options.dryRun
234
+ });
235
+ const res = await fetchImpl(url, {
236
+ method: "POST",
237
+ headers: resolveDeployHeaders(options),
238
+ body: JSON.stringify(payload)
239
+ });
240
+ let body = null;
241
+ try {
242
+ body = await res.json();
243
+ } catch {
244
+ }
245
+ return { status: res.status, body };
246
+ }
247
+ // Annotate the CommonJS export names for ESM import in node:
248
+ 0 && (module.exports = {
249
+ AGENT_NAME_PATTERN,
250
+ buildSyncPayload,
251
+ normalizeToolEntry,
252
+ runDeploy,
253
+ validateManifest
254
+ });
255
+ //# sourceMappingURL=deploy.cjs.map
@@ -0,0 +1,168 @@
1
+ /**
2
+ * `shogo deploy` — reconcile `shogo.config.json#agents` with the
3
+ * project's cloud-side `project_agents` table.
4
+ *
5
+ * The CLI is a thin wrapper around
6
+ * `POST /api/projects/:projectId/agents/sync` (apps/api). All
7
+ * validation of the manifest happens once on the client (here) and
8
+ * once on the server (`projectAgentSync.service.ts`). The server is
9
+ * still authoritative — but pushing validation to the CLI gives users
10
+ * helpful errors before any network round-trip and makes the deploy
11
+ * command CI-friendly.
12
+ *
13
+ * Pure module: no I/O at import time. Side effects (fetch, console)
14
+ * are reachable only through `runDeploy`. The validator and payload
15
+ * builder are exported so unit tests can exercise them without
16
+ * spinning up a network mock.
17
+ */
18
+ /**
19
+ * A tool the named agent is permitted to invoke. Either form is
20
+ * accepted in `shogo.config.json`:
21
+ *
22
+ * - `"add_memory"` — name-only sugar; the consumer's `clientTools`
23
+ * map is responsible for declaring the schema to the model. Used
24
+ * for backwards-compat with manifests written before tool schemas
25
+ * existed.
26
+ * - `{ name, description?, inputSchema? }` — full descriptor. The
27
+ * manifest becomes the source of truth: ElevenLabs gets the same
28
+ * schema (so the voice agent can `tool-call`), and the chat route
29
+ * declares it to `streamText` directly. `clientTools` only needs
30
+ * to provide the handler.
31
+ */
32
+ type AgentToolEntry = string | {
33
+ name: string;
34
+ description?: string;
35
+ inputSchema?: Record<string, unknown>;
36
+ };
37
+ /**
38
+ * Normalized tool descriptor shipped on the wire to
39
+ * `POST /api/projects/:id/agents/sync`. String sugar from the manifest
40
+ * is expanded to `{ name }` here so the API receives a single shape.
41
+ */
42
+ interface ToolDescriptor {
43
+ name: string;
44
+ description?: string;
45
+ inputSchema?: Record<string, unknown>;
46
+ }
47
+ interface AgentManifestEntry {
48
+ systemPrompt?: string;
49
+ /**
50
+ * Tools the named agent is permitted to invoke. See {@link AgentToolEntry}.
51
+ * After validation the descriptors are normalized to
52
+ * {@link ToolDescriptor}; `manifest.tools` keeps the user's original
53
+ * shape so downstream code can preserve sugar in error messages.
54
+ */
55
+ tools?: AgentToolEntry[];
56
+ characterName?: string;
57
+ displayName?: string;
58
+ voiceId?: string;
59
+ firstMessage?: string;
60
+ /**
61
+ * Chat-side model id (forwarded to the AI proxy / Anthropic
62
+ * directly). Falls back to the project's default chat model when
63
+ * unset.
64
+ */
65
+ model?: string;
66
+ }
67
+ interface AgentsManifest {
68
+ [name: string]: AgentManifestEntry;
69
+ }
70
+ /** Allowed agent name shape; server enforces the same regex. */
71
+ declare const AGENT_NAME_PATTERN: RegExp;
72
+ interface ValidationIssue {
73
+ /** Dot-path to the offending field, e.g. `agents.architect.tools[2]`. */
74
+ path: string;
75
+ message: string;
76
+ }
77
+ interface ValidatedManifest {
78
+ agents: AgentsManifest;
79
+ issues: ValidationIssue[];
80
+ }
81
+ /**
82
+ * Validate the `agents` block of a parsed `shogo.config.json`.
83
+ * Returns the trimmed manifest plus a list of issues. The deploy
84
+ * command treats a non-empty issues list as a hard failure unless
85
+ * the caller passes `--force` (not implemented here; the CLI layer
86
+ * decides).
87
+ */
88
+ declare function validateManifest(raw: unknown): ValidatedManifest;
89
+ interface BuildSyncPayloadOptions {
90
+ manifest: AgentsManifest;
91
+ prune: boolean;
92
+ dryRun: boolean;
93
+ }
94
+ /** Wire payload for `POST /api/projects/:id/agents/sync`. */
95
+ interface SyncPayload {
96
+ agents: Record<string, {
97
+ systemPrompt?: string;
98
+ tools?: ToolDescriptor[];
99
+ characterName?: string;
100
+ displayName?: string;
101
+ voiceId?: string;
102
+ firstMessage?: string;
103
+ model?: string;
104
+ }>;
105
+ prune: boolean;
106
+ dryRun: boolean;
107
+ }
108
+ /** Expand string sugar into a normalized {@link ToolDescriptor}. */
109
+ declare function normalizeToolEntry(entry: AgentToolEntry): ToolDescriptor;
110
+ /**
111
+ * Convert a CLI-side manifest to the wire shape the API expects. The
112
+ * shape matches `apps/api/src/services/projectAgentSync.service.ts`.
113
+ *
114
+ * Tool entries are normalized to `ToolDescriptor[]` here — the API
115
+ * never sees the string sugar.
116
+ */
117
+ declare function buildSyncPayload(opts: BuildSyncPayloadOptions): SyncPayload;
118
+ /**
119
+ * Two ways to authenticate a deploy:
120
+ *
121
+ * - `apiKey` — `Authorization: Bearer shogo_sk_*`. The default for
122
+ * a developer running `shogo deploy` from their own machine.
123
+ * - `runtimeToken` — `x-runtime-token: <token>`. The path used by
124
+ * `shogo dev` preflight inside a warm pod, where the pod's
125
+ * runtime token is already in env (`RUNTIME_AUTH_SECRET`).
126
+ *
127
+ * The server enforces that runtime-token deploys are scoped to the
128
+ * token's own project (no cross-project mutations).
129
+ */
130
+ type DeployAuth = {
131
+ kind: 'apiKey';
132
+ apiKey: string;
133
+ } | {
134
+ kind: 'runtimeToken';
135
+ token: string;
136
+ };
137
+ interface RunDeployOptions {
138
+ apiUrl: string;
139
+ projectId: string;
140
+ manifest: AgentsManifest;
141
+ prune: boolean;
142
+ dryRun: boolean;
143
+ /**
144
+ * Authentication for the deploy request. Either `{ kind: 'apiKey',
145
+ * apiKey }` (developer flow) or `{ kind: 'runtimeToken', token }`
146
+ * (warm-pod preflight flow).
147
+ *
148
+ * Legacy callers may still pass `shogoApiKey` directly — it is
149
+ * promoted to `auth: { kind: 'apiKey', apiKey: shogoApiKey }` for
150
+ * backwards compatibility.
151
+ */
152
+ auth?: DeployAuth;
153
+ /** @deprecated Pass `auth: { kind: 'apiKey', apiKey }` instead. */
154
+ shogoApiKey?: string;
155
+ fetchImpl?: typeof fetch;
156
+ }
157
+ interface RunDeployResult {
158
+ status: number;
159
+ body: unknown;
160
+ }
161
+ /**
162
+ * Issue the sync request. Caller is responsible for resolving
163
+ * `apiUrl`, `projectId`, and `auth` (typically from the environment +
164
+ * `shogo.config.json`).
165
+ */
166
+ declare function runDeploy(options: RunDeployOptions): Promise<RunDeployResult>;
167
+
168
+ export { AGENT_NAME_PATTERN, type AgentManifestEntry, type AgentToolEntry, type AgentsManifest, type BuildSyncPayloadOptions, type DeployAuth, type RunDeployOptions, type RunDeployResult, type SyncPayload, type ToolDescriptor, type ValidatedManifest, type ValidationIssue, buildSyncPayload, normalizeToolEntry, runDeploy, validateManifest };
@@ -0,0 +1,168 @@
1
+ /**
2
+ * `shogo deploy` — reconcile `shogo.config.json#agents` with the
3
+ * project's cloud-side `project_agents` table.
4
+ *
5
+ * The CLI is a thin wrapper around
6
+ * `POST /api/projects/:projectId/agents/sync` (apps/api). All
7
+ * validation of the manifest happens once on the client (here) and
8
+ * once on the server (`projectAgentSync.service.ts`). The server is
9
+ * still authoritative — but pushing validation to the CLI gives users
10
+ * helpful errors before any network round-trip and makes the deploy
11
+ * command CI-friendly.
12
+ *
13
+ * Pure module: no I/O at import time. Side effects (fetch, console)
14
+ * are reachable only through `runDeploy`. The validator and payload
15
+ * builder are exported so unit tests can exercise them without
16
+ * spinning up a network mock.
17
+ */
18
+ /**
19
+ * A tool the named agent is permitted to invoke. Either form is
20
+ * accepted in `shogo.config.json`:
21
+ *
22
+ * - `"add_memory"` — name-only sugar; the consumer's `clientTools`
23
+ * map is responsible for declaring the schema to the model. Used
24
+ * for backwards-compat with manifests written before tool schemas
25
+ * existed.
26
+ * - `{ name, description?, inputSchema? }` — full descriptor. The
27
+ * manifest becomes the source of truth: ElevenLabs gets the same
28
+ * schema (so the voice agent can `tool-call`), and the chat route
29
+ * declares it to `streamText` directly. `clientTools` only needs
30
+ * to provide the handler.
31
+ */
32
+ type AgentToolEntry = string | {
33
+ name: string;
34
+ description?: string;
35
+ inputSchema?: Record<string, unknown>;
36
+ };
37
+ /**
38
+ * Normalized tool descriptor shipped on the wire to
39
+ * `POST /api/projects/:id/agents/sync`. String sugar from the manifest
40
+ * is expanded to `{ name }` here so the API receives a single shape.
41
+ */
42
+ interface ToolDescriptor {
43
+ name: string;
44
+ description?: string;
45
+ inputSchema?: Record<string, unknown>;
46
+ }
47
+ interface AgentManifestEntry {
48
+ systemPrompt?: string;
49
+ /**
50
+ * Tools the named agent is permitted to invoke. See {@link AgentToolEntry}.
51
+ * After validation the descriptors are normalized to
52
+ * {@link ToolDescriptor}; `manifest.tools` keeps the user's original
53
+ * shape so downstream code can preserve sugar in error messages.
54
+ */
55
+ tools?: AgentToolEntry[];
56
+ characterName?: string;
57
+ displayName?: string;
58
+ voiceId?: string;
59
+ firstMessage?: string;
60
+ /**
61
+ * Chat-side model id (forwarded to the AI proxy / Anthropic
62
+ * directly). Falls back to the project's default chat model when
63
+ * unset.
64
+ */
65
+ model?: string;
66
+ }
67
+ interface AgentsManifest {
68
+ [name: string]: AgentManifestEntry;
69
+ }
70
+ /** Allowed agent name shape; server enforces the same regex. */
71
+ declare const AGENT_NAME_PATTERN: RegExp;
72
+ interface ValidationIssue {
73
+ /** Dot-path to the offending field, e.g. `agents.architect.tools[2]`. */
74
+ path: string;
75
+ message: string;
76
+ }
77
+ interface ValidatedManifest {
78
+ agents: AgentsManifest;
79
+ issues: ValidationIssue[];
80
+ }
81
+ /**
82
+ * Validate the `agents` block of a parsed `shogo.config.json`.
83
+ * Returns the trimmed manifest plus a list of issues. The deploy
84
+ * command treats a non-empty issues list as a hard failure unless
85
+ * the caller passes `--force` (not implemented here; the CLI layer
86
+ * decides).
87
+ */
88
+ declare function validateManifest(raw: unknown): ValidatedManifest;
89
+ interface BuildSyncPayloadOptions {
90
+ manifest: AgentsManifest;
91
+ prune: boolean;
92
+ dryRun: boolean;
93
+ }
94
+ /** Wire payload for `POST /api/projects/:id/agents/sync`. */
95
+ interface SyncPayload {
96
+ agents: Record<string, {
97
+ systemPrompt?: string;
98
+ tools?: ToolDescriptor[];
99
+ characterName?: string;
100
+ displayName?: string;
101
+ voiceId?: string;
102
+ firstMessage?: string;
103
+ model?: string;
104
+ }>;
105
+ prune: boolean;
106
+ dryRun: boolean;
107
+ }
108
+ /** Expand string sugar into a normalized {@link ToolDescriptor}. */
109
+ declare function normalizeToolEntry(entry: AgentToolEntry): ToolDescriptor;
110
+ /**
111
+ * Convert a CLI-side manifest to the wire shape the API expects. The
112
+ * shape matches `apps/api/src/services/projectAgentSync.service.ts`.
113
+ *
114
+ * Tool entries are normalized to `ToolDescriptor[]` here — the API
115
+ * never sees the string sugar.
116
+ */
117
+ declare function buildSyncPayload(opts: BuildSyncPayloadOptions): SyncPayload;
118
+ /**
119
+ * Two ways to authenticate a deploy:
120
+ *
121
+ * - `apiKey` — `Authorization: Bearer shogo_sk_*`. The default for
122
+ * a developer running `shogo deploy` from their own machine.
123
+ * - `runtimeToken` — `x-runtime-token: <token>`. The path used by
124
+ * `shogo dev` preflight inside a warm pod, where the pod's
125
+ * runtime token is already in env (`RUNTIME_AUTH_SECRET`).
126
+ *
127
+ * The server enforces that runtime-token deploys are scoped to the
128
+ * token's own project (no cross-project mutations).
129
+ */
130
+ type DeployAuth = {
131
+ kind: 'apiKey';
132
+ apiKey: string;
133
+ } | {
134
+ kind: 'runtimeToken';
135
+ token: string;
136
+ };
137
+ interface RunDeployOptions {
138
+ apiUrl: string;
139
+ projectId: string;
140
+ manifest: AgentsManifest;
141
+ prune: boolean;
142
+ dryRun: boolean;
143
+ /**
144
+ * Authentication for the deploy request. Either `{ kind: 'apiKey',
145
+ * apiKey }` (developer flow) or `{ kind: 'runtimeToken', token }`
146
+ * (warm-pod preflight flow).
147
+ *
148
+ * Legacy callers may still pass `shogoApiKey` directly — it is
149
+ * promoted to `auth: { kind: 'apiKey', apiKey: shogoApiKey }` for
150
+ * backwards compatibility.
151
+ */
152
+ auth?: DeployAuth;
153
+ /** @deprecated Pass `auth: { kind: 'apiKey', apiKey }` instead. */
154
+ shogoApiKey?: string;
155
+ fetchImpl?: typeof fetch;
156
+ }
157
+ interface RunDeployResult {
158
+ status: number;
159
+ body: unknown;
160
+ }
161
+ /**
162
+ * Issue the sync request. Caller is responsible for resolving
163
+ * `apiUrl`, `projectId`, and `auth` (typically from the environment +
164
+ * `shogo.config.json`).
165
+ */
166
+ declare function runDeploy(options: RunDeployOptions): Promise<RunDeployResult>;
167
+
168
+ export { AGENT_NAME_PATTERN, type AgentManifestEntry, type AgentToolEntry, type AgentsManifest, type BuildSyncPayloadOptions, type DeployAuth, type RunDeployOptions, type RunDeployResult, type SyncPayload, type ToolDescriptor, type ValidatedManifest, type ValidationIssue, buildSyncPayload, normalizeToolEntry, runDeploy, validateManifest };
package/dist/deploy.js ADDED
@@ -0,0 +1,15 @@
1
+ import {
2
+ AGENT_NAME_PATTERN,
3
+ buildSyncPayload,
4
+ normalizeToolEntry,
5
+ runDeploy,
6
+ validateManifest
7
+ } from "./chunk-YYO73V5H.js";
8
+ export {
9
+ AGENT_NAME_PATTERN,
10
+ buildSyncPayload,
11
+ normalizeToolEntry,
12
+ runDeploy,
13
+ validateManifest
14
+ };
15
+ //# sourceMappingURL=deploy.js.map