@agent-native/core 0.49.27 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/agent/harness/ai-sdk-adapter.d.ts +13 -0
  2. package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -0
  3. package/dist/agent/harness/ai-sdk-adapter.js +232 -0
  4. package/dist/agent/harness/ai-sdk-adapter.js.map +1 -0
  5. package/dist/agent/harness/background.d.ts +15 -0
  6. package/dist/agent/harness/background.d.ts.map +1 -0
  7. package/dist/agent/harness/background.js +233 -0
  8. package/dist/agent/harness/background.js.map +1 -0
  9. package/dist/agent/harness/builtin.d.ts +2 -0
  10. package/dist/agent/harness/builtin.d.ts.map +1 -0
  11. package/dist/agent/harness/builtin.js +24 -0
  12. package/dist/agent/harness/builtin.js.map +1 -0
  13. package/dist/agent/harness/index.d.ts +9 -0
  14. package/dist/agent/harness/index.d.ts.map +1 -0
  15. package/dist/agent/harness/index.js +8 -0
  16. package/dist/agent/harness/index.js.map +1 -0
  17. package/dist/agent/harness/registry.d.ts +15 -0
  18. package/dist/agent/harness/registry.d.ts.map +1 -0
  19. package/dist/agent/harness/registry.js +70 -0
  20. package/dist/agent/harness/registry.js.map +1 -0
  21. package/dist/agent/harness/runner.d.ts +21 -0
  22. package/dist/agent/harness/runner.d.ts.map +1 -0
  23. package/dist/agent/harness/runner.js +86 -0
  24. package/dist/agent/harness/runner.js.map +1 -0
  25. package/dist/agent/harness/store.d.ts +46 -0
  26. package/dist/agent/harness/store.d.ts.map +1 -0
  27. package/dist/agent/harness/store.js +304 -0
  28. package/dist/agent/harness/store.js.map +1 -0
  29. package/dist/agent/harness/translate.d.ts +5 -0
  30. package/dist/agent/harness/translate.d.ts.map +1 -0
  31. package/dist/agent/harness/translate.js +120 -0
  32. package/dist/agent/harness/translate.js.map +1 -0
  33. package/dist/agent/harness/types.d.ts +127 -0
  34. package/dist/agent/harness/types.d.ts.map +1 -0
  35. package/dist/agent/harness/types.js +2 -0
  36. package/dist/agent/harness/types.js.map +1 -0
  37. package/dist/agent/production-agent.d.ts.map +1 -1
  38. package/dist/agent/production-agent.js +2 -0
  39. package/dist/agent/production-agent.js.map +1 -1
  40. package/dist/cli/create.d.ts.map +1 -1
  41. package/dist/cli/create.js +10 -1
  42. package/dist/cli/create.js.map +1 -1
  43. package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
  44. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  45. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  46. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  47. package/dist/cli/skills.d.ts +1 -1
  48. package/dist/cli/skills.d.ts.map +1 -1
  49. package/dist/cli/skills.js +8 -1
  50. package/dist/cli/skills.js.map +1 -1
  51. package/dist/client/blocks/library/wireframe.d.ts.map +1 -1
  52. package/dist/client/blocks/library/wireframe.js +0 -1
  53. package/dist/client/blocks/library/wireframe.js.map +1 -1
  54. package/dist/client/resources/use-resources.d.ts.map +1 -1
  55. package/dist/client/resources/use-resources.js +4 -2
  56. package/dist/client/resources/use-resources.js.map +1 -1
  57. package/dist/code-agents/background-run.d.ts +6 -4
  58. package/dist/code-agents/background-run.d.ts.map +1 -1
  59. package/dist/code-agents/background-run.js.map +1 -1
  60. package/dist/coding-tools/run-code.js +6 -4
  61. package/dist/coding-tools/run-code.js.map +1 -1
  62. package/dist/provider-api/index.d.ts +20 -12
  63. package/dist/provider-api/index.d.ts.map +1 -1
  64. package/dist/provider-api/index.js +157 -37
  65. package/dist/provider-api/index.js.map +1 -1
  66. package/dist/provider-api/quota-governor.d.ts +53 -0
  67. package/dist/provider-api/quota-governor.d.ts.map +1 -0
  68. package/dist/provider-api/quota-governor.js +395 -0
  69. package/dist/provider-api/quota-governor.js.map +1 -0
  70. package/dist/provider-api/staging.d.ts.map +1 -1
  71. package/dist/provider-api/staging.js +16 -0
  72. package/dist/provider-api/staging.js.map +1 -1
  73. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  74. package/dist/server/agent-chat-plugin.js +34 -10
  75. package/dist/server/agent-chat-plugin.js.map +1 -1
  76. package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +98 -0
  77. package/dist/workspace-files/index.d.ts +0 -1
  78. package/dist/workspace-files/index.d.ts.map +1 -1
  79. package/dist/workspace-files/index.js +0 -1
  80. package/dist/workspace-files/index.js.map +1 -1
  81. package/dist/workspace-files/store.d.ts +14 -9
  82. package/dist/workspace-files/store.d.ts.map +1 -1
  83. package/dist/workspace-files/store.js +89 -164
  84. package/dist/workspace-files/store.js.map +1 -1
  85. package/dist/workspace-files/tool.d.ts +3 -4
  86. package/dist/workspace-files/tool.d.ts.map +1 -1
  87. package/dist/workspace-files/tool.js +8 -7
  88. package/dist/workspace-files/tool.js.map +1 -1
  89. package/docs/content/deployment.md +1 -1
  90. package/package.json +2 -1
  91. package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +98 -0
  92. package/dist/workspace-files/schema.d.ts +0 -195
  93. package/dist/workspace-files/schema.d.ts.map +0 -1
  94. package/dist/workspace-files/schema.js +0 -48
  95. package/dist/workspace-files/schema.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"staging.js","sourceRoot":"","sources":["../../src/provider-api/staging.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Server-side staging layer for provider-api responses.\n *\n * ## P0 — stageAs\n * Instead of returning a raw response body to the model (which hits the 50K-char\n * context-window truncation and biases aggregates), the caller can pass\n * `stageAs: \"dataset_name\"` to `stagingExecuteRequest`. The runtime will:\n * 1. Execute the provider HTTP request.\n * 2. Auto-detect the items array in common response shapes.\n * 3. Write rows into `staged_datasets` + `staged_dataset_rows`.\n * 4. Return only { dataset, rowCount, columns, sampleRows: first 5 }.\n *\n * ## P1 — fetchAll\n * When `pagination` config is supplied alongside `stageAs`, the runtime\n * iterates pages server-side:\n * - Supports nextCursor (embedded in response), offset, and page modes.\n * - Handles 429 / Retry-After with exponential back-off.\n * - Caps at maxPages (default 50, up to 200).\n * - Returns { dataset, pages, rows, truncated, lastCursor } so the agent\n * can resume with another call when capped.\n *\n * Security: re-uses executeProviderApiRequest from index.ts — SSRF-safety and\n * secret redaction are fully preserved. We read the raw (pre-redacted) JSON\n * here; redaction is applied to the response returned to the model.\n */\n\nimport type { ProviderApiRequestArgs } from \"./index.js\";\nimport {\n upsertStagedDataset,\n deriveColumns,\n MAX_ROWS_PER_APP,\n} from \"./staged-datasets-store.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Auto-detect or explicit path to the items array in a JSON response. */\nexport type ItemsPath =\n | \"auto\"\n | \"data\"\n | \"results\"\n | \"items\"\n | \"records\"\n | \"rows\"\n | string;\n\nexport interface PaginationConfig {\n /**\n * Dot-path in the response JSON for the next cursor/token value.\n * e.g. \"next_cursor\", \"meta.next\", \"pagination.cursor\"\n */\n nextCursorPath?: string;\n /**\n * Query parameter name to use for the cursor in the next request.\n * Use this for APIs that page with query params.\n */\n cursorParam?: string;\n /**\n * Dot-path in the JSON request body to set to the cursor value in the next\n * request. Use this for APIs that page via POST body fields.\n */\n cursorBodyPath?: string;\n /**\n * Use page-number mode: send `pageParam=N` for each subsequent page.\n */\n pageParam?: string;\n /** Starting page number (default 1). */\n startPage?: number;\n /**\n * Use offset mode: send `offsetParam=N` for each subsequent request.\n */\n offsetParam?: string;\n /**\n * Hint at expected page size for offset increments. Defaults to the\n * actual item count of the first page.\n */\n pageSize?: number;\n /** Maximum pages to fetch (default 50, max 200). */\n maxPages?: number;\n}\n\nexport interface StageAsOptions {\n stageAs: string;\n itemsPath?: ItemsPath;\n pagination?: PaginationConfig;\n}\n\nexport interface StagingRequestArgs extends ProviderApiRequestArgs {\n stageAs?: string;\n itemsPath?: ItemsPath;\n pagination?: PaginationConfig;\n}\n\nexport interface StagingResult {\n dataset: {\n id: string;\n name: string;\n rowCount: number;\n columns: string[];\n sampleRows: Record<string, unknown>[];\n };\n pages?: number;\n rows?: number;\n truncated?: boolean;\n lastCursor?: string | number | null;\n provider: unknown;\n request: unknown;\n guidance: string;\n}\n\n// ---------------------------------------------------------------------------\n// Resolve runtime context for scope (appId + ownerEmail)\n// ---------------------------------------------------------------------------\n\n/** Minimal callable interface accepted by stagingExecuteRequest. */\nexport type ProviderApiExecutor = (\n args: ProviderApiRequestArgs,\n) => Promise<unknown>;\n\nexport interface StagingRuntimeContext {\n appId: string;\n ownerEmail: string;\n}\n\n// ---------------------------------------------------------------------------\n// JSON path resolution helper\n// ---------------------------------------------------------------------------\n\nfunction getAtPath(obj: unknown, path: string): unknown {\n if (!path || obj === undefined || obj === null) return obj;\n const parts = path.split(\".\");\n let cur: unknown = obj;\n for (const part of parts) {\n if (cur === null || cur === undefined || typeof cur !== \"object\")\n return undefined;\n cur = (cur as Record<string, unknown>)[part];\n }\n return cur;\n}\n\n// ---------------------------------------------------------------------------\n// Auto-detect items array\n// ---------------------------------------------------------------------------\n\nexport function extractItemsArray(\n body: unknown,\n itemsPath: ItemsPath = \"auto\",\n): unknown[] {\n if (!body || typeof body !== \"object\") return [];\n\n if (Array.isArray(body)) return body as unknown[];\n\n if (itemsPath !== \"auto\") {\n const val = getAtPath(body, itemsPath);\n return Array.isArray(val) ? (val as unknown[]) : [];\n }\n\n // Auto-detect: common shapes\n const obj = body as Record<string, unknown>;\n for (const key of [\"data\", \"results\", \"items\", \"records\", \"rows\"]) {\n if (Array.isArray(obj[key])) return obj[key] as unknown[];\n }\n\n // Many provider APIs return `{ providerSpecificName: [...], metadata: ... }`.\n // If exactly one top-level field is an array, treat that as the item list\n // without hardcoding provider vocabulary.\n const arrayFields = Object.values(obj).filter(Array.isArray);\n if (arrayFields.length === 1) {\n return arrayFields[0] as unknown[];\n }\n\n // If the object itself looks like a flat row, wrap it\n return [];\n}\n\nfunction extractNextCursor(body: unknown, path: string): string | null {\n const val = getAtPath(body, path);\n if (val === null || val === undefined || val === \"\" || val === false)\n return null;\n return String(val);\n}\n\nfunction setAtPath(base: unknown, path: string, value: unknown): unknown {\n const root =\n base && typeof base === \"object\" && !Array.isArray(base)\n ? { ...(base as Record<string, unknown>) }\n : {};\n const parts = path.split(\".\").filter(Boolean);\n if (!parts.length) return root;\n\n let current: Record<string, unknown> = root;\n for (const part of parts.slice(0, -1)) {\n const existing = current[part];\n const next =\n existing && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n current[part] = next;\n current = next;\n }\n current[parts[parts.length - 1]!] = value;\n return root;\n}\n\n// ---------------------------------------------------------------------------\n// 429 / Retry-After handling\n// ---------------------------------------------------------------------------\n\nasync function sleepMs(ms: number): Promise<void> {\n await new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nfunction getRetryAfterMs(\n responseHeaders: Record<string, string> | undefined,\n attempt: number,\n): number {\n if (responseHeaders) {\n const raw =\n responseHeaders[\"retry-after\"] ?? responseHeaders[\"Retry-After\"];\n if (raw) {\n const secs = parseFloat(raw);\n if (!isNaN(secs)) return secs * 1000;\n }\n }\n // Exponential back-off: 1s, 2s, 4s, 8s, cap 30s\n return Math.min(1000 * Math.pow(2, attempt), 30_000);\n}\n\n// ---------------------------------------------------------------------------\n// Core staging executor\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a provider API request and stage the result into scratch storage.\n * Returns a compact summary instead of the raw body.\n *\n * @param args — request args including stageAs / itemsPath / pagination\n * @param execute — callable provider executor (e.g. `runtime.executeRequest.bind(runtime)`)\n * @param ctx — (appId, ownerEmail) for dataset ownership scoping\n */\nexport async function stagingExecuteRequest(\n args: StagingRequestArgs,\n execute: ProviderApiExecutor,\n ctx: StagingRuntimeContext,\n): Promise<StagingResult> {\n const datasetName = args.stageAs!;\n const itemsPath = args.itemsPath ?? \"auto\";\n const pagination = args.pagination;\n const maxPages = Math.min(pagination?.maxPages ?? 50, 200);\n if (\n pagination?.nextCursorPath &&\n !pagination.cursorParam &&\n !pagination.cursorBodyPath\n ) {\n throw new Error(\n \"Pagination with nextCursorPath requires cursorParam or cursorBodyPath.\",\n );\n }\n\n // Strip staging fields from the underlying request args\n const baseArgs: ProviderApiRequestArgs = {\n provider: args.provider,\n method: args.method,\n path: args.path,\n query: args.query,\n headers: args.headers,\n body: args.body,\n auth: args.auth,\n timeoutMs: args.timeoutMs,\n maxBytes: args.maxBytes,\n connectionId: args.connectionId,\n accountId: args.accountId,\n };\n\n let allRows: Record<string, unknown>[] = [];\n let pages = 0;\n let truncated = false;\n let lastCursor: string | number | null = null;\n let providerMeta: unknown;\n let requestMeta: unknown;\n\n // Generate a stable dataset id for this name+owner combination so re-staging\n // the same dataset replaces it rather than accumulating duplicates.\n const datasetId = `ds_${ctx.appId}_${ctx.ownerEmail}_${datasetName}`\n .replace(/[^a-zA-Z0-9_-]/g, \"_\")\n .slice(0, 80);\n\n // -------------------------------------------------------------------------\n // Page loop\n // -------------------------------------------------------------------------\n let currentArgs = { ...baseArgs };\n let pageNum = pagination?.startPage ?? 1;\n let offset = 0;\n\n for (let pageIndex = 0; pageIndex < maxPages; pageIndex++) {\n // Inject pagination params for pages 2+\n if (pageIndex > 0 && pagination) {\n const extraQuery: Record<string, unknown> =\n typeof baseArgs.query === \"object\" && baseArgs.query !== null\n ? { ...(baseArgs.query as Record<string, unknown>) }\n : {};\n let nextBody = baseArgs.body;\n\n if (pagination.cursorParam && lastCursor !== null) {\n extraQuery[pagination.cursorParam] = lastCursor;\n }\n if (pagination.cursorBodyPath && lastCursor !== null) {\n nextBody = setAtPath(\n baseArgs.body,\n pagination.cursorBodyPath,\n lastCursor,\n );\n }\n const hasCursorMode =\n Boolean(pagination.cursorParam) || Boolean(pagination.cursorBodyPath);\n if (pagination.pageParam && !hasCursorMode) {\n extraQuery[pagination.pageParam] = pageNum;\n } else if (pagination.offsetParam && !hasCursorMode) {\n extraQuery[pagination.offsetParam] = offset;\n } else if (!hasCursorMode) {\n // No pagination config for next page — stop\n break;\n }\n currentArgs = { ...baseArgs, query: extraQuery, body: nextBody };\n }\n\n // -----------------------------------------------------------------------\n // Execute with retry on 429\n // -----------------------------------------------------------------------\n let result: Record<string, unknown>;\n let attempt = 0;\n for (;;) {\n const raw = (await execute(currentArgs)) as Record<string, unknown>;\n const response = raw.response as Record<string, unknown> | undefined;\n if (response?.status === 429) {\n if (attempt >= 5) {\n throw new Error(\n `Provider returned 429 Too Many Requests after ${attempt + 1} attempts. ` +\n `Try again later or reduce the page count.`,\n );\n }\n const waitMs = getRetryAfterMs(\n response.headers as Record<string, string> | undefined,\n attempt,\n );\n await sleepMs(waitMs);\n attempt++;\n continue;\n }\n result = raw;\n break;\n }\n\n pages++;\n if (pageIndex === 0) {\n providerMeta = result.provider;\n requestMeta = result.request;\n }\n\n const response = result.response as Record<string, unknown> | undefined;\n if (!response?.ok) {\n // Non-200 on first page is a hard error; on subsequent pages, stop early\n if (pageIndex === 0) {\n throw new Error(\n `Provider API returned status ${response?.status}: ${JSON.stringify(response?.json ?? response?.text).slice(0, 200)}`,\n );\n }\n truncated = true;\n break;\n }\n\n const body =\n response.json ??\n (response.text ? tryParseJson(response.text as string) : null);\n const pageRows = extractItemsArray(body, itemsPath);\n\n if (pageRows.length === 0) {\n // Empty page — end of data\n break;\n }\n\n const typedRows = pageRows.map((r) =>\n r && typeof r === \"object\"\n ? (r as Record<string, unknown>)\n : { value: r },\n );\n allRows = allRows.concat(typedRows);\n\n // Cap check — stop before exceeding limit\n if (allRows.length >= MAX_ROWS_PER_APP) {\n truncated = true;\n allRows = allRows.slice(0, MAX_ROWS_PER_APP);\n break;\n }\n\n // If no pagination config or single-page mode, stop after first page\n if (!pagination || pageIndex === maxPages - 1) {\n if (pageIndex === maxPages - 1 && pagination) truncated = true;\n break;\n }\n\n // Derive next cursor / offset / page\n if (pagination.nextCursorPath) {\n const next = extractNextCursor(body, pagination.nextCursorPath);\n if (!next) break; // No more pages\n lastCursor = next;\n } else if (pagination.pageParam) {\n pageNum++;\n } else if (pagination.offsetParam) {\n const pageSize = pagination.pageSize ?? pageRows.length;\n offset += pageSize;\n } else {\n break;\n }\n }\n\n // -------------------------------------------------------------------------\n // Persist to staging store\n // -------------------------------------------------------------------------\n const columns = deriveColumns(allRows);\n const meta = await upsertStagedDataset({\n id: datasetId,\n appId: ctx.appId,\n ownerEmail: ctx.ownerEmail,\n name: datasetName,\n rows: allRows,\n columns,\n });\n\n return {\n dataset: {\n id: meta.id,\n name: meta.name,\n rowCount: meta.rowCount,\n columns: meta.columns,\n sampleRows: allRows.slice(0, 5),\n },\n ...(pagination\n ? {\n pages,\n rows: allRows.length,\n truncated,\n lastCursor,\n }\n : {}),\n provider: providerMeta,\n request: requestMeta,\n guidance:\n \"Data staged successfully. Use query-staged-dataset to run aggregations on this dataset without re-fetching. \" +\n \"Staging avoids sending raw response bodies through the context window.\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utility\n// ---------------------------------------------------------------------------\n\nfunction tryParseJson(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"staging.js","sourceRoot":"","sources":["../../src/provider-api/staging.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Server-side staging layer for provider-api responses.\n *\n * ## P0 — stageAs\n * Instead of returning a raw response body to the model (which hits the 50K-char\n * context-window truncation and biases aggregates), the caller can pass\n * `stageAs: \"dataset_name\"` to `stagingExecuteRequest`. The runtime will:\n * 1. Execute the provider HTTP request.\n * 2. Auto-detect the items array in common response shapes.\n * 3. Write rows into `staged_datasets` + `staged_dataset_rows`.\n * 4. Return only { dataset, rowCount, columns, sampleRows: first 5 }.\n *\n * ## P1 — fetchAll\n * When `pagination` config is supplied alongside `stageAs`, the runtime\n * iterates pages server-side:\n * - Supports nextCursor (embedded in response), offset, and page modes.\n * - Handles 429 / Retry-After with exponential back-off.\n * - Caps at maxPages (default 50, up to 200).\n * - Returns { dataset, pages, rows, truncated, lastCursor } so the agent\n * can resume with another call when capped.\n *\n * Security: re-uses executeProviderApiRequest from index.ts — SSRF-safety and\n * secret redaction are fully preserved. We read the raw (pre-redacted) JSON\n * here; redaction is applied to the response returned to the model.\n */\n\nimport type { ProviderApiRequestArgs } from \"./index.js\";\nimport {\n upsertStagedDataset,\n deriveColumns,\n MAX_ROWS_PER_APP,\n} from \"./staged-datasets-store.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Auto-detect or explicit path to the items array in a JSON response. */\nexport type ItemsPath =\n | \"auto\"\n | \"data\"\n | \"results\"\n | \"items\"\n | \"records\"\n | \"rows\"\n | string;\n\nexport interface PaginationConfig {\n /**\n * Dot-path in the response JSON for the next cursor/token value.\n * e.g. \"next_cursor\", \"meta.next\", \"pagination.cursor\"\n */\n nextCursorPath?: string;\n /**\n * Query parameter name to use for the cursor in the next request.\n * Use this for APIs that page with query params.\n */\n cursorParam?: string;\n /**\n * Dot-path in the JSON request body to set to the cursor value in the next\n * request. Use this for APIs that page via POST body fields.\n */\n cursorBodyPath?: string;\n /**\n * Use page-number mode: send `pageParam=N` for each subsequent page.\n */\n pageParam?: string;\n /** Starting page number (default 1). */\n startPage?: number;\n /**\n * Use offset mode: send `offsetParam=N` for each subsequent request.\n */\n offsetParam?: string;\n /**\n * Hint at expected page size for offset increments. Defaults to the\n * actual item count of the first page.\n */\n pageSize?: number;\n /** Maximum pages to fetch (default 50, max 200). */\n maxPages?: number;\n}\n\nexport interface StageAsOptions {\n stageAs: string;\n itemsPath?: ItemsPath;\n pagination?: PaginationConfig;\n}\n\nexport interface StagingRequestArgs extends ProviderApiRequestArgs {\n stageAs?: string;\n itemsPath?: ItemsPath;\n pagination?: PaginationConfig;\n}\n\nexport interface StagingResult {\n dataset: {\n id: string;\n name: string;\n rowCount: number;\n columns: string[];\n sampleRows: Record<string, unknown>[];\n };\n pages?: number;\n rows?: number;\n truncated?: boolean;\n lastCursor?: string | number | null;\n provider: unknown;\n request: unknown;\n guidance: string;\n}\n\n// ---------------------------------------------------------------------------\n// Resolve runtime context for scope (appId + ownerEmail)\n// ---------------------------------------------------------------------------\n\n/** Minimal callable interface accepted by stagingExecuteRequest. */\nexport type ProviderApiExecutor = (\n args: ProviderApiRequestArgs,\n) => Promise<unknown>;\n\nexport interface StagingRuntimeContext {\n appId: string;\n ownerEmail: string;\n}\n\n// ---------------------------------------------------------------------------\n// JSON path resolution helper\n// ---------------------------------------------------------------------------\n\nfunction getAtPath(obj: unknown, path: string): unknown {\n if (!path || obj === undefined || obj === null) return obj;\n const parts = path.split(\".\");\n let cur: unknown = obj;\n for (const part of parts) {\n if (cur === null || cur === undefined || typeof cur !== \"object\")\n return undefined;\n cur = (cur as Record<string, unknown>)[part];\n }\n return cur;\n}\n\n// ---------------------------------------------------------------------------\n// Auto-detect items array\n// ---------------------------------------------------------------------------\n\nexport function extractItemsArray(\n body: unknown,\n itemsPath: ItemsPath = \"auto\",\n): unknown[] {\n if (!body || typeof body !== \"object\") return [];\n\n if (Array.isArray(body)) return body as unknown[];\n\n if (itemsPath !== \"auto\") {\n const val = getAtPath(body, itemsPath);\n return Array.isArray(val) ? (val as unknown[]) : [];\n }\n\n // Auto-detect: common shapes\n const obj = body as Record<string, unknown>;\n for (const key of [\"data\", \"results\", \"items\", \"records\", \"rows\"]) {\n if (Array.isArray(obj[key])) return obj[key] as unknown[];\n }\n\n // Many provider APIs return `{ providerSpecificName: [...], metadata: ... }`.\n // If exactly one top-level field is an array, treat that as the item list\n // without hardcoding provider vocabulary.\n const arrayFields = Object.values(obj).filter(Array.isArray);\n if (arrayFields.length === 1) {\n return arrayFields[0] as unknown[];\n }\n\n // If the object itself looks like a flat row, wrap it\n return [];\n}\n\nfunction extractNextCursor(body: unknown, path: string): string | null {\n const val = getAtPath(body, path);\n if (val === null || val === undefined || val === \"\" || val === false)\n return null;\n return String(val);\n}\n\nfunction setAtPath(base: unknown, path: string, value: unknown): unknown {\n const root =\n base && typeof base === \"object\" && !Array.isArray(base)\n ? { ...(base as Record<string, unknown>) }\n : {};\n const parts = path.split(\".\").filter(Boolean);\n if (!parts.length) return root;\n\n let current: Record<string, unknown> = root;\n for (const part of parts.slice(0, -1)) {\n const existing = current[part];\n const next =\n existing && typeof existing === \"object\" && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : {};\n current[part] = next;\n current = next;\n }\n current[parts[parts.length - 1]!] = value;\n return root;\n}\n\n// ---------------------------------------------------------------------------\n// 429 / Retry-After handling\n// ---------------------------------------------------------------------------\n\nasync function sleepMs(ms: number): Promise<void> {\n await new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nfunction getRetryAfterMs(\n responseHeaders: Record<string, string> | undefined,\n attempt: number,\n): number {\n if (responseHeaders) {\n const raw =\n responseHeaders[\"retry-after\"] ?? responseHeaders[\"Retry-After\"];\n if (raw) {\n const secs = parseFloat(raw);\n if (!isNaN(secs)) return secs * 1000;\n }\n }\n // Exponential back-off: 1s, 2s, 4s, 8s, cap 30s\n return Math.min(1000 * Math.pow(2, attempt), 30_000);\n}\n\nfunction isProviderQuotaCooldown(response: Record<string, unknown>): boolean {\n const headers = response.headers as Record<string, string> | undefined;\n const quotaHeader =\n headers?.[\"x-agent-native-provider-quota\"] ??\n headers?.[\"X-Agent-Native-Provider-Quota\"];\n if (quotaHeader === \"exhausted\") return true;\n const json = response.json as Record<string, unknown> | undefined;\n return json?.error === \"provider_quota_exhausted\";\n}\n\n// ---------------------------------------------------------------------------\n// Core staging executor\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a provider API request and stage the result into scratch storage.\n * Returns a compact summary instead of the raw body.\n *\n * @param args — request args including stageAs / itemsPath / pagination\n * @param execute — callable provider executor (e.g. `runtime.executeRequest.bind(runtime)`)\n * @param ctx — (appId, ownerEmail) for dataset ownership scoping\n */\nexport async function stagingExecuteRequest(\n args: StagingRequestArgs,\n execute: ProviderApiExecutor,\n ctx: StagingRuntimeContext,\n): Promise<StagingResult> {\n const datasetName = args.stageAs!;\n const itemsPath = args.itemsPath ?? \"auto\";\n const pagination = args.pagination;\n const maxPages = Math.min(pagination?.maxPages ?? 50, 200);\n if (\n pagination?.nextCursorPath &&\n !pagination.cursorParam &&\n !pagination.cursorBodyPath\n ) {\n throw new Error(\n \"Pagination with nextCursorPath requires cursorParam or cursorBodyPath.\",\n );\n }\n\n // Strip staging fields from the underlying request args\n const baseArgs: ProviderApiRequestArgs = {\n provider: args.provider,\n method: args.method,\n path: args.path,\n query: args.query,\n headers: args.headers,\n body: args.body,\n auth: args.auth,\n timeoutMs: args.timeoutMs,\n maxBytes: args.maxBytes,\n connectionId: args.connectionId,\n accountId: args.accountId,\n };\n\n let allRows: Record<string, unknown>[] = [];\n let pages = 0;\n let truncated = false;\n let lastCursor: string | number | null = null;\n let providerMeta: unknown;\n let requestMeta: unknown;\n\n // Generate a stable dataset id for this name+owner combination so re-staging\n // the same dataset replaces it rather than accumulating duplicates.\n const datasetId = `ds_${ctx.appId}_${ctx.ownerEmail}_${datasetName}`\n .replace(/[^a-zA-Z0-9_-]/g, \"_\")\n .slice(0, 80);\n\n // -------------------------------------------------------------------------\n // Page loop\n // -------------------------------------------------------------------------\n let currentArgs = { ...baseArgs };\n let pageNum = pagination?.startPage ?? 1;\n let offset = 0;\n\n for (let pageIndex = 0; pageIndex < maxPages; pageIndex++) {\n // Inject pagination params for pages 2+\n if (pageIndex > 0 && pagination) {\n const extraQuery: Record<string, unknown> =\n typeof baseArgs.query === \"object\" && baseArgs.query !== null\n ? { ...(baseArgs.query as Record<string, unknown>) }\n : {};\n let nextBody = baseArgs.body;\n\n if (pagination.cursorParam && lastCursor !== null) {\n extraQuery[pagination.cursorParam] = lastCursor;\n }\n if (pagination.cursorBodyPath && lastCursor !== null) {\n nextBody = setAtPath(\n baseArgs.body,\n pagination.cursorBodyPath,\n lastCursor,\n );\n }\n const hasCursorMode =\n Boolean(pagination.cursorParam) || Boolean(pagination.cursorBodyPath);\n if (pagination.pageParam && !hasCursorMode) {\n extraQuery[pagination.pageParam] = pageNum;\n } else if (pagination.offsetParam && !hasCursorMode) {\n extraQuery[pagination.offsetParam] = offset;\n } else if (!hasCursorMode) {\n // No pagination config for next page — stop\n break;\n }\n currentArgs = { ...baseArgs, query: extraQuery, body: nextBody };\n }\n\n // -----------------------------------------------------------------------\n // Execute with retry on 429\n // -----------------------------------------------------------------------\n let result: Record<string, unknown>;\n let attempt = 0;\n for (;;) {\n const raw = (await execute(currentArgs)) as Record<string, unknown>;\n const response = raw.response as Record<string, unknown> | undefined;\n if (response?.status === 429) {\n if (isProviderQuotaCooldown(response)) {\n const json = response.json as Record<string, unknown> | undefined;\n const retryAt =\n typeof json?.retryAt === \"string\"\n ? ` Retry after ${json.retryAt}.`\n : \"\";\n throw new Error(`Provider API quota exhausted (429).${retryAt}`);\n }\n if (attempt >= 5) {\n throw new Error(\n `Provider returned 429 Too Many Requests after ${attempt + 1} attempts. ` +\n `Try again later or reduce the page count.`,\n );\n }\n const waitMs = getRetryAfterMs(\n response.headers as Record<string, string> | undefined,\n attempt,\n );\n await sleepMs(waitMs);\n attempt++;\n continue;\n }\n result = raw;\n break;\n }\n\n pages++;\n if (pageIndex === 0) {\n providerMeta = result.provider;\n requestMeta = result.request;\n }\n\n const response = result.response as Record<string, unknown> | undefined;\n if (!response?.ok) {\n // Non-200 on first page is a hard error; on subsequent pages, stop early\n if (pageIndex === 0) {\n throw new Error(\n `Provider API returned status ${response?.status}: ${JSON.stringify(response?.json ?? response?.text).slice(0, 200)}`,\n );\n }\n truncated = true;\n break;\n }\n\n const body =\n response.json ??\n (response.text ? tryParseJson(response.text as string) : null);\n const pageRows = extractItemsArray(body, itemsPath);\n\n if (pageRows.length === 0) {\n // Empty page — end of data\n break;\n }\n\n const typedRows = pageRows.map((r) =>\n r && typeof r === \"object\"\n ? (r as Record<string, unknown>)\n : { value: r },\n );\n allRows = allRows.concat(typedRows);\n\n // Cap check — stop before exceeding limit\n if (allRows.length >= MAX_ROWS_PER_APP) {\n truncated = true;\n allRows = allRows.slice(0, MAX_ROWS_PER_APP);\n break;\n }\n\n // If no pagination config or single-page mode, stop after first page\n if (!pagination || pageIndex === maxPages - 1) {\n if (pageIndex === maxPages - 1 && pagination) truncated = true;\n break;\n }\n\n // Derive next cursor / offset / page\n if (pagination.nextCursorPath) {\n const next = extractNextCursor(body, pagination.nextCursorPath);\n if (!next) break; // No more pages\n lastCursor = next;\n } else if (pagination.pageParam) {\n pageNum++;\n } else if (pagination.offsetParam) {\n const pageSize = pagination.pageSize ?? pageRows.length;\n offset += pageSize;\n } else {\n break;\n }\n }\n\n // -------------------------------------------------------------------------\n // Persist to staging store\n // -------------------------------------------------------------------------\n const columns = deriveColumns(allRows);\n const meta = await upsertStagedDataset({\n id: datasetId,\n appId: ctx.appId,\n ownerEmail: ctx.ownerEmail,\n name: datasetName,\n rows: allRows,\n columns,\n });\n\n return {\n dataset: {\n id: meta.id,\n name: meta.name,\n rowCount: meta.rowCount,\n columns: meta.columns,\n sampleRows: allRows.slice(0, 5),\n },\n ...(pagination\n ? {\n pages,\n rows: allRows.length,\n truncated,\n lastCursor,\n }\n : {}),\n provider: providerMeta,\n request: requestMeta,\n guidance:\n \"Data staged successfully. Use query-staged-dataset to run aggregations on this dataset without re-fetching. \" +\n \"Staging avoids sending raw response bodies through the context window.\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utility\n// ---------------------------------------------------------------------------\n\nfunction tryParseJson(text: string): unknown | null {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-chat-plugin.d.ts","sourceRoot":"","sources":["../../src/server/agent-chat-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-chat-plugin.d.ts","sourceRoot":"","sources":["../../src/server/agent-chat-plugin.ts"],"names":[],"mappings":"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"}
@@ -4988,18 +4988,27 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
4988
4988
  // payloads) or abort their run.
4989
4989
  const ownsThread = (threadId) => callerOwnsThread(owner, threadId);
4990
4990
  const ownsRun = (runId) => callerOwnsRun(owner, runId);
4991
- // Route: GET /runs/list?goalId=agent-team
4992
- // Returns hosted Agent Teams in the Code hub-compatible run shape.
4991
+ // Route: GET /runs/list?goalId=agent-team|agent-harness
4992
+ // Returns background agents in the Code hub-compatible run shape.
4993
4993
  const listMatch = url.match(/\/runs\/list(?:[/?]|$)/) ||
4994
4994
  url.match(/^\/list(?:[/?]|$)/);
4995
4995
  if (listMatch && method === "GET") {
4996
4996
  const query = getQuery(event);
4997
4997
  const goalId = query.goalId ? String(query.goalId) : undefined;
4998
4998
  const runs = await runWithRequestContext({ userEmail: owner }, async () => {
4999
- if (goalId && goalId !== "agent-team")
5000
- return [];
5001
- const { listAgentTeamBackgroundRuns } = await import("./agent-teams.js");
5002
- return listAgentTeamBackgroundRuns();
4999
+ const runs = [];
5000
+ if (!goalId || goalId === "agent-team") {
5001
+ const { listAgentTeamBackgroundRuns } = await import("./agent-teams.js");
5002
+ runs.push(...(await listAgentTeamBackgroundRuns()));
5003
+ }
5004
+ if (!goalId || goalId === "agent-harness") {
5005
+ const { listAgentHarnessBackgroundRuns } = await import("../agent/harness/background.js");
5006
+ runs.push(...(await listAgentHarnessBackgroundRuns({
5007
+ goalId: "agent-harness",
5008
+ ownerEmail: owner,
5009
+ })));
5010
+ }
5011
+ return runs;
5003
5012
  });
5004
5013
  return { status: "ok", goalId, runs };
5005
5014
  }
@@ -5011,9 +5020,16 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5011
5020
  if (stopMatch && method === "POST") {
5012
5021
  const runId = decodeURIComponent(stopMatch[1]);
5013
5022
  const { stopAgentTeamBackgroundRun } = await import("./agent-teams.js");
5014
- const result = await runWithRequestContext({ userEmail: owner }, () => stopAgentTeamBackgroundRun(runId));
5023
+ let result = await runWithRequestContext({ userEmail: owner }, () => stopAgentTeamBackgroundRun(runId));
5024
+ if (!result.ok && result.error === "Task not found") {
5025
+ const { stopAgentHarnessBackgroundRun } = await import("../agent/harness/background.js");
5026
+ result = await runWithRequestContext({ userEmail: owner }, () => stopAgentHarnessBackgroundRun(runId, { ownerEmail: owner }));
5027
+ }
5015
5028
  if (!result.ok) {
5016
- setResponseStatus(event, result.error === "Task not found" ? 404 : 400);
5029
+ setResponseStatus(event, result.error === "Task not found" ||
5030
+ result.error === "Harness run not found"
5031
+ ? 404
5032
+ : 400);
5017
5033
  return { ok: false, error: result.error };
5018
5034
  }
5019
5035
  return { ok: true };
@@ -5050,11 +5066,19 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
5050
5066
  const runId = decodeURIComponent(backgroundEventsMatch[1]);
5051
5067
  const { getAgentTeamBackgroundRun, listAgentTeamBackgroundTranscriptEvents, } = await import("./agent-teams.js");
5052
5068
  const run = await runWithRequestContext({ userEmail: owner }, () => getAgentTeamBackgroundRun(runId));
5053
- if (!run) {
5069
+ if (run) {
5070
+ const events = await runWithRequestContext({ userEmail: owner }, () => listAgentTeamBackgroundTranscriptEvents(runId));
5071
+ return { status: "ok", runId, events };
5072
+ }
5073
+ const { getAgentHarnessBackgroundRun, listAgentHarnessBackgroundTranscriptEvents, } = await import("../agent/harness/background.js");
5074
+ const harnessRun = await runWithRequestContext({ userEmail: owner }, () => getAgentHarnessBackgroundRun(runId, { ownerEmail: owner }));
5075
+ if (!harnessRun) {
5054
5076
  setResponseStatus(event, 404);
5055
5077
  return { status: "unavailable", runId, events: [] };
5056
5078
  }
5057
- const events = await runWithRequestContext({ userEmail: owner }, () => listAgentTeamBackgroundTranscriptEvents(runId));
5079
+ const events = await runWithRequestContext({ userEmail: owner }, () => listAgentHarnessBackgroundTranscriptEvents(runId, {
5080
+ ownerEmail: owner,
5081
+ }));
5058
5082
  return { status: "ok", runId, events };
5059
5083
  }
5060
5084
  // Route: GET /runs/:id/events?after=N