@playdrop/playdrop-cli 0.18.0 → 0.18.8

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 (59) hide show
  1. package/config/client-meta.json +2 -2
  2. package/dist/commands/devServer.d.ts +2 -1
  3. package/dist/commands/devServer.js +48 -1
  4. package/dist/commands/worker/game-source-git.d.ts +1 -0
  5. package/dist/commands/worker/game-source-git.js +32 -0
  6. package/dist/commands/worker/instrument-evidence.d.ts +1 -0
  7. package/dist/commands/worker/instrument-evidence.js +5 -4
  8. package/dist/commands/worker.js +26 -9
  9. package/node_modules/@playdrop/api-client/dist/acquisition.d.ts +56 -0
  10. package/node_modules/@playdrop/api-client/dist/acquisition.d.ts.map +1 -0
  11. package/node_modules/@playdrop/api-client/dist/acquisition.js +319 -0
  12. package/node_modules/@playdrop/api-client/dist/attribution.d.ts +3 -0
  13. package/node_modules/@playdrop/api-client/dist/attribution.d.ts.map +1 -0
  14. package/node_modules/@playdrop/api-client/dist/attribution.js +30 -0
  15. package/node_modules/@playdrop/api-client/dist/browser-request.d.ts +23 -0
  16. package/node_modules/@playdrop/api-client/dist/browser-request.d.ts.map +1 -0
  17. package/node_modules/@playdrop/api-client/dist/browser-request.js +127 -0
  18. package/node_modules/@playdrop/api-client/dist/chat.d.ts +25 -0
  19. package/node_modules/@playdrop/api-client/dist/chat.d.ts.map +1 -0
  20. package/node_modules/@playdrop/api-client/dist/chat.js +60 -0
  21. package/node_modules/@playdrop/api-client/dist/creator-studio-assets.d.ts +9 -0
  22. package/node_modules/@playdrop/api-client/dist/creator-studio-assets.d.ts.map +1 -0
  23. package/node_modules/@playdrop/api-client/dist/creator-studio-assets.js +68 -0
  24. package/node_modules/@playdrop/api-client/dist/creator-studio-marketing.d.ts +5 -0
  25. package/node_modules/@playdrop/api-client/dist/creator-studio-marketing.d.ts.map +1 -0
  26. package/node_modules/@playdrop/api-client/dist/creator-studio-marketing.js +81 -0
  27. package/node_modules/@playdrop/api-client/dist/creator-studio-shell.d.ts +23 -0
  28. package/node_modules/@playdrop/api-client/dist/creator-studio-shell.d.ts.map +1 -0
  29. package/node_modules/@playdrop/api-client/dist/creator-studio-shell.js +100 -0
  30. package/node_modules/@playdrop/api-client/dist/creator-studio.d.ts +21 -0
  31. package/node_modules/@playdrop/api-client/dist/creator-studio.d.ts.map +1 -0
  32. package/node_modules/@playdrop/api-client/dist/creator-studio.js +191 -0
  33. package/node_modules/@playdrop/api-client/dist/index.d.ts +1 -1
  34. package/node_modules/@playdrop/api-client/dist/index.d.ts.map +1 -1
  35. package/node_modules/@playdrop/api-client/dist/web-push.d.ts +6 -0
  36. package/node_modules/@playdrop/api-client/dist/web-push.d.ts.map +1 -0
  37. package/node_modules/@playdrop/api-client/dist/web-push.js +66 -0
  38. package/node_modules/@playdrop/api-client/package.json +49 -0
  39. package/node_modules/@playdrop/config/client-meta.json +2 -2
  40. package/node_modules/@playdrop/config/dist/test/validateClientEnvironment.test.js +2 -2
  41. package/node_modules/@playdrop/config/dist/tsconfig.tsbuildinfo +1 -1
  42. package/node_modules/@playdrop/game-source-git/dist/src/git.d.ts +1 -0
  43. package/node_modules/@playdrop/game-source-git/dist/src/git.d.ts.map +1 -1
  44. package/node_modules/@playdrop/game-source-git/dist/src/git.js +12 -2
  45. package/node_modules/@playdrop/game-source-git/dist/src/repository.js +2 -2
  46. package/node_modules/@playdrop/game-source-git/dist/test/core.test.js +16 -0
  47. package/node_modules/@playdrop/game-source-git/dist/tsconfig.tsbuildinfo +1 -1
  48. package/node_modules/@playdrop/types/dist/agent-task-classification.d.ts +47 -113
  49. package/node_modules/@playdrop/types/dist/agent-task-classification.d.ts.map +1 -1
  50. package/node_modules/@playdrop/types/dist/agent-task-classification.js +25 -43
  51. package/node_modules/@playdrop/types/dist/api.d.ts +2 -2
  52. package/node_modules/@playdrop/types/dist/api.d.ts.map +1 -1
  53. package/node_modules/@playdrop/types/dist/api.js +0 -1
  54. package/node_modules/@playdrop/types/dist/instrument-evidence.d.ts.map +1 -1
  55. package/node_modules/@playdrop/types/dist/instrument-evidence.js +14 -1
  56. package/node_modules/@playdrop/types/dist/version.d.ts +10 -0
  57. package/node_modules/@playdrop/types/dist/version.d.ts.map +1 -1
  58. package/node_modules/@playdrop/types/dist/version.js +18 -0
  59. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "0.18.0",
2
+ "version": "0.18.8",
3
3
  "build": 1,
4
- "runtimeSdkVersion": "0.18.0",
4
+ "runtimeSdkVersion": "0.18.8",
5
5
  "runtimeSdkBuild": 1,
6
6
  "clients": {
7
7
  "all": {
@@ -44,7 +44,8 @@ export declare function buildLocalDevAppUrl(input: {
44
44
  }): string;
45
45
  export declare function terminateChildProcessTree(child: ChildProcess | null, timeoutMs?: number): Promise<void>;
46
46
  export declare function ensureDevRouterRunning(port?: number): Promise<void>;
47
- export declare function startOwnedDevRouter(port: number): Promise<ChildProcess>;
47
+ export declare function stopLegacyWorkerDevRouters(ports: readonly number[]): Promise<number>;
48
+ export declare function startOwnedDevRouter(port: number, ownerPid?: number): Promise<ChildProcess>;
48
49
  export declare function resolveDevRouterWorkingDirectory(cliEntrypoint: string): string;
49
50
  export declare function updateMountedDevRuntimeAssetManifest(input: {
50
51
  creatorUsername: string;
@@ -8,6 +8,7 @@ exports.parseMountConflictError = parseMountConflictError;
8
8
  exports.buildLocalDevAppUrl = buildLocalDevAppUrl;
9
9
  exports.terminateChildProcessTree = terminateChildProcessTree;
10
10
  exports.ensureDevRouterRunning = ensureDevRouterRunning;
11
+ exports.stopLegacyWorkerDevRouters = stopLegacyWorkerDevRouters;
11
12
  exports.startOwnedDevRouter = startOwnedDevRouter;
12
13
  exports.resolveDevRouterWorkingDirectory = resolveDevRouterWorkingDirectory;
13
14
  exports.updateMountedDevRuntimeAssetManifest = updateMountedDevRuntimeAssetManifest;
@@ -546,9 +547,47 @@ async function ensureDevRouterRunning(port = exports.DEV_ROUTER_PORT) {
546
547
  }
547
548
  await startOwnedDevRouter(port);
548
549
  }
550
+ // Managed Mac workers call this with their reserved slots before advertising
551
+ // readiness. The previous supervisor has drained, so its detached routers can
552
+ // be retired without touching another application's listener.
553
+ async function stopLegacyWorkerDevRouters(ports) {
554
+ const routers = new Set();
555
+ for (const port of ports) {
556
+ const listeners = (0, node_child_process_1.spawnSync)("/usr/sbin/lsof", ["-nP", "-a", `-iTCP:${port}`, "-sTCP:LISTEN", "-Fp"], { encoding: "utf8" });
557
+ if (listeners.status === 1 && !listeners.stdout.trim() && !listeners.stderr.trim())
558
+ continue;
559
+ if (listeners.error || listeners.status !== 0)
560
+ throw new Error(`worker_dev_router_inspection_failed:port_${port}`);
561
+ for (const line of listeners.stdout.trim().split("\n")) {
562
+ if (!line.startsWith("p"))
563
+ continue;
564
+ const pid = Number(line.slice(1));
565
+ const processInfo = (0, node_child_process_1.spawnSync)("/bin/ps", ["-p", String(pid), "-o", "uid=,pgid=,command="], { encoding: "utf8" });
566
+ const match = /^\s*(\d+)\s+(\d+)\s+(.+)$/u.exec(processInfo.stdout.trim());
567
+ if (!Number.isSafeInteger(pid) || pid <= 0 || pid === process.pid || !match ||
568
+ Number(match[1]) !== process.getuid?.() ||
569
+ Number(match[2]) !== pid ||
570
+ !/\sproject\s+_dev-router\s+serve(?:\s|$)/u.test(match[3]))
571
+ throw new Error(`worker_dev_router_port_occupied:port_${port}`);
572
+ routers.add(pid);
573
+ }
574
+ }
575
+ await Promise.all([...routers].map(async (pid) => {
576
+ signalProcess(pid, "SIGTERM", true);
577
+ if (!await waitForProcessGroupExit(pid, 2000)) {
578
+ signalProcess(pid, "SIGKILL", true);
579
+ if (!await waitForProcessGroupExit(pid, 2000))
580
+ throw new Error(`worker_dev_router_stop_failed:pid_${pid}`);
581
+ }
582
+ }));
583
+ return routers.size;
584
+ }
549
585
  // Publication checks retain this handle and stop only their own router.
550
586
  // Ordinary project dev intentionally keeps its shared router running.
551
- async function startOwnedDevRouter(port) {
587
+ async function startOwnedDevRouter(port, ownerPid) {
588
+ if (ownerPid !== undefined && (!Number.isSafeInteger(ownerPid) || ownerPid <= 0)) {
589
+ throw new Error("invalid_dev_router_owner_pid");
590
+ }
552
591
  if (await fetchRouterHealth(port))
553
592
  throw new Error(`publishing_dev_router_port_in_use:${port}`);
554
593
  const cliEntrypoint = getCliEntrypointPath();
@@ -561,6 +600,7 @@ async function startOwnedDevRouter(port) {
561
600
  env: {
562
601
  ...childEnv,
563
602
  PLAYDROP_DEV_ROUTER_PORT: String(port),
603
+ ...(ownerPid === undefined ? {} : { PLAYDROP_DEV_ROUTER_OWNER_PID: String(ownerPid) }),
564
604
  },
565
605
  });
566
606
  child.unref();
@@ -1189,6 +1229,13 @@ async function listenDevRouterServer(server, port = exports.DEV_ROUTER_PORT) {
1189
1229
  async function runDevRouterServer(port = Number(process.env.PLAYDROP_DEV_ROUTER_PORT) || exports.DEV_ROUTER_PORT) {
1190
1230
  const server = createDevRouterServer(port);
1191
1231
  await listenDevRouterServer(server, port);
1232
+ const ownerPid = Number(process.env.PLAYDROP_DEV_ROUTER_OWNER_PID);
1233
+ if (Number.isSafeInteger(ownerPid) && ownerPid > 0) {
1234
+ setInterval(() => {
1235
+ if (!isPidAlive(ownerPid))
1236
+ process.exit(0);
1237
+ }, 1000).unref();
1238
+ }
1192
1239
  await new Promise(() => {
1193
1240
  // Keep the router alive until the process exits.
1194
1241
  });
@@ -66,6 +66,7 @@ export declare function setupGameSourceWorkspace(input: {
66
66
  leaseToken: string;
67
67
  }): Promise<GameSourceWorkspace>;
68
68
  export declare function fingerprintGameSourcePublication(projectDir: string, includeServerOutput?: boolean): Promise<string>;
69
+ export declare function preflightGameSourceWorkspace(projectDir: string): Promise<void>;
69
70
  export declare function checkpointFailedGameSourceWorkspace(input: {
70
71
  workspace: GameSourceWorkspace;
71
72
  taskId: number;
@@ -7,6 +7,7 @@ exports.emitGameSourceWorkerEvent = emitGameSourceWorkerEvent;
7
7
  exports.materializeCurrentLock = materializeCurrentLock;
8
8
  exports.setupGameSourceWorkspace = setupGameSourceWorkspace;
9
9
  exports.fingerprintGameSourcePublication = fingerprintGameSourcePublication;
10
+ exports.preflightGameSourceWorkspace = preflightGameSourceWorkspace;
10
11
  exports.checkpointFailedGameSourceWorkspace = checkpointFailedGameSourceWorkspace;
11
12
  exports.reconcileGameSourceWorkspace = reconcileGameSourceWorkspace;
12
13
  exports.finalizeGameSourceRepository = finalizeGameSourceRepository;
@@ -557,6 +558,37 @@ async function stageGameSourceCommit(input) {
557
558
  }
558
559
  return { lock, materials };
559
560
  }
561
+ // Mirror the files left by staging without changing the index, source files,
562
+ // managed ignore block, or task refs. In particular, tracked build directories
563
+ // skipped by walkFiles survive `git add -u` and would fail the outgoing scan.
564
+ async function preflightGameSourceWorkspace(projectDir) {
565
+ const candidates = new Map();
566
+ const tracked = (await git.run(["ls-files", "--stage", "-z"], projectDir)).toString("utf8");
567
+ for (const entry of tracked.split("\0").filter(Boolean)) {
568
+ const tab = entry.indexOf("\t");
569
+ const filePath = entry.slice(tab + 1);
570
+ if (entry.startsWith("160000 "))
571
+ throw new Error(`game_source_gitlink_rejected:${filePath}`);
572
+ const absolute = node_path_1.default.join(projectDir, filePath);
573
+ if ((0, node_fs_1.existsSync)(absolute))
574
+ candidates.set(filePath, await (0, promises_1.readFile)(absolute));
575
+ }
576
+ for (const absolute of await walkFiles(projectDir)) {
577
+ const relative = normalizeRelativePath(projectDir, absolute);
578
+ const content = await (0, promises_1.readFile)(absolute);
579
+ if ((0, game_source_git_1.classifyGameSourceFile)(relative, content) === "git")
580
+ candidates.set(relative, content);
581
+ else
582
+ candidates.delete(relative);
583
+ }
584
+ const ignorePath = node_path_1.default.join(projectDir, ".gitignore");
585
+ const existingIgnore = (0, node_fs_1.existsSync)(ignorePath) ? await (0, promises_1.readFile)(ignorePath, "utf8") : "";
586
+ candidates.set(".gitignore", Buffer.from((0, game_source_git_1.updateManagedGitignore)(existingIgnore)));
587
+ // Reconciliation regenerates this file from the material inventory.
588
+ candidates.delete(game_source_git_1.GAME_SOURCE_LOCK_PATH);
589
+ for (const [filePath, content] of candidates)
590
+ (0, game_source_git_1.validateGameSourceGitBlob)(filePath, content);
591
+ }
560
592
  async function checkpointFailedGameSourceWorkspace(input) {
561
593
  const branch = (await git.run(["symbolic-ref", "--short", "HEAD"], input.workspace.projectDir))
562
594
  .toString("utf8")
@@ -4,6 +4,7 @@ export declare function createWorkerInstrumentScreenshotCollector(workspaceDir:
4
4
  push: (chunk: string) => number;
5
5
  finish: () => number;
6
6
  };
7
+ export declare function resolveInstrumentEvidenceDir(workspaceDir: string, evidenceDir: string): string;
7
8
  export declare function saveInstrumentEvidenceCapture(input: {
8
9
  workspaceDir: string;
9
10
  evidenceDir: string;
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.INSTRUMENT_EVIDENCE_MANIFEST_FILE = void 0;
7
7
  exports.createWorkerInstrumentScreenshotCollector = createWorkerInstrumentScreenshotCollector;
8
+ exports.resolveInstrumentEvidenceDir = resolveInstrumentEvidenceDir;
8
9
  exports.saveInstrumentEvidenceCapture = saveInstrumentEvidenceCapture;
9
10
  exports.readAndValidateInstrumentEvidenceManifest = readAndValidateInstrumentEvidenceManifest;
10
11
  const types_1 = require("@playdrop/types");
@@ -142,9 +143,9 @@ function normalizeGroupId(value) {
142
143
  }
143
144
  return normalized;
144
145
  }
145
- function resolveEvidenceDir(workspaceDir, evidenceDir) {
146
+ function resolveInstrumentEvidenceDir(workspaceDir, evidenceDir) {
146
147
  const resolvedWorkspace = node_path_1.default.resolve(workspaceDir);
147
- const resolvedEvidenceDir = node_path_1.default.resolve(evidenceDir);
148
+ const resolvedEvidenceDir = node_path_1.default.resolve(resolvedWorkspace, evidenceDir);
148
149
  if (!isPathInside(resolvedWorkspace, resolvedEvidenceDir)) {
149
150
  throw new Error("instrument_evidence_dir_outside_workspace");
150
151
  }
@@ -169,7 +170,7 @@ async function saveInstrumentEvidenceCapture(input) {
169
170
  if (!screenshot) {
170
171
  throw new Error(`instrument_screenshot_not_found:${screenshotId}`);
171
172
  }
172
- const evidenceDir = resolveEvidenceDir(input.workspaceDir, input.evidenceDir);
173
+ const evidenceDir = resolveInstrumentEvidenceDir(input.workspaceDir, input.evidenceDir);
173
174
  (0, node_fs_1.mkdirSync)(evidenceDir, { recursive: true });
174
175
  const existing = readManifestIfPresent(evidenceDir);
175
176
  if (existing && existing.groupId !== groupId) {
@@ -242,7 +243,7 @@ function normalizeCapture(value, name) {
242
243
  };
243
244
  }
244
245
  function readAndValidateInstrumentEvidenceManifest(input) {
245
- const evidenceDir = resolveEvidenceDir(input.workspaceDir, input.evidenceDir);
246
+ const evidenceDir = resolveInstrumentEvidenceDir(input.workspaceDir, input.evidenceDir);
246
247
  const parsed = readManifestIfPresent(evidenceDir);
247
248
  if (!parsed || parsed.version !== 1) {
248
249
  throw new Error("missing_instrument_evidence_manifest");
@@ -145,6 +145,7 @@ const taskSelection_1 = require("../taskSelection");
145
145
  const review_1 = require("./review");
146
146
  const upload_1 = require("./upload");
147
147
  const staticHtml_1 = require("../apps/staticHtml");
148
+ const devServer_1 = require("./devServer");
148
149
  const runtime_1 = require("./worker/runtime");
149
150
  const instrument_evidence_1 = require("./worker/instrument-evidence");
150
151
  const provider_telemetry_1 = require("./worker/provider-telemetry");
@@ -5626,6 +5627,11 @@ async function startWorker(options = {}) {
5626
5627
  const activeTerminators = new Map();
5627
5628
  const activeDevPorts = new Set();
5628
5629
  const workerDevPortBase = (0, runtime_1.readPositiveEnvInt)("PLAYDROP_WORKER_DEV_PORT_BASE", DEFAULT_WORKER_DEV_PORT_BASE);
5630
+ if (target === "FIRST_PARTY" && node_process_1.default.platform === "darwin" && node_process_1.default.env.PLAYDROP_WORKER_WRAPPER_CONTRACT_VERSION) {
5631
+ const stopped = await (0, devServer_1.stopLegacyWorkerDevRouters)(Array.from({ length: maxParallelTasks }, (_, index) => workerDevPortBase + index));
5632
+ if (stopped)
5633
+ console.log(`Stopped ${stopped} detached dev routers before worker readiness.`);
5634
+ }
5629
5635
  let sessionExpired = false;
5630
5636
  let shuttingDown = false;
5631
5637
  let quiescingForUpdate = false;
@@ -5804,6 +5810,7 @@ async function startWorker(options = {}) {
5804
5810
  let agentResult = null;
5805
5811
  let telemetryReported = false;
5806
5812
  let gameServerDevLease = null;
5813
+ let devRouter = null;
5807
5814
  let gameSourceWorkspace = null;
5808
5815
  let gameSourceCommandServer = null;
5809
5816
  let gameSourcePublication = null;
@@ -6282,6 +6289,9 @@ async function startWorker(options = {}) {
6282
6289
  reasoningEffort = codexModel?.reasoningEffort ?? claudeModel?.effort ?? grokModel?.reasoningEffort ?? null;
6283
6290
  const cleanRoom = task.kind === "STATIC_GAME";
6284
6291
  if (task.kind === "NEW_GAME" || task.kind === "REMIX_GAME" || task.kind === "GAME_UPDATE") {
6292
+ // This port belongs to this task until cleanup. Keeping the router
6293
+ // in the supervisor lifecycle prevents an old CLI surviving upgrades.
6294
+ devRouter = await (0, devServer_1.startOwnedDevRouter)(devPort, node_process_1.default.pid);
6285
6295
  const managedRedisAdminUrl = node_process_1.default.env.PLAYDROP_WORKER_GAME_SERVER_REDIS_ADMIN_URL?.trim() ?? "";
6286
6296
  const managedMongoAdminUrl = node_process_1.default.env.PLAYDROP_WORKER_GAME_SERVER_MONGO_ADMIN_URL?.trim() ?? "";
6287
6297
  const redisAdminUrl = managedRedisAdminUrl || node_process_1.default.env.PLAYDROP_DEV_REDIS_URL?.trim() || "";
@@ -7211,6 +7221,8 @@ async function startWorker(options = {}) {
7211
7221
  clearInterval(eventDrainTimer);
7212
7222
  }
7213
7223
  activeTerminators.delete(task.id);
7224
+ if (devRouter)
7225
+ await (0, devServer_1.terminateChildProcessTree)(devRouter);
7214
7226
  await gameServerDevLease?.cleanup();
7215
7227
  if (completedGameSourceGeneration && gameSourcePublication && gameSourceWorkspace) {
7216
7228
  const publication = gameSourcePublication;
@@ -7735,6 +7747,8 @@ async function uploadTask(options = {}) {
7735
7747
  token: ctx.token,
7736
7748
  user: ctx.user,
7737
7749
  });
7750
+ if (taskContext.gameSourceGit)
7751
+ await (0, game_source_git_1.preflightGameSourceWorkspace)(projectDir);
7738
7752
  for (const warning of result.warnings) {
7739
7753
  console.error(`Preflight warning: ${warning}`);
7740
7754
  }
@@ -8049,7 +8063,7 @@ function readReviewEvidenceFiles(evidenceDir, workspaceDir = resolveTaskWorkspac
8049
8063
  if (!normalizedDir) {
8050
8064
  throw new Error("invalid_review_evidence_dir");
8051
8065
  }
8052
- const resolvedDir = node_path_1.default.resolve(normalizedDir);
8066
+ const resolvedDir = (0, instrument_evidence_1.resolveInstrumentEvidenceDir)(workspaceDir, normalizedDir);
8053
8067
  if (!(0, node_fs_1.existsSync)(resolvedDir)) {
8054
8068
  throw new Error("invalid_review_evidence_dir");
8055
8069
  }
@@ -8086,12 +8100,12 @@ function resolveReviewFilePath(filePath, code) {
8086
8100
  }
8087
8101
  return resolved;
8088
8102
  }
8089
- function resolveReviewEvidenceDir(evidenceDir) {
8103
+ function resolveReviewEvidenceDir(evidenceDir, workspaceDir) {
8090
8104
  const normalizedDir = typeof evidenceDir === "string" ? evidenceDir.trim() : "";
8091
8105
  if (!normalizedDir) {
8092
8106
  throw new Error("invalid_review_evidence_dir");
8093
8107
  }
8094
- const resolved = node_path_1.default.resolve(normalizedDir);
8108
+ const resolved = (0, instrument_evidence_1.resolveInstrumentEvidenceDir)(workspaceDir, normalizedDir);
8095
8109
  if (!(0, node_fs_1.existsSync)(resolved)) {
8096
8110
  throw new Error("invalid_review_evidence_dir");
8097
8111
  }
@@ -8106,7 +8120,7 @@ async function submitReviewTask(options) {
8106
8120
  const state = (0, review_1.normalizeTerminalReviewState)(options.state);
8107
8121
  const reviewMessageFile = resolveReviewFilePath(options.messageFile, "invalid_review_message_file");
8108
8122
  const creatorFeedbackFile = resolveReviewFilePath(options.creatorFeedbackFile, "invalid_creator_feedback_file");
8109
- const evidenceDir = resolveReviewEvidenceDir(options.evidenceDir);
8123
+ const evidenceDir = resolveReviewEvidenceDir(options.evidenceDir, workspaceDir);
8110
8124
  const reviewMessage = readRequiredTextFile(reviewMessageFile, "invalid_review_message_file");
8111
8125
  const creatorFeedback = readOptionalTextFile(creatorFeedbackFile);
8112
8126
  const platformFeedback = readPlatformFeedbackFile(options.platformFeedbackFile, workspaceDir);
@@ -8169,7 +8183,8 @@ async function submitEvalTask(options) {
8169
8183
  const evidenceFiles = [];
8170
8184
  const groupIds = new Set();
8171
8185
  for (const evidenceDir of evidenceDirs) {
8172
- const manifest = (0, instrument_evidence_1.readAndValidateInstrumentEvidenceManifest)({ workspaceDir, evidenceDir });
8186
+ const resolvedEvidenceDir = (0, instrument_evidence_1.resolveInstrumentEvidenceDir)(workspaceDir, evidenceDir);
8187
+ const manifest = (0, instrument_evidence_1.readAndValidateInstrumentEvidenceManifest)({ workspaceDir, evidenceDir: resolvedEvidenceDir });
8173
8188
  if (groupIds.has(manifest.groupId)) {
8174
8189
  throw new Error(`duplicate_instrument_evidence_group:${manifest.groupId}`);
8175
8190
  }
@@ -8180,7 +8195,7 @@ async function submitEvalTask(options) {
8180
8195
  if (!capture) {
8181
8196
  continue;
8182
8197
  }
8183
- const filePath = node_path_1.default.join(node_path_1.default.resolve(evidenceDir), capture.fileName);
8198
+ const filePath = node_path_1.default.join(resolvedEvidenceDir, capture.fileName);
8184
8199
  evidenceFiles.push({
8185
8200
  groupId: manifest.groupId,
8186
8201
  name: capture.fileName,
@@ -8214,14 +8229,16 @@ async function saveTaskEvidence(options) {
8214
8229
  if (!evidenceDir || !name || !groupId) {
8215
8230
  throw new Error("task_evidence_options_required");
8216
8231
  }
8232
+ const workspaceDir = resolveTaskWorkspaceDir();
8233
+ const resolvedEvidenceDir = (0, instrument_evidence_1.resolveInstrumentEvidenceDir)(workspaceDir, evidenceDir);
8217
8234
  const capture = await (0, instrument_evidence_1.saveInstrumentEvidenceCapture)({
8218
- workspaceDir: resolveTaskWorkspaceDir(),
8219
- evidenceDir,
8235
+ workspaceDir,
8236
+ evidenceDir: resolvedEvidenceDir,
8220
8237
  groupId,
8221
8238
  name,
8222
8239
  ...(screenshotId ? { screenshotId } : {}),
8223
8240
  });
8224
- (0, output_1.printSuccess)(`Saved ${capture.name} evidence from screenshot ${capture.screenshotId} to ${capture.fileName}.`);
8241
+ (0, output_1.printSuccess)(`Saved ${capture.name} evidence from screenshot ${capture.screenshotId} to ${node_path_1.default.join(resolvedEvidenceDir, capture.fileName)}.`);
8225
8242
  }
8226
8243
  const INSTRUMENT_ERROR_REASONS = new Set(["auth_state", "browser_control", "renderer", "screenshot"]);
8227
8244
  async function instrumentErrorTask(options) {
@@ -0,0 +1,56 @@
1
+ import type { AgentTaskCreatorFeedbackStatus, AppAuthMode, AppDetailRequest, AppDetailResponse, AppVersionDetailResponse, AppVersionVisibility, ContentCommentsResponse, ContentLicense, ContentRemixRelationsResponse, CreateCommentReportRequest, CreateContentCommentRequest, CreateContentCommentResponse, CreateContentReportRequest, CreateCreatorReportRequest, CreatorBlockMutationResponse, CreatorFollowMutationResponse, CreatorGameCreatorFeedbackStatusResponse, CreatorGamesListResponse, CreatorGameStatusResponse, DeleteContentCommentResponse, DislikedItemMutationResponse, GetLeaderboardResponse, LeaderboardEntry, LikedItemMutationResponse, ListAchievementsResponse, ListLeaderboardsResponse, ModerationReportResponse, SavedItemKind, SavedItemMutationResponse, SocialFriend, TrackEngagementEventRequest, TrackEngagementEventResponse, UpdateVersionResponse } from "@playdrop/types";
2
+ export declare function fetchAppDetail(creatorUsername: string, appName: string, options?: AppDetailRequest): Promise<AppDetailResponse>;
3
+ export declare function fetchUserByUsername(username: string): Promise<import("@playdrop/types").PublicUser>;
4
+ export declare function fetchAssetBySlug(creatorUsername: string, assetName: string): Promise<import("@playdrop/types").AssetResponse>;
5
+ export declare function fetchAssetRelated(creatorUsername: string, assetName: string): Promise<ContentRemixRelationsResponse>;
6
+ export declare function getPlatformGameFriends(appId: number): Promise<SocialFriend[]>;
7
+ export declare function listAchievements(appId: number, options?: {
8
+ includeHiddenDefinitions?: boolean;
9
+ includeRetired?: boolean;
10
+ }): Promise<ListAchievementsResponse>;
11
+ export declare function listLeaderboards(appId: number, options?: {
12
+ includeRetired?: boolean;
13
+ }): Promise<ListLeaderboardsResponse>;
14
+ export declare function getLeaderboard(appId: number, key: string, options?: {
15
+ top?: number;
16
+ aroundMe?: number;
17
+ includeRetired?: boolean;
18
+ }): Promise<GetLeaderboardResponse>;
19
+ export declare function getFriendLeaderboardEntries(appId: number, key: string): Promise<LeaderboardEntry[]>;
20
+ export declare function getAppVersion(creatorUsername: string, appName: string, version: string): Promise<AppVersionDetailResponse>;
21
+ export declare function updateAppVersion(creatorUsername: string, appName: string, version: string, updates: {
22
+ releaseNotes?: string | null;
23
+ visibility?: AppVersionVisibility;
24
+ authMode?: AppAuthMode;
25
+ license?: ContentLicense;
26
+ setAsCurrent?: boolean;
27
+ }): Promise<UpdateVersionResponse>;
28
+ export declare function getCreatorGameStatus(gameRef: string): Promise<CreatorGameStatusResponse>;
29
+ export declare function listCreatorGames(options?: {
30
+ limit?: number;
31
+ offset?: number;
32
+ signal?: AbortSignal;
33
+ }): Promise<CreatorGamesListResponse>;
34
+ export declare function updateCreatorGameFeedbackStatus(gameRef: string, appVersionId: number, creatorFeedbackStatus: AgentTaskCreatorFeedbackStatus, comment?: string): Promise<CreatorGameCreatorFeedbackStatusResponse>;
35
+ export declare function trackEngagementEvent(payload: TrackEngagementEventRequest): Promise<TrackEngagementEventResponse>;
36
+ export declare function saveItem(kind: SavedItemKind, creatorUsername: string, itemName: string): Promise<SavedItemMutationResponse>;
37
+ export declare function unsaveItem(kind: SavedItemKind, creatorUsername: string, itemName: string): Promise<SavedItemMutationResponse>;
38
+ export declare function likeItem(kind: SavedItemKind, creatorUsername: string, itemName: string): Promise<LikedItemMutationResponse>;
39
+ export declare function unlikeItem(kind: SavedItemKind, creatorUsername: string, itemName: string): Promise<LikedItemMutationResponse>;
40
+ export declare function dislikeItem(kind: SavedItemKind, creatorUsername: string, itemName: string): Promise<DislikedItemMutationResponse>;
41
+ export declare function undislikeItem(kind: SavedItemKind, creatorUsername: string, itemName: string): Promise<DislikedItemMutationResponse>;
42
+ export declare function reportContent(kind: SavedItemKind, creatorUsername: string, itemName: string, report: CreateContentReportRequest): Promise<ModerationReportResponse>;
43
+ export declare function reportCreator(creatorUsername: string, report: CreateCreatorReportRequest): Promise<ModerationReportResponse>;
44
+ export declare function followCreator(creatorUsername: string): Promise<CreatorFollowMutationResponse>;
45
+ export declare function unfollowCreator(creatorUsername: string): Promise<CreatorFollowMutationResponse>;
46
+ export declare function blockCreator(creatorUsername: string): Promise<CreatorBlockMutationResponse>;
47
+ export declare function unblockCreator(creatorUsername: string): Promise<CreatorBlockMutationResponse>;
48
+ export declare function fetchContentComments(kind: SavedItemKind, creatorUsername: string, itemName: string): Promise<ContentCommentsResponse>;
49
+ export declare function createContentComment(kind: SavedItemKind, creatorUsername: string, itemName: string, body: CreateContentCommentRequest): Promise<CreateContentCommentResponse>;
50
+ export declare function likeContentComment(commentId: number): Promise<LikedItemMutationResponse>;
51
+ export declare function unlikeContentComment(commentId: number): Promise<LikedItemMutationResponse>;
52
+ export declare function dislikeContentComment(commentId: number): Promise<DislikedItemMutationResponse>;
53
+ export declare function undislikeContentComment(commentId: number): Promise<DislikedItemMutationResponse>;
54
+ export declare function reportComment(commentId: number, report: CreateCommentReportRequest): Promise<ModerationReportResponse>;
55
+ export declare function deleteContentComment(commentId: number): Promise<DeleteContentCommentResponse>;
56
+ //# sourceMappingURL=acquisition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acquisition.d.ts","sourceRoot":"","sources":["../src/acquisition.ts"],"names":[],"mappings":"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"}