@adcp/client 4.22.1 → 4.24.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.
- package/README.md +23 -9
- package/bin/adcp.js +83 -18
- package/dist/lib/index.d.ts +3 -5
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +16 -12
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/server/index.d.ts +5 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +10 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/postgres-task-store.d.ts +105 -0
- package/dist/lib/server/postgres-task-store.d.ts.map +1 -0
- package/dist/lib/server/postgres-task-store.js +267 -0
- package/dist/lib/server/postgres-task-store.js.map +1 -0
- package/dist/lib/server/responses.d.ts +1 -0
- package/dist/lib/server/responses.d.ts.map +1 -1
- package/dist/lib/server/responses.js +1 -0
- package/dist/lib/server/responses.js.map +1 -1
- package/dist/lib/server/test-controller.d.ts +88 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -0
- package/dist/lib/server/test-controller.js +227 -0
- package/dist/lib/server/test-controller.js.map +1 -0
- package/dist/lib/testing/agent-tester.d.ts +1 -1
- package/dist/lib/testing/agent-tester.d.ts.map +1 -1
- package/dist/lib/testing/agent-tester.js +13 -1
- package/dist/lib/testing/agent-tester.js.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts +24 -5
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +318 -277
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/index.d.ts +2 -1
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +6 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/platform-storyboards.d.ts +44 -0
- package/dist/lib/testing/compliance/platform-storyboards.d.ts.map +1 -0
- package/dist/lib/testing/compliance/platform-storyboards.js +232 -0
- package/dist/lib/testing/compliance/platform-storyboards.js.map +1 -0
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts +2 -9
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.js +15 -46
- package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -1
- package/dist/lib/testing/compliance/types.d.ts +22 -1
- package/dist/lib/testing/compliance/types.d.ts.map +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +6 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/orchestrator.d.ts.map +1 -1
- package/dist/lib/testing/orchestrator.js +5 -1
- package/dist/lib/testing/orchestrator.js.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.d.ts +19 -1
- package/dist/lib/testing/scenarios/brand-rights.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.js +138 -1
- package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
- package/dist/lib/testing/scenarios/deterministic.js +7 -7
- package/dist/lib/testing/scenarios/deterministic.js.map +1 -1
- package/dist/lib/testing/scenarios/index.d.ts +1 -1
- package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/index.js +4 -2
- package/dist/lib/testing/scenarios/index.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +4 -4
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/storyboard/loader.d.ts +1 -0
- package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/loader.js +14 -0
- package/dist/lib/testing/storyboard/loader.js.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.js +88 -11
- package/dist/lib/testing/storyboard/request-builder.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +83 -5
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/task-map.d.ts +2 -0
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/task-map.js +23 -9
- package/dist/lib/testing/storyboard/task-map.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +6 -2
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +21 -4
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/testing/types.d.ts +1 -1
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +242 -3
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +1 -1
- package/dist/lib/types/schemas.generated.d.ts +3697 -3468
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +226 -118
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +281 -79
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.d.ts +2 -2
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +9 -3
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/utils/response-schemas.d.ts.map +1 -1
- package/dist/lib/utils/response-schemas.js +9 -0
- package/dist/lib/utils/response-schemas.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/docs/llms.txt +56 -32
- package/package.json +8 -2
- package/skills/adcp/SKILL.md +118 -33
- package/skills/build-creative-agent/SKILL.md +221 -0
- package/skills/build-generative-seller-agent/SKILL.md +288 -0
- package/skills/build-retail-media-agent/SKILL.md +237 -0
- package/skills/build-seller-agent/SKILL.md +313 -0
- package/skills/build-signals-agent/SKILL.md +203 -0
- package/storyboards/audience_sync.yaml +18 -29
- package/storyboards/behavioral_analysis.yaml +40 -72
- package/storyboards/brand_rights.yaml +172 -75
- package/storyboards/campaign_governance_conditions.yaml +187 -0
- package/storyboards/campaign_governance_delivery.yaml +231 -0
- package/storyboards/campaign_governance_denied.yaml +136 -0
- package/storyboards/capability_discovery.yaml +106 -0
- package/storyboards/content_standards.yaml +251 -0
- package/storyboards/creative_ad_server.yaml +108 -16
- package/storyboards/creative_generative.yaml +317 -0
- package/storyboards/creative_lifecycle.yaml +284 -0
- package/storyboards/creative_sales_agent.yaml +2 -6
- package/storyboards/creative_template.yaml +3 -6
- package/storyboards/deterministic_testing.yaml +271 -245
- package/storyboards/error_compliance.yaml +105 -108
- package/storyboards/media_buy_catalog_creative.yaml +8 -5
- package/storyboards/media_buy_generative_seller.yaml +581 -0
- package/storyboards/media_buy_governance_escalation.yaml +10 -6
- package/storyboards/media_buy_guaranteed_approval.yaml +21 -19
- package/storyboards/media_buy_non_guaranteed.yaml +9 -8
- package/storyboards/media_buy_proposal_mode.yaml +12 -11
- package/storyboards/media_buy_seller.yaml +161 -173
- package/storyboards/media_buy_state_machine.yaml +102 -101
- package/storyboards/property_governance.yaml +239 -0
- package/storyboards/schema.yaml +3 -2
- package/storyboards/schema_validation.yaml +58 -51
- package/storyboards/si_session.yaml +99 -317
- package/storyboards/signal_marketplace.yaml +9 -5
- package/storyboards/signal_owned.yaml +6 -5
- package/storyboards/social_platform.yaml +274 -0
- package/storyboards/test-kits/acme-outdoor.yaml +118 -0
- package/storyboards/test-kits/nova-motors.yaml +134 -0
- package/storyboards/governance_content_standards.yaml +0 -213
- package/storyboards/governance_property_lists.yaml +0 -372
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PostgreSQL-backed TaskStore for distributed MCP servers.
|
|
4
|
+
*
|
|
5
|
+
* Replaces InMemoryTaskStore when running multiple server instances behind
|
|
6
|
+
* a load balancer. Tasks are stored in a shared table so any instance can
|
|
7
|
+
* create, retrieve, or update a task regardless of which instance handled
|
|
8
|
+
* the original request.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { Pool } from 'pg';
|
|
13
|
+
* import { PostgresTaskStore, serve, createTaskCapableServer } from '@adcp/client';
|
|
14
|
+
*
|
|
15
|
+
* const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
16
|
+
* const taskStore = new PostgresTaskStore(pool);
|
|
17
|
+
*
|
|
18
|
+
* serve(({ taskStore }) => createTaskCapableServer('My Agent', '1.0.0', { taskStore }), {
|
|
19
|
+
* taskStore,
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.PostgresTaskStore = exports.MCP_TASKS_MIGRATION = void 0;
|
|
25
|
+
exports.getMcpTasksMigration = getMcpTasksMigration;
|
|
26
|
+
exports.cleanupExpiredTasks = cleanupExpiredTasks;
|
|
27
|
+
const node_crypto_1 = require("node:crypto");
|
|
28
|
+
/** Default table name — vendor-prefixed to avoid collisions in consumer databases. */
|
|
29
|
+
const DEFAULT_TABLE = 'adcp_mcp_tasks';
|
|
30
|
+
/** Validates a SQL identifier to prevent injection via table/constraint names. */
|
|
31
|
+
const VALID_IDENTIFIER = /^[a-z_][a-z0-9_]*$/;
|
|
32
|
+
/** Page size for listTasks pagination (matches InMemoryTaskStore). */
|
|
33
|
+
const PAGE_SIZE = 10;
|
|
34
|
+
/**
|
|
35
|
+
* Generate the SQL DDL for the task store table.
|
|
36
|
+
*
|
|
37
|
+
* Constraint and index names are derived from the table name to avoid
|
|
38
|
+
* collisions when multiple stores share the same database.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* import { getMcpTasksMigration } from '@adcp/client';
|
|
43
|
+
* await pool.query(getMcpTasksMigration()); // creates adcp_mcp_tasks
|
|
44
|
+
* await pool.query(getMcpTasksMigration({ tableName: 'my_tasks' })); // custom name
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
function getMcpTasksMigration(options) {
|
|
48
|
+
const table = options?.tableName ?? DEFAULT_TABLE;
|
|
49
|
+
if (!VALID_IDENTIFIER.test(table)) {
|
|
50
|
+
throw new Error(`Invalid table name "${table}": must match ${VALID_IDENTIFIER}`);
|
|
51
|
+
}
|
|
52
|
+
return `
|
|
53
|
+
CREATE TABLE IF NOT EXISTS ${table} (
|
|
54
|
+
task_id TEXT PRIMARY KEY,
|
|
55
|
+
status TEXT NOT NULL DEFAULT 'working',
|
|
56
|
+
ttl INTEGER,
|
|
57
|
+
poll_interval INTEGER NOT NULL DEFAULT 1000,
|
|
58
|
+
status_message TEXT,
|
|
59
|
+
request_id TEXT NOT NULL,
|
|
60
|
+
request JSONB NOT NULL,
|
|
61
|
+
result JSONB,
|
|
62
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
63
|
+
last_updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
64
|
+
expires_at TIMESTAMPTZ,
|
|
65
|
+
|
|
66
|
+
CONSTRAINT ${table}_valid_status CHECK (
|
|
67
|
+
status IN ('working', 'input_required', 'completed', 'failed', 'cancelled')
|
|
68
|
+
)
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_${table}_expires_at
|
|
72
|
+
ON ${table}(expires_at) WHERE expires_at IS NOT NULL;
|
|
73
|
+
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_${table}_created_at
|
|
75
|
+
ON ${table}(created_at);
|
|
76
|
+
`.trim();
|
|
77
|
+
}
|
|
78
|
+
/** Backward-compatible constant using the default table name. */
|
|
79
|
+
exports.MCP_TASKS_MIGRATION = getMcpTasksMigration();
|
|
80
|
+
/** Convert a database row to an MCP Task object. */
|
|
81
|
+
function rowToTask(row) {
|
|
82
|
+
const task = {
|
|
83
|
+
taskId: row.task_id,
|
|
84
|
+
status: row.status,
|
|
85
|
+
ttl: row.ttl,
|
|
86
|
+
createdAt: new Date(row.created_at).toISOString(),
|
|
87
|
+
lastUpdatedAt: new Date(row.last_updated_at).toISOString(),
|
|
88
|
+
};
|
|
89
|
+
if (row.poll_interval != null) {
|
|
90
|
+
task.pollInterval = row.poll_interval;
|
|
91
|
+
}
|
|
92
|
+
if (row.status_message != null) {
|
|
93
|
+
task.statusMessage = row.status_message;
|
|
94
|
+
}
|
|
95
|
+
return task;
|
|
96
|
+
}
|
|
97
|
+
/** WHERE clause that filters out expired tasks. */
|
|
98
|
+
const NOT_EXPIRED = `(expires_at IS NULL OR expires_at > NOW())`;
|
|
99
|
+
/**
|
|
100
|
+
* PostgreSQL-backed implementation of the MCP SDK TaskStore interface.
|
|
101
|
+
*
|
|
102
|
+
* All reads filter out expired tasks (via `expires_at`), so no background
|
|
103
|
+
* timer is needed — expired tasks are simply invisible. Call
|
|
104
|
+
* `cleanupExpired()` periodically to reclaim storage.
|
|
105
|
+
*/
|
|
106
|
+
class PostgresTaskStore {
|
|
107
|
+
db;
|
|
108
|
+
table;
|
|
109
|
+
constructor(db, options) {
|
|
110
|
+
this.db = db;
|
|
111
|
+
this.table = options?.tableName ?? DEFAULT_TABLE;
|
|
112
|
+
if (!VALID_IDENTIFIER.test(this.table)) {
|
|
113
|
+
throw new Error(`Invalid table name "${this.table}": must match ${VALID_IDENTIFIER}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async createTask(taskParams, requestId, request, _sessionId) {
|
|
117
|
+
const taskId = (0, node_crypto_1.randomBytes)(16).toString('hex');
|
|
118
|
+
const ttl = taskParams.ttl ?? null;
|
|
119
|
+
const pollInterval = taskParams.pollInterval ?? 1000;
|
|
120
|
+
const { rows } = await this.db.query(`INSERT INTO ${this.table} (task_id, status, ttl, poll_interval, request_id, request, expires_at)
|
|
121
|
+
VALUES ($1, 'working', $2, $3, $4, $5,
|
|
122
|
+
CASE WHEN $2::integer IS NOT NULL
|
|
123
|
+
THEN NOW() + ($2::integer || ' milliseconds')::interval
|
|
124
|
+
ELSE NULL END)
|
|
125
|
+
RETURNING *`, [taskId, ttl, pollInterval, String(requestId), JSON.stringify(request)]);
|
|
126
|
+
return rowToTask(rows[0]);
|
|
127
|
+
}
|
|
128
|
+
async getTask(taskId, _sessionId) {
|
|
129
|
+
const { rows } = await this.db.query(`SELECT * FROM ${this.table} WHERE task_id = $1 AND ${NOT_EXPIRED}`, [taskId]);
|
|
130
|
+
return rows.length > 0 ? rowToTask(rows[0]) : null;
|
|
131
|
+
}
|
|
132
|
+
async storeTaskResult(taskId, status, result, _sessionId) {
|
|
133
|
+
// Atomic check-and-update: only modify if task exists and is non-terminal.
|
|
134
|
+
const { rowCount, rows } = await this.db.query(`UPDATE ${this.table}
|
|
135
|
+
SET status = $2,
|
|
136
|
+
result = $3,
|
|
137
|
+
last_updated_at = NOW(),
|
|
138
|
+
expires_at = CASE WHEN ttl IS NOT NULL
|
|
139
|
+
THEN NOW() + (ttl || ' milliseconds')::interval
|
|
140
|
+
ELSE NULL END
|
|
141
|
+
WHERE task_id = $1
|
|
142
|
+
AND status NOT IN ('completed', 'failed', 'cancelled')
|
|
143
|
+
AND ${NOT_EXPIRED}
|
|
144
|
+
RETURNING status`, [taskId, status, JSON.stringify(result)]);
|
|
145
|
+
if (!rowCount || rows.length === 0) {
|
|
146
|
+
// Distinguish "not found" / "expired" from "already terminal".
|
|
147
|
+
const { rows: existing } = await this.db.query(`SELECT status FROM ${this.table} WHERE task_id = $1 AND ${NOT_EXPIRED}`, [taskId]);
|
|
148
|
+
if (existing.length === 0) {
|
|
149
|
+
throw new Error(`Task with ID ${taskId} not found`);
|
|
150
|
+
}
|
|
151
|
+
throw new Error(`Cannot store result for task ${taskId} in terminal status '${existing[0].status}'. Task results can only be stored once.`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async getTaskResult(taskId, _sessionId) {
|
|
155
|
+
const { rows } = await this.db.query(`SELECT result FROM ${this.table} WHERE task_id = $1 AND ${NOT_EXPIRED}`, [
|
|
156
|
+
taskId,
|
|
157
|
+
]);
|
|
158
|
+
if (rows.length === 0) {
|
|
159
|
+
throw new Error(`Task with ID ${taskId} not found`);
|
|
160
|
+
}
|
|
161
|
+
const row = rows[0];
|
|
162
|
+
if (row.result == null) {
|
|
163
|
+
throw new Error(`Task ${taskId} has no result stored`);
|
|
164
|
+
}
|
|
165
|
+
return row.result;
|
|
166
|
+
}
|
|
167
|
+
async updateTaskStatus(taskId, status, statusMessage, _sessionId) {
|
|
168
|
+
// Atomic: only update if not already in a terminal state.
|
|
169
|
+
const { rowCount, rows } = await this.db.query(`UPDATE ${this.table}
|
|
170
|
+
SET status = $2,
|
|
171
|
+
status_message = COALESCE($3, status_message),
|
|
172
|
+
last_updated_at = NOW(),
|
|
173
|
+
expires_at = CASE
|
|
174
|
+
WHEN $2 IN ('completed', 'failed', 'cancelled') AND ttl IS NOT NULL
|
|
175
|
+
THEN NOW() + (ttl || ' milliseconds')::interval
|
|
176
|
+
ELSE expires_at END
|
|
177
|
+
WHERE task_id = $1
|
|
178
|
+
AND status NOT IN ('completed', 'failed', 'cancelled')
|
|
179
|
+
AND ${NOT_EXPIRED}
|
|
180
|
+
RETURNING status`, [taskId, status, statusMessage ?? null]);
|
|
181
|
+
if (!rowCount || rows.length === 0) {
|
|
182
|
+
const { rows: existing } = await this.db.query(`SELECT status FROM ${this.table} WHERE task_id = $1 AND ${NOT_EXPIRED}`, [taskId]);
|
|
183
|
+
if (existing.length === 0) {
|
|
184
|
+
throw new Error(`Task with ID ${taskId} not found`);
|
|
185
|
+
}
|
|
186
|
+
throw new Error(`Cannot update task ${taskId} from terminal status '${existing[0].status}' to '${status}'. Terminal states (completed, failed, cancelled) cannot transition to other states.`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async listTasks(cursor, _sessionId) {
|
|
190
|
+
let rawRows;
|
|
191
|
+
if (cursor) {
|
|
192
|
+
// Decode cursor: "created_at|task_id" — split on first | only,
|
|
193
|
+
// so task IDs containing | are handled correctly.
|
|
194
|
+
const sepIndex = cursor.indexOf('|');
|
|
195
|
+
if (sepIndex < 1) {
|
|
196
|
+
throw new Error(`Invalid cursor: ${cursor}`);
|
|
197
|
+
}
|
|
198
|
+
const cursorCreatedAt = cursor.slice(0, sepIndex);
|
|
199
|
+
const cursorTaskId = cursor.slice(sepIndex + 1);
|
|
200
|
+
if (!cursorTaskId || isNaN(Date.parse(cursorCreatedAt))) {
|
|
201
|
+
throw new Error(`Invalid cursor: ${cursor}`);
|
|
202
|
+
}
|
|
203
|
+
({ rows: rawRows } = await this.db.query(`SELECT *, created_at::text AS created_at_raw FROM ${this.table}
|
|
204
|
+
WHERE ${NOT_EXPIRED}
|
|
205
|
+
AND (created_at, task_id) > ($1::timestamptz, $2)
|
|
206
|
+
ORDER BY created_at, task_id
|
|
207
|
+
LIMIT $3`, [cursorCreatedAt, cursorTaskId, PAGE_SIZE + 1]));
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
({ rows: rawRows } = await this.db.query(`SELECT *, created_at::text AS created_at_raw FROM ${this.table}
|
|
211
|
+
WHERE ${NOT_EXPIRED}
|
|
212
|
+
ORDER BY created_at, task_id
|
|
213
|
+
LIMIT $1`, [PAGE_SIZE + 1]));
|
|
214
|
+
}
|
|
215
|
+
const rows = rawRows;
|
|
216
|
+
const hasMore = rows.length > PAGE_SIZE;
|
|
217
|
+
const pageRows = hasMore ? rows.slice(0, PAGE_SIZE) : rows;
|
|
218
|
+
const tasks = pageRows.map(rowToTask);
|
|
219
|
+
let nextCursor;
|
|
220
|
+
if (hasMore && pageRows.length > 0) {
|
|
221
|
+
const last = pageRows[pageRows.length - 1];
|
|
222
|
+
// Use the raw PostgreSQL text representation to preserve microsecond
|
|
223
|
+
// precision. JavaScript Date only has millisecond precision, which
|
|
224
|
+
// causes keyset pagination to re-include rows when multiple tasks
|
|
225
|
+
// share the same millisecond.
|
|
226
|
+
nextCursor = `${last.created_at_raw}|${last.task_id}`;
|
|
227
|
+
}
|
|
228
|
+
return { tasks, nextCursor };
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Delete expired tasks from the table.
|
|
232
|
+
*
|
|
233
|
+
* Call this on a schedule (e.g., every 5 minutes) to reclaim storage.
|
|
234
|
+
* Reads automatically filter expired rows, so this is purely a storage
|
|
235
|
+
* optimization — not required for correctness.
|
|
236
|
+
*
|
|
237
|
+
* @returns The number of deleted rows.
|
|
238
|
+
*/
|
|
239
|
+
async cleanupExpired() {
|
|
240
|
+
const { rowCount } = await this.db.query(`DELETE FROM ${this.table} WHERE expires_at IS NOT NULL AND expires_at <= NOW()`);
|
|
241
|
+
return rowCount ?? 0;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* No-op — PostgresTaskStore has no timers or background processes.
|
|
245
|
+
* Matches the cleanup() method that InMemoryTaskStore exposes.
|
|
246
|
+
*/
|
|
247
|
+
cleanup() {
|
|
248
|
+
// Nothing to clean up — no timers.
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.PostgresTaskStore = PostgresTaskStore;
|
|
252
|
+
/**
|
|
253
|
+
* Delete expired tasks from the task store table.
|
|
254
|
+
*
|
|
255
|
+
* Standalone version of `PostgresTaskStore.cleanupExpired()` for use
|
|
256
|
+
* without a store instance.
|
|
257
|
+
*
|
|
258
|
+
* @returns The number of deleted rows.
|
|
259
|
+
*/
|
|
260
|
+
async function cleanupExpiredTasks(db, tableName = DEFAULT_TABLE) {
|
|
261
|
+
if (!VALID_IDENTIFIER.test(tableName)) {
|
|
262
|
+
throw new Error(`Invalid table name "${tableName}": must match ${VALID_IDENTIFIER}`);
|
|
263
|
+
}
|
|
264
|
+
const { rowCount } = await db.query(`DELETE FROM ${tableName} WHERE expires_at IS NOT NULL AND expires_at <= NOW()`);
|
|
265
|
+
return rowCount ?? 0;
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=postgres-task-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-task-store.js","sourceRoot":"","sources":["../../../src/lib/server/postgres-task-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/lib/server/responses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/lib/server/responses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAKD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAKzG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAK7F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAK/F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,CAYrG"}
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* ```
|
|
28
28
|
*/
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.toStructuredContent = toStructuredContent;
|
|
30
31
|
exports.capabilitiesResponse = capabilitiesResponse;
|
|
31
32
|
exports.productsResponse = productsResponse;
|
|
32
33
|
exports.mediaBuyResponse = mediaBuyResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/lib/server/responses.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/lib/server/responses.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;AAqBH,kDAEC;AAQD,oDAKC;AAKD,4CAKC;AAKD,4CAKC;AAKD,4CAYC;AAvDD,4FAA4F;AAC5F,uFAAuF;AACvF,yDAAyD;AACzD,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAA0C,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,IAAiC,EAAE,OAAgB;IACtF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,IAAI,8BAA8B,EAAE,CAAC;QAC5E,iBAAiB,EAAE,mBAAmB,CAAC,IAAI,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAyB,EAAE,OAAgB;IAC1E,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,IAAI,SAAS,IAAI,CAAC,QAAQ,CAAC,MAAM,WAAW,EAAE,CAAC;QACtF,iBAAiB,EAAE,mBAAmB,CAAC,IAAI,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAA2B,EAAE,OAAgB;IAC5E,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,IAAI,aAAa,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;QACtF,iBAAiB,EAAE,mBAAmB,CAAC,IAAI,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,IAAiC,EAAE,OAAgB;IAClF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EACF,OAAO;oBACP,qBAAqB,IAAI,CAAC,oBAAoB,CAAC,MAAM,aAAa,IAAI,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;aACxH;SACF;QACD,iBAAiB,EAAE,mBAAmB,CAAC,IAAI,CAAC;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side comply_test_controller implementation.
|
|
3
|
+
*
|
|
4
|
+
* Sellers call registerTestController(server, store) to add the
|
|
5
|
+
* comply_test_controller tool to their MCP server. The TestControllerStore
|
|
6
|
+
* interface lets sellers wire up their own state management while the SDK
|
|
7
|
+
* handles request parsing, scenario dispatch, and response formatting.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
* import { registerTestController } from '@adcp/client/server';
|
|
13
|
+
*
|
|
14
|
+
* const store: TestControllerStore = {
|
|
15
|
+
* async forceAccountStatus(accountId, status) {
|
|
16
|
+
* const prev = await db.getAccountStatus(accountId);
|
|
17
|
+
* await db.setAccountStatus(accountId, status);
|
|
18
|
+
* return { success: true, previous_state: prev, current_state: status };
|
|
19
|
+
* },
|
|
20
|
+
* // ... implement other scenarios as needed
|
|
21
|
+
* };
|
|
22
|
+
*
|
|
23
|
+
* registerTestController(server, store);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
27
|
+
import type { ListScenariosSuccess, StateTransitionSuccess, SimulationSuccess, ControllerError, ComplyTestControllerResponse } from '../types/tools.generated';
|
|
28
|
+
import type { AccountStatus, MediaBuyStatus, CreativeStatus } from '../types/core.generated';
|
|
29
|
+
/** Scenario names the controller can support (derived from generated schema). */
|
|
30
|
+
export type ControllerScenario = ListScenariosSuccess['scenarios'][number];
|
|
31
|
+
/**
|
|
32
|
+
* Seller-side store for comply_test_controller.
|
|
33
|
+
*
|
|
34
|
+
* Implement the methods for each scenario you support.
|
|
35
|
+
* Unimplemented methods mean that scenario is not advertised in list_scenarios.
|
|
36
|
+
*/
|
|
37
|
+
export interface TestControllerStore {
|
|
38
|
+
/** Transition a creative to the specified status. */
|
|
39
|
+
forceCreativeStatus?(creativeId: string, status: CreativeStatus, rejectionReason?: string): Promise<StateTransitionSuccess>;
|
|
40
|
+
/** Transition an account to the specified status. */
|
|
41
|
+
forceAccountStatus?(accountId: string, status: AccountStatus): Promise<StateTransitionSuccess>;
|
|
42
|
+
/** Transition a media buy to the specified status. */
|
|
43
|
+
forceMediaBuyStatus?(mediaBuyId: string, status: MediaBuyStatus, rejectionReason?: string): Promise<StateTransitionSuccess>;
|
|
44
|
+
/** Transition an SI session to a terminal status. */
|
|
45
|
+
forceSessionStatus?(sessionId: string, status: 'complete' | 'terminated', terminationReason?: string): Promise<StateTransitionSuccess>;
|
|
46
|
+
/** Inject synthetic delivery data for a media buy. */
|
|
47
|
+
simulateDelivery?(mediaBuyId: string, params: {
|
|
48
|
+
impressions?: number;
|
|
49
|
+
clicks?: number;
|
|
50
|
+
reported_spend?: {
|
|
51
|
+
amount: number;
|
|
52
|
+
currency: string;
|
|
53
|
+
};
|
|
54
|
+
conversions?: number;
|
|
55
|
+
}): Promise<SimulationSuccess>;
|
|
56
|
+
/** Simulate budget consumption to a specified percentage. */
|
|
57
|
+
simulateBudgetSpend?(params: {
|
|
58
|
+
account_id?: string;
|
|
59
|
+
media_buy_id?: string;
|
|
60
|
+
spend_percentage: number;
|
|
61
|
+
}): Promise<SimulationSuccess>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Throw from TestControllerStore methods to return a typed controller error.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* throw new TestControllerError('NOT_FOUND', `Account ${id} not found`);
|
|
69
|
+
* throw new TestControllerError('INVALID_TRANSITION', 'Cannot pause a completed buy', 'completed');
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export declare class TestControllerError extends Error {
|
|
73
|
+
readonly code: ControllerError['error'];
|
|
74
|
+
readonly currentState?: string | null | undefined;
|
|
75
|
+
constructor(code: ControllerError['error'], message: string, currentState?: string | null | undefined);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Handle a comply_test_controller request. Exported for unit testing.
|
|
79
|
+
*/
|
|
80
|
+
export declare function handleTestControllerRequest(store: TestControllerStore, input: Record<string, unknown>): Promise<ComplyTestControllerResponse>;
|
|
81
|
+
/**
|
|
82
|
+
* Register the comply_test_controller tool on an MCP server.
|
|
83
|
+
*
|
|
84
|
+
* The store determines which scenarios are supported. Unimplemented
|
|
85
|
+
* store methods are excluded from list_scenarios and return UNKNOWN_SCENARIO.
|
|
86
|
+
*/
|
|
87
|
+
export declare function registerTestController(server: McpServer, store: TestControllerStore): void;
|
|
88
|
+
//# sourceMappingURL=test-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-controller.d.ts","sourceRoot":"","sources":["../../../src/lib/server/test-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,4BAA4B,EAC7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAS7F,iFAAiF;AACjF,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,mBAAmB,CAAC,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,EACtB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEnC,qDAAqD;IACrD,kBAAkB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAE/F,sDAAsD;IACtD,mBAAmB,CAAC,CAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,EACtB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEnC,qDAAqD;IACrD,kBAAkB,CAAC,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,GAAG,YAAY,EACjC,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEnC,sDAAsD;IACtD,gBAAgB,CAAC,CACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE;QACN,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QACtD,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE9B,6DAA6D;IAC7D,mBAAmB,CAAC,CAAC,MAAM,EAAE;QAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAChC;AAMD;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC;aAE9B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;gBAF5B,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,EAC9C,OAAO,EAAE,MAAM,EACC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,YAAA;CAK/C;AAiCD;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,4BAA4B,CAAC,CAqIvC;AA8BD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAU1F"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Server-side comply_test_controller implementation.
|
|
4
|
+
*
|
|
5
|
+
* Sellers call registerTestController(server, store) to add the
|
|
6
|
+
* comply_test_controller tool to their MCP server. The TestControllerStore
|
|
7
|
+
* interface lets sellers wire up their own state management while the SDK
|
|
8
|
+
* handles request parsing, scenario dispatch, and response formatting.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
13
|
+
* import { registerTestController } from '@adcp/client/server';
|
|
14
|
+
*
|
|
15
|
+
* const store: TestControllerStore = {
|
|
16
|
+
* async forceAccountStatus(accountId, status) {
|
|
17
|
+
* const prev = await db.getAccountStatus(accountId);
|
|
18
|
+
* await db.setAccountStatus(accountId, status);
|
|
19
|
+
* return { success: true, previous_state: prev, current_state: status };
|
|
20
|
+
* },
|
|
21
|
+
* // ... implement other scenarios as needed
|
|
22
|
+
* };
|
|
23
|
+
*
|
|
24
|
+
* registerTestController(server, store);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.TestControllerError = void 0;
|
|
29
|
+
exports.handleTestControllerRequest = handleTestControllerRequest;
|
|
30
|
+
exports.registerTestController = registerTestController;
|
|
31
|
+
const zod_1 = require("zod");
|
|
32
|
+
const schemas_generated_1 = require("../types/schemas.generated");
|
|
33
|
+
const responses_1 = require("./responses");
|
|
34
|
+
// ────────────────────────────────────────────────────────────
|
|
35
|
+
// Error class for sellers
|
|
36
|
+
// ────────────────────────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* Throw from TestControllerStore methods to return a typed controller error.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* throw new TestControllerError('NOT_FOUND', `Account ${id} not found`);
|
|
43
|
+
* throw new TestControllerError('INVALID_TRANSITION', 'Cannot pause a completed buy', 'completed');
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
class TestControllerError extends Error {
|
|
47
|
+
code;
|
|
48
|
+
currentState;
|
|
49
|
+
constructor(code, message, currentState) {
|
|
50
|
+
super(message);
|
|
51
|
+
this.code = code;
|
|
52
|
+
this.currentState = currentState;
|
|
53
|
+
this.name = 'TestControllerError';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.TestControllerError = TestControllerError;
|
|
57
|
+
// ────────────────────────────────────────────────────────────
|
|
58
|
+
// Request handler (exported for testing)
|
|
59
|
+
// ────────────────────────────────────────────────────────────
|
|
60
|
+
/** Map store method presence to scenario names. */
|
|
61
|
+
const SCENARIO_MAP = [
|
|
62
|
+
['forceCreativeStatus', 'force_creative_status'],
|
|
63
|
+
['forceAccountStatus', 'force_account_status'],
|
|
64
|
+
['forceMediaBuyStatus', 'force_media_buy_status'],
|
|
65
|
+
['forceSessionStatus', 'force_session_status'],
|
|
66
|
+
['simulateDelivery', 'simulate_delivery'],
|
|
67
|
+
['simulateBudgetSpend', 'simulate_budget_spend'],
|
|
68
|
+
];
|
|
69
|
+
function listScenarios(store) {
|
|
70
|
+
return SCENARIO_MAP.filter(([method]) => typeof store[method] === 'function').map(([, scenario]) => scenario);
|
|
71
|
+
}
|
|
72
|
+
function controllerError(code, detail, currentState) {
|
|
73
|
+
return {
|
|
74
|
+
success: false,
|
|
75
|
+
error: code,
|
|
76
|
+
error_detail: detail,
|
|
77
|
+
...(currentState !== undefined && { current_state: currentState }),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Handle a comply_test_controller request. Exported for unit testing.
|
|
82
|
+
*/
|
|
83
|
+
async function handleTestControllerRequest(store, input) {
|
|
84
|
+
const scenario = input.scenario;
|
|
85
|
+
if (!scenario) {
|
|
86
|
+
return controllerError('INVALID_PARAMS', 'Missing required field: scenario');
|
|
87
|
+
}
|
|
88
|
+
// list_scenarios — no params needed
|
|
89
|
+
if (scenario === 'list_scenarios') {
|
|
90
|
+
return { success: true, scenarios: listScenarios(store) };
|
|
91
|
+
}
|
|
92
|
+
const params = input.params;
|
|
93
|
+
try {
|
|
94
|
+
switch (scenario) {
|
|
95
|
+
case 'force_creative_status': {
|
|
96
|
+
if (!store.forceCreativeStatus) {
|
|
97
|
+
return controllerError('UNKNOWN_SCENARIO', `Scenario not supported: ${scenario}`);
|
|
98
|
+
}
|
|
99
|
+
if (!params?.creative_id || !params?.status) {
|
|
100
|
+
return controllerError('INVALID_PARAMS', 'force_creative_status requires params.creative_id and params.status');
|
|
101
|
+
}
|
|
102
|
+
const creativeStatus = schemas_generated_1.CreativeStatusSchema.safeParse(params.status);
|
|
103
|
+
if (!creativeStatus.success) {
|
|
104
|
+
return controllerError('INVALID_PARAMS', `Invalid creative status: ${params.status}`);
|
|
105
|
+
}
|
|
106
|
+
return await store.forceCreativeStatus(params.creative_id, creativeStatus.data, params.rejection_reason);
|
|
107
|
+
}
|
|
108
|
+
case 'force_account_status': {
|
|
109
|
+
if (!store.forceAccountStatus) {
|
|
110
|
+
return controllerError('UNKNOWN_SCENARIO', `Scenario not supported: ${scenario}`);
|
|
111
|
+
}
|
|
112
|
+
if (!params?.account_id || !params?.status) {
|
|
113
|
+
return controllerError('INVALID_PARAMS', 'force_account_status requires params.account_id and params.status');
|
|
114
|
+
}
|
|
115
|
+
const accountStatus = schemas_generated_1.AccountStatusSchema.safeParse(params.status);
|
|
116
|
+
if (!accountStatus.success) {
|
|
117
|
+
return controllerError('INVALID_PARAMS', `Invalid account status: ${params.status}`);
|
|
118
|
+
}
|
|
119
|
+
return await store.forceAccountStatus(params.account_id, accountStatus.data);
|
|
120
|
+
}
|
|
121
|
+
case 'force_media_buy_status': {
|
|
122
|
+
if (!store.forceMediaBuyStatus) {
|
|
123
|
+
return controllerError('UNKNOWN_SCENARIO', `Scenario not supported: ${scenario}`);
|
|
124
|
+
}
|
|
125
|
+
if (!params?.media_buy_id || !params?.status) {
|
|
126
|
+
return controllerError('INVALID_PARAMS', 'force_media_buy_status requires params.media_buy_id and params.status');
|
|
127
|
+
}
|
|
128
|
+
const mediaBuyStatus = schemas_generated_1.MediaBuyStatusSchema.safeParse(params.status);
|
|
129
|
+
if (!mediaBuyStatus.success) {
|
|
130
|
+
return controllerError('INVALID_PARAMS', `Invalid media buy status: ${params.status}`);
|
|
131
|
+
}
|
|
132
|
+
return await store.forceMediaBuyStatus(params.media_buy_id, mediaBuyStatus.data, params.rejection_reason);
|
|
133
|
+
}
|
|
134
|
+
case 'force_session_status': {
|
|
135
|
+
if (!store.forceSessionStatus) {
|
|
136
|
+
return controllerError('UNKNOWN_SCENARIO', `Scenario not supported: ${scenario}`);
|
|
137
|
+
}
|
|
138
|
+
if (!params?.session_id || !params?.status) {
|
|
139
|
+
return controllerError('INVALID_PARAMS', 'force_session_status requires params.session_id and params.status');
|
|
140
|
+
}
|
|
141
|
+
const validSessionStatuses = ['complete', 'terminated'];
|
|
142
|
+
if (!validSessionStatuses.includes(params.status)) {
|
|
143
|
+
return controllerError('INVALID_PARAMS', `Invalid session status: ${params.status}`);
|
|
144
|
+
}
|
|
145
|
+
return await store.forceSessionStatus(params.session_id, params.status, params.termination_reason);
|
|
146
|
+
}
|
|
147
|
+
case 'simulate_delivery': {
|
|
148
|
+
if (!store.simulateDelivery) {
|
|
149
|
+
return controllerError('UNKNOWN_SCENARIO', `Scenario not supported: ${scenario}`);
|
|
150
|
+
}
|
|
151
|
+
if (!params?.media_buy_id) {
|
|
152
|
+
return controllerError('INVALID_PARAMS', 'simulate_delivery requires params.media_buy_id');
|
|
153
|
+
}
|
|
154
|
+
return await store.simulateDelivery(params.media_buy_id, {
|
|
155
|
+
impressions: params.impressions,
|
|
156
|
+
clicks: params.clicks,
|
|
157
|
+
reported_spend: params.reported_spend,
|
|
158
|
+
conversions: params.conversions,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
case 'simulate_budget_spend': {
|
|
162
|
+
if (!store.simulateBudgetSpend) {
|
|
163
|
+
return controllerError('UNKNOWN_SCENARIO', `Scenario not supported: ${scenario}`);
|
|
164
|
+
}
|
|
165
|
+
if (params?.spend_percentage === undefined || params?.spend_percentage === null) {
|
|
166
|
+
return controllerError('INVALID_PARAMS', 'simulate_budget_spend requires params.spend_percentage');
|
|
167
|
+
}
|
|
168
|
+
if (!params?.account_id && !params?.media_buy_id) {
|
|
169
|
+
return controllerError('INVALID_PARAMS', 'simulate_budget_spend requires params.account_id or params.media_buy_id');
|
|
170
|
+
}
|
|
171
|
+
return await store.simulateBudgetSpend({
|
|
172
|
+
account_id: params.account_id,
|
|
173
|
+
media_buy_id: params.media_buy_id,
|
|
174
|
+
spend_percentage: params.spend_percentage,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
default:
|
|
178
|
+
return controllerError('UNKNOWN_SCENARIO', 'Unrecognized scenario name');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
if (err instanceof TestControllerError) {
|
|
183
|
+
return controllerError(err.code, err.message, err.currentState);
|
|
184
|
+
}
|
|
185
|
+
return controllerError('INTERNAL_ERROR', 'An unexpected error occurred in the test controller store');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// ────────────────────────────────────────────────────────────
|
|
189
|
+
// MCP tool registration
|
|
190
|
+
// ────────────────────────────────────────────────────────────
|
|
191
|
+
function summarize(data) {
|
|
192
|
+
if (data.success === false)
|
|
193
|
+
return `Controller error: ${data.error}`;
|
|
194
|
+
if ('scenarios' in data)
|
|
195
|
+
return `Supported scenarios: ${data.scenarios.join(', ')}`;
|
|
196
|
+
if ('previous_state' in data)
|
|
197
|
+
return `Transitioned from ${data.previous_state} to ${data.current_state}`;
|
|
198
|
+
return `Simulation complete: ${JSON.stringify(data.simulated)}`;
|
|
199
|
+
}
|
|
200
|
+
function toMcpResponse(data) {
|
|
201
|
+
const isError = data.success === false;
|
|
202
|
+
return {
|
|
203
|
+
content: [{ type: 'text', text: summarize(data) }],
|
|
204
|
+
structuredContent: (0, responses_1.toStructuredContent)(data),
|
|
205
|
+
...(isError && { isError: true }),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
const TOOL_INPUT_SHAPE = {
|
|
209
|
+
scenario: zod_1.z.string().describe('Scenario to execute (e.g., list_scenarios, force_account_status)'),
|
|
210
|
+
params: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional().describe('Scenario-specific parameters'),
|
|
211
|
+
account: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional().describe('Account context for sandbox scoping'),
|
|
212
|
+
context: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional().describe('AdCP context object'),
|
|
213
|
+
ext: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional().describe('AdCP extension object'),
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
216
|
+
* Register the comply_test_controller tool on an MCP server.
|
|
217
|
+
*
|
|
218
|
+
* The store determines which scenarios are supported. Unimplemented
|
|
219
|
+
* store methods are excluded from list_scenarios and return UNKNOWN_SCENARIO.
|
|
220
|
+
*/
|
|
221
|
+
function registerTestController(server, store) {
|
|
222
|
+
server.tool('comply_test_controller', 'Triggers seller-side state transitions for compliance testing. Sandbox only.', TOOL_INPUT_SHAPE, async (input) => {
|
|
223
|
+
const response = await handleTestControllerRequest(store, input);
|
|
224
|
+
return toMcpResponse(response);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=test-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-controller.js","sourceRoot":"","sources":["../../../src/lib/server/test-controller.ts"],"names":[],"mappings":"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"}
|