@accomplish_ai/agent-core 0.3.1 → 0.3.3

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 (134) hide show
  1. package/dist/common/constants/model-display.d.ts.map +1 -1
  2. package/dist/common/constants/model-display.js +2 -0
  3. package/dist/common/constants/model-display.js.map +1 -1
  4. package/dist/common/index.d.ts +3 -3
  5. package/dist/common/index.d.ts.map +1 -1
  6. package/dist/common/index.js.map +1 -1
  7. package/dist/common/types/auth.d.ts +13 -1
  8. package/dist/common/types/auth.d.ts.map +1 -1
  9. package/dist/common/types/connector.d.ts +32 -0
  10. package/dist/common/types/connector.d.ts.map +1 -0
  11. package/dist/common/types/connector.js +2 -0
  12. package/dist/common/types/connector.js.map +1 -0
  13. package/dist/common/types/index.d.ts +4 -3
  14. package/dist/common/types/index.d.ts.map +1 -1
  15. package/dist/common/types/index.js.map +1 -1
  16. package/dist/common/types/provider.d.ts +21 -2
  17. package/dist/common/types/provider.d.ts.map +1 -1
  18. package/dist/common/types/provider.js +67 -180
  19. package/dist/common/types/provider.js.map +1 -1
  20. package/dist/common/types/providerSettings.d.ts +15 -3
  21. package/dist/common/types/providerSettings.d.ts.map +1 -1
  22. package/dist/common/types/providerSettings.js +12 -2
  23. package/dist/common/types/providerSettings.js.map +1 -1
  24. package/dist/common.d.ts +5 -3
  25. package/dist/common.d.ts.map +1 -1
  26. package/dist/common.js +2 -0
  27. package/dist/common.js.map +1 -1
  28. package/dist/connectors/mcp-oauth.d.ts +53 -0
  29. package/dist/connectors/mcp-oauth.d.ts.map +1 -0
  30. package/dist/connectors/mcp-oauth.js +176 -0
  31. package/dist/connectors/mcp-oauth.js.map +1 -0
  32. package/dist/factories/storage.d.ts.map +1 -1
  33. package/dist/factories/storage.js +27 -1
  34. package/dist/factories/storage.js.map +1 -1
  35. package/dist/index.d.ts +10 -5
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +5 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/opencode/completion/completion-enforcer.d.ts.map +1 -1
  40. package/dist/opencode/completion/completion-enforcer.js +3 -3
  41. package/dist/opencode/completion/completion-enforcer.js.map +1 -1
  42. package/dist/opencode/completion/completion-state.js +1 -1
  43. package/dist/opencode/completion/index.d.ts +1 -1
  44. package/dist/opencode/completion/index.d.ts.map +1 -1
  45. package/dist/opencode/completion/index.js +1 -1
  46. package/dist/opencode/completion/index.js.map +1 -1
  47. package/dist/opencode/completion/prompts.d.ts +1 -2
  48. package/dist/opencode/completion/prompts.d.ts.map +1 -1
  49. package/dist/opencode/completion/prompts.js +10 -8
  50. package/dist/opencode/completion/prompts.js.map +1 -1
  51. package/dist/opencode/config-builder.d.ts.map +1 -1
  52. package/dist/opencode/config-builder.js +61 -9
  53. package/dist/opencode/config-builder.js.map +1 -1
  54. package/dist/opencode/config-generator.d.ts +8 -0
  55. package/dist/opencode/config-generator.d.ts.map +1 -1
  56. package/dist/opencode/config-generator.js +36 -2
  57. package/dist/opencode/config-generator.js.map +1 -1
  58. package/dist/opencode/environment.d.ts +5 -1
  59. package/dist/opencode/environment.d.ts.map +1 -1
  60. package/dist/opencode/environment.js +14 -0
  61. package/dist/opencode/environment.js.map +1 -1
  62. package/dist/opencode/index.d.ts +1 -1
  63. package/dist/opencode/index.d.ts.map +1 -1
  64. package/dist/opencode/index.js +1 -1
  65. package/dist/opencode/index.js.map +1 -1
  66. package/dist/opencode/task-manager.d.ts.map +1 -1
  67. package/dist/opencode/task-manager.js +7 -0
  68. package/dist/opencode/task-manager.js.map +1 -1
  69. package/dist/providers/fetch-models.d.ts +27 -0
  70. package/dist/providers/fetch-models.d.ts.map +1 -0
  71. package/dist/providers/fetch-models.js +128 -0
  72. package/dist/providers/fetch-models.js.map +1 -0
  73. package/dist/providers/index.d.ts +1 -0
  74. package/dist/providers/index.d.ts.map +1 -1
  75. package/dist/providers/index.js +1 -0
  76. package/dist/providers/index.js.map +1 -1
  77. package/dist/providers/ollama.d.ts.map +1 -1
  78. package/dist/providers/ollama.js +8 -8
  79. package/dist/providers/ollama.js.map +1 -1
  80. package/dist/providers/tool-support-testing.d.ts +2 -1
  81. package/dist/providers/tool-support-testing.d.ts.map +1 -1
  82. package/dist/providers/tool-support-testing.js +29 -6
  83. package/dist/providers/tool-support-testing.js.map +1 -1
  84. package/dist/providers/validation.d.ts.map +1 -1
  85. package/dist/providers/validation.js +1 -0
  86. package/dist/providers/validation.js.map +1 -1
  87. package/dist/providers/vertex.d.ts +38 -0
  88. package/dist/providers/vertex.d.ts.map +1 -0
  89. package/dist/providers/vertex.js +209 -0
  90. package/dist/providers/vertex.js.map +1 -0
  91. package/dist/storage/index.d.ts +2 -1
  92. package/dist/storage/index.d.ts.map +1 -1
  93. package/dist/storage/index.js +2 -1
  94. package/dist/storage/index.js.map +1 -1
  95. package/dist/storage/migrations/index.d.ts +1 -1
  96. package/dist/storage/migrations/index.d.ts.map +1 -1
  97. package/dist/storage/migrations/index.js +5 -1
  98. package/dist/storage/migrations/index.js.map +1 -1
  99. package/dist/storage/migrations/v007-connectors.d.ts +3 -0
  100. package/dist/storage/migrations/v007-connectors.d.ts.map +1 -0
  101. package/dist/storage/migrations/v007-connectors.js +23 -0
  102. package/dist/storage/migrations/v007-connectors.js.map +1 -0
  103. package/dist/storage/migrations/v008-theme.d.ts +3 -0
  104. package/dist/storage/migrations/v008-theme.d.ts.map +1 -0
  105. package/dist/storage/migrations/v008-theme.js +7 -0
  106. package/dist/storage/migrations/v008-theme.js.map +1 -0
  107. package/dist/storage/repositories/appSettings.d.ts +4 -0
  108. package/dist/storage/repositories/appSettings.d.ts.map +1 -1
  109. package/dist/storage/repositories/appSettings.js +19 -1
  110. package/dist/storage/repositories/appSettings.js.map +1 -1
  111. package/dist/storage/repositories/connectors.d.ts +10 -0
  112. package/dist/storage/repositories/connectors.d.ts.map +1 -0
  113. package/dist/storage/repositories/connectors.js +78 -0
  114. package/dist/storage/repositories/connectors.js.map +1 -0
  115. package/dist/storage/repositories/index.d.ts +2 -1
  116. package/dist/storage/repositories/index.d.ts.map +1 -1
  117. package/dist/storage/repositories/index.js +2 -1
  118. package/dist/storage/repositories/index.js.map +1 -1
  119. package/dist/types/index.d.ts +1 -1
  120. package/dist/types/index.d.ts.map +1 -1
  121. package/dist/types/storage.d.ts +35 -3
  122. package/dist/types/storage.d.ts.map +1 -1
  123. package/dist/utils/sanitize.d.ts +1 -0
  124. package/dist/utils/sanitize.d.ts.map +1 -1
  125. package/dist/utils/sanitize.js +3 -3
  126. package/dist/utils/sanitize.js.map +1 -1
  127. package/mcp-tools/ask-user-question/dist/index.mjs +7 -14
  128. package/mcp-tools/complete-task/dist/index.mjs +7 -14
  129. package/mcp-tools/dev-browser/dist/start-relay.mjs +39 -39
  130. package/mcp-tools/dev-browser/dist/start-server.mjs +34 -138
  131. package/mcp-tools/dev-browser-mcp/dist/index.mjs +208 -50
  132. package/mcp-tools/file-permission/dist/index.mjs +7 -14
  133. package/mcp-tools/start-task/dist/index.mjs +7 -14
  134. package/package.json +1 -1
@@ -10497,7 +10497,6 @@ ZodNaN.create = (params) => {
10497
10497
  ...processCreateParams(params)
10498
10498
  });
10499
10499
  };
10500
- var BRAND = Symbol("zod_brand");
10501
10500
  var ZodBranded = class extends ZodType {
10502
10501
  _parse(input) {
10503
10502
  const { ctx } = this._processInputParams(input);
@@ -10722,7 +10721,6 @@ function $constructor(name2, initializer3, params) {
10722
10721
  Object.defineProperty(_, "name", { value: name2 });
10723
10722
  return _;
10724
10723
  }
10725
- var $brand = Symbol("zod_brand");
10726
10724
  var $ZodAsyncError = class extends Error {
10727
10725
  constructor() {
10728
10726
  super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);
@@ -10869,7 +10867,7 @@ function floatSafeRemainder2(val, step2) {
10869
10867
  const stepInt = Number.parseInt(step2.toFixed(decCount).replace(".", ""));
10870
10868
  return valInt % stepInt / 10 ** decCount;
10871
10869
  }
10872
- var EVALUATING = Symbol("evaluating");
10870
+ var EVALUATING = /* @__PURE__ */ Symbol("evaluating");
10873
10871
  function defineLazy(object3, key, getter) {
10874
10872
  let value = void 0;
10875
10873
  Object.defineProperty(object3, key, {
@@ -14396,8 +14394,6 @@ function en_default2() {
14396
14394
 
14397
14395
  // ../node_modules/zod/v4/core/registries.js
14398
14396
  var _a;
14399
- var $output = Symbol("ZodOutput");
14400
- var $input = Symbol("ZodInput");
14401
14397
  var $ZodRegistry = class {
14402
14398
  constructor() {
14403
14399
  this._map = /* @__PURE__ */ new WeakMap();
@@ -15199,7 +15195,7 @@ function _stringbool(Classes, _params) {
15199
15195
  type: "pipe",
15200
15196
  in: stringSchema,
15201
15197
  out: booleanSchema,
15202
- transform: (input, payload) => {
15198
+ transform: ((input, payload) => {
15203
15199
  let data = input;
15204
15200
  if (params.case !== "sensitive")
15205
15201
  data = data.toLowerCase();
@@ -15218,14 +15214,14 @@ function _stringbool(Classes, _params) {
15218
15214
  });
15219
15215
  return {};
15220
15216
  }
15221
- },
15222
- reverseTransform: (input, _payload) => {
15217
+ }),
15218
+ reverseTransform: ((input, _payload) => {
15223
15219
  if (input === true) {
15224
15220
  return truthyArray[0] || "true";
15225
15221
  } else {
15226
15222
  return falsyArray[0] || "false";
15227
15223
  }
15228
- },
15224
+ }),
15229
15225
  error: params.error
15230
15226
  });
15231
15227
  return codec2;
@@ -16463,10 +16459,10 @@ var ZodType2 = /* @__PURE__ */ $constructor("ZodType", (inst, def) => {
16463
16459
  inst.with = inst.check;
16464
16460
  inst.clone = (def2, params) => clone(inst, def2, params);
16465
16461
  inst.brand = () => inst;
16466
- inst.register = (reg, meta3) => {
16462
+ inst.register = ((reg, meta3) => {
16467
16463
  reg.add(inst, meta3);
16468
16464
  return inst;
16469
- };
16465
+ });
16470
16466
  inst.parse = (data, params) => parse2(inst, data, params, { callee: inst.parse });
16471
16467
  inst.safeParse = (data, params) => safeParse3(inst, data, params);
16472
16468
  inst.parseAsync = async (data, params) => parseAsync2(inst, data, params, { callee: inst.parseAsync });
@@ -19042,9 +19038,6 @@ function isTerminal(status) {
19042
19038
  return status === "completed" || status === "failed" || status === "cancelled";
19043
19039
  }
19044
19040
 
19045
- // ../node_modules/zod-to-json-schema/dist/esm/Options.js
19046
- var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use");
19047
-
19048
19041
  // ../node_modules/zod-to-json-schema/dist/esm/parsers/string.js
19049
19042
  var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");
19050
19043
 
@@ -21020,14 +21013,23 @@ async function connectBuiltin() {
21020
21013
  }
21021
21014
  const info = await res.json();
21022
21015
  cachedServerMode = info.mode || "normal";
21023
- return chromium.connectOverCDP(info.wsEndpoint);
21016
+ const b = await chromium.connectOverCDP(info.wsEndpoint);
21017
+ try {
21018
+ const cdpSession = await b.newBrowserCDPSession();
21019
+ await cdpSession.send("Browser.setDownloadBehavior", { behavior: "default" });
21020
+ await cdpSession.detach();
21021
+ } catch (err) {
21022
+ console.error("[dev-browser-mcp] Failed to reset download behavior:", err);
21023
+ }
21024
+ return b;
21024
21025
  }
21026
+ var DEFAULT_VIEWPORT = { width: 1280, height: 720 };
21025
21027
  async function getPageBuiltin(pageName) {
21026
21028
  const fullName = getFullPageName(pageName);
21027
21029
  const res = await fetchWithRetry(`${config2.devBrowserUrl}/pages`, {
21028
21030
  method: "POST",
21029
21031
  headers: { "Content-Type": "application/json" },
21030
- body: JSON.stringify({ name: fullName })
21032
+ body: JSON.stringify({ name: fullName, viewport: DEFAULT_VIEWPORT })
21031
21033
  });
21032
21034
  if (!res.ok) {
21033
21035
  throw new Error(`Failed to get page: ${await res.text()}`);
@@ -21184,6 +21186,34 @@ function toAIFriendlyError(error2, selector) {
21184
21186
  `${message}. Try taking a new browser_snapshot() to see the current page state before retrying.`
21185
21187
  );
21186
21188
  }
21189
+ var CANVAS_APPS = [
21190
+ { pattern: /docs\.google\.com/, name: "Google Docs" },
21191
+ { pattern: /sheets\.google\.com/, name: "Google Sheets" },
21192
+ { pattern: /slides\.google\.com/, name: "Google Slides" },
21193
+ { pattern: /figma\.com/, name: "Figma" },
21194
+ { pattern: /canva\.com/, name: "Canva" },
21195
+ { pattern: /miro\.com/, name: "Miro" }
21196
+ ];
21197
+ function isCanvasApp(url2) {
21198
+ const match = CANVAS_APPS.find((app) => app.pattern.test(url2));
21199
+ return match ? match.name : null;
21200
+ }
21201
+ async function getElementCoordinates(element) {
21202
+ try {
21203
+ const box = await element.boundingBox();
21204
+ if (!box) return null;
21205
+ return {
21206
+ x: Math.round(box.x),
21207
+ y: Math.round(box.y),
21208
+ width: Math.round(box.width),
21209
+ height: Math.round(box.height),
21210
+ centerX: Math.round(box.x + box.width / 2),
21211
+ centerY: Math.round(box.y + box.height / 2)
21212
+ };
21213
+ } catch {
21214
+ return null;
21215
+ }
21216
+ }
21187
21217
  var activePageOverride = null;
21188
21218
  var glowingPage = null;
21189
21219
  var pagesWithGlowListeners = /* @__PURE__ */ new WeakSet();
@@ -22135,7 +22165,56 @@ var SNAPSHOT_SCRIPT = `
22135
22165
  const lines = [];
22136
22166
  let nodesToRender = ariaSnapshot.root.role === "fragment" ? ariaSnapshot.root.children : [ariaSnapshot.root];
22137
22167
 
22138
- const scoredElements = collectScoredElements(ariaSnapshot.root, snapshotOptions);
22168
+ const USELESS_ROLES = ['generic', 'none', 'presentation'];
22169
+ const pruneTree = (node) => {
22170
+ if (typeof node === 'string') return node;
22171
+ if (node.children && node.children.length > 0) {
22172
+ node.children = node.children.map(child => pruneTree(child)).filter(child => child !== null);
22173
+ }
22174
+ const isUselessRole = USELESS_ROLES.includes(node.role);
22175
+ const hasNoLabel = !node.name;
22176
+ const childCount = node.children ? node.children.length : 0;
22177
+ if (isUselessRole && hasNoLabel && childCount === 1) return node.children[0];
22178
+ if (isUselessRole && hasNoLabel && childCount === 0) return null;
22179
+ return node;
22180
+ };
22181
+ if (!snapshotOptions.rawTree) {
22182
+ nodesToRender = nodesToRender.map(n => pruneTree(n)).filter(n => n !== null);
22183
+ }
22184
+
22185
+ if (snapshotOptions.interactiveOnly) {
22186
+ const collectTextFromDescendants = (node, maxDepth) => {
22187
+ if (maxDepth === undefined) maxDepth = 10;
22188
+ if (maxDepth <= 0) return '';
22189
+ if (typeof node === 'string') return node.trim();
22190
+ const texts = [];
22191
+ if (node.name && node.name.trim()) {
22192
+ texts.push(node.name.trim());
22193
+ } else if (node.children) {
22194
+ for (let i = 0; i < node.children.length; i++) {
22195
+ const childText = collectTextFromDescendants(node.children[i], maxDepth - 1);
22196
+ if (childText) texts.push(childText);
22197
+ }
22198
+ }
22199
+ return texts.join(' ').replace(/\\s+/g, ' ').trim().slice(0, 100);
22200
+ };
22201
+ const promoteTextToInteractive = (node) => {
22202
+ if (typeof node === 'string') return;
22203
+ if (INTERACTIVE_ROLES.includes(node.role) && !node.name) {
22204
+ const promotedText = collectTextFromDescendants(node);
22205
+ if (promotedText) node.name = promotedText;
22206
+ }
22207
+ if (node.children) {
22208
+ for (let i = 0; i < node.children.length; i++) promoteTextToInteractive(node.children[i]);
22209
+ }
22210
+ };
22211
+ nodesToRender.forEach(n => promoteTextToInteractive(n));
22212
+ }
22213
+
22214
+ const prunedRoot = ariaSnapshot.root.role === "fragment"
22215
+ ? { ...ariaSnapshot.root, children: nodesToRender }
22216
+ : (nodesToRender[0] || ariaSnapshot.root);
22217
+ const scoredElements = collectScoredElements(prunedRoot, snapshotOptions);
22139
22218
 
22140
22219
  const truncateResult = truncateWithBudget(scoredElements, maxElements, maxTokens);
22141
22220
 
@@ -22180,6 +22259,10 @@ var SNAPSHOT_SCRIPT = `
22180
22259
  key += " [ref=" + ariaNode.ref + "]";
22181
22260
  if (renderCursorPointer && hasPointerCursor(ariaNode)) key += " [cursor=pointer]";
22182
22261
  }
22262
+ if (snapshotOptions.includeBoundingBoxes !== false && ariaNode.box?.rect) {
22263
+ const r = ariaNode.box.rect;
22264
+ key += " [" + Math.round(r.x) + ", " + Math.round(r.y) + ", " + Math.round(r.width) + ", " + Math.round(r.height) + "]";
22265
+ }
22183
22266
  return key;
22184
22267
  };
22185
22268
 
@@ -23140,18 +23223,20 @@ The page has loaded. Use browser_snapshot() to see the page elements and find in
23140
23223
  maxTokens: validatedMaxTokens
23141
23224
  };
23142
23225
  const rawSnapshot = await getAISnapshot(page2, snapshotOptions);
23143
- const viewport = page2.viewportSize();
23226
+ let viewport = page2.viewportSize();
23227
+ if (!viewport || viewport.width === 0 && viewport.height === 0) {
23228
+ try {
23229
+ const windowSize = await page2.evaluate(() => ({
23230
+ width: window.innerWidth,
23231
+ height: window.innerHeight
23232
+ }));
23233
+ viewport = windowSize;
23234
+ } catch {
23235
+ }
23236
+ }
23144
23237
  const url2 = page2.url();
23145
23238
  const title = await page2.title();
23146
- const canvasApps = [
23147
- { pattern: /docs\.google\.com/, name: "Google Docs" },
23148
- { pattern: /sheets\.google\.com/, name: "Google Sheets" },
23149
- { pattern: /slides\.google\.com/, name: "Google Slides" },
23150
- { pattern: /figma\.com/, name: "Figma" },
23151
- { pattern: /canva\.com/, name: "Canva" },
23152
- { pattern: /miro\.com/, name: "Miro" }
23153
- ];
23154
- const detectedApp = canvasApps.find((app) => app.pattern.test(url2));
23239
+ const detectedCanvasApp = isCanvasApp(url2);
23155
23240
  const manager = getSnapshotManager();
23156
23241
  const result = manager.processSnapshot(rawSnapshot, url2, title, {
23157
23242
  fullSnapshot: full_snapshot,
@@ -23180,15 +23265,11 @@ The page has loaded. Use browser_snapshot() to see the page elements and find in
23180
23265
  output += `Mode: Interactive elements only (buttons, links, inputs)
23181
23266
  `;
23182
23267
  }
23183
- if (detectedApp) {
23268
+ if (detectedCanvasApp) {
23184
23269
  output += `
23185
- \u26A0\uFE0F CANVAS APP DETECTED: ${detectedApp.name}
23186
- `;
23187
- output += `This app uses canvas rendering. Element refs may not work for the main content area.
23188
- `;
23189
- output += `Use: browser_click(position="center-lower") then browser_keyboard(action="type", text="...")
23270
+ \u26A0\uFE0F CANVAS APP DETECTED: ${detectedCanvasApp}
23190
23271
  `;
23191
- output += `(center-lower avoids UI overlays like Google Docs AI suggestions)
23272
+ output += `This app uses canvas rendering. Ref-based clicks auto-fallback to coordinate clicks.
23192
23273
  `;
23193
23274
  }
23194
23275
  if (result.type === "diff") {
@@ -23242,9 +23323,32 @@ ${result.content}`;
23242
23323
  isError: true
23243
23324
  };
23244
23325
  }
23245
- await element.click(clickOptions);
23246
- await waitForPageLoad(page2);
23247
- return { content: [{ type: "text", text: `Clicked element [ref=${ref}]${clickDesc}` }] };
23326
+ const canvasApp = isCanvasApp(page2.url());
23327
+ if (canvasApp) {
23328
+ const coords = await getElementCoordinates(element);
23329
+ if (!coords) {
23330
+ return {
23331
+ content: [{ type: "text", text: `Element [ref=${ref}] has no bounding box on ${canvasApp} canvas app. Try browser_click with explicit x/y coordinates or position="center".` }],
23332
+ isError: true
23333
+ };
23334
+ }
23335
+ await page2.mouse.click(coords.centerX, coords.centerY, clickOptions);
23336
+ await waitForPageLoad(page2);
23337
+ return { content: [{ type: "text", text: `Clicked element [ref=${ref}] at (${coords.centerX}, ${coords.centerY}) [box: ${coords.x}, ${coords.y}, ${coords.width}, ${coords.height}]${clickDesc} (canvas app: ${canvasApp})` }] };
23338
+ }
23339
+ try {
23340
+ await element.click(clickOptions);
23341
+ await waitForPageLoad(page2);
23342
+ return { content: [{ type: "text", text: `Clicked element [ref=${ref}]${clickDesc}` }] };
23343
+ } catch (clickErr) {
23344
+ const coords = await getElementCoordinates(element);
23345
+ if (coords) {
23346
+ await page2.mouse.click(coords.centerX, coords.centerY, clickOptions);
23347
+ await waitForPageLoad(page2);
23348
+ return { content: [{ type: "text", text: `Clicked element [ref=${ref}] [box: ${coords.x}, ${coords.y}, ${coords.width}, ${coords.height}]${clickDesc} (coordinate fallback \u2014 DOM click failed)` }] };
23349
+ }
23350
+ throw clickErr;
23351
+ }
23248
23352
  } else if (selector) {
23249
23353
  await page2.click(selector, clickOptions);
23250
23354
  await waitForPageLoad(page2);
@@ -23291,17 +23395,52 @@ ${result.content}`;
23291
23395
  isError: true
23292
23396
  };
23293
23397
  }
23294
- await element.click();
23295
- await element.fill(text);
23296
- if (press_enter) {
23297
- await element.press("Enter");
23298
- await waitForPageLoad(page2);
23299
- }
23300
23398
  const target = ref ? `[ref=${ref}]` : `"${selector}"`;
23301
23399
  const enterNote = press_enter ? " and pressed Enter" : "";
23302
- return {
23303
- content: [{ type: "text", text: `Typed "${text}" into ${target}${enterNote}` }]
23304
- };
23400
+ const canvasApp = isCanvasApp(page2.url());
23401
+ if (canvasApp) {
23402
+ const coords = await getElementCoordinates(element);
23403
+ if (!coords) {
23404
+ return {
23405
+ content: [{ type: "text", text: `Element ${target} has no bounding box on ${canvasApp} canvas app. Try browser_click(position="center-lower") then browser_keyboard(action="type", text="...").` }],
23406
+ isError: true
23407
+ };
23408
+ }
23409
+ await page2.mouse.click(coords.centerX, coords.centerY);
23410
+ await page2.keyboard.type(text);
23411
+ if (press_enter) {
23412
+ await page2.keyboard.press("Enter");
23413
+ await waitForPageLoad(page2);
23414
+ }
23415
+ return {
23416
+ content: [{ type: "text", text: `Typed "${text}" into ${target} [box: ${coords.x}, ${coords.y}, ${coords.width}, ${coords.height}]${enterNote} (canvas app: ${canvasApp})` }]
23417
+ };
23418
+ }
23419
+ try {
23420
+ await element.click();
23421
+ await element.fill(text);
23422
+ if (press_enter) {
23423
+ await element.press("Enter");
23424
+ await waitForPageLoad(page2);
23425
+ }
23426
+ return {
23427
+ content: [{ type: "text", text: `Typed "${text}" into ${target}${enterNote}` }]
23428
+ };
23429
+ } catch (fillErr) {
23430
+ const coords = await getElementCoordinates(element);
23431
+ if (coords) {
23432
+ await page2.mouse.click(coords.centerX, coords.centerY);
23433
+ await page2.keyboard.type(text);
23434
+ if (press_enter) {
23435
+ await page2.keyboard.press("Enter");
23436
+ await waitForPageLoad(page2);
23437
+ }
23438
+ return {
23439
+ content: [{ type: "text", text: `Typed "${text}" into ${target} [box: ${coords.x}, ${coords.y}, ${coords.width}, ${coords.height}]${enterNote} (coordinate fallback \u2014 DOM fill failed)` }]
23440
+ };
23441
+ }
23442
+ throw fillErr;
23443
+ }
23305
23444
  } catch (err) {
23306
23445
  const targetDesc = ref ? `[ref=${ref}]` : selector || "element";
23307
23446
  const friendlyError = toAIFriendlyError(err, targetDesc);
@@ -23758,10 +23897,29 @@ ${snapshotResult}` });
23758
23897
  isError: true
23759
23898
  };
23760
23899
  }
23761
- await element.hover();
23762
- return {
23763
- content: [{ type: "text", text: `Hovered over [ref=${ref}]` }]
23764
- };
23900
+ const hoverCanvasApp = isCanvasApp(page2.url());
23901
+ if (hoverCanvasApp) {
23902
+ const coords = await getElementCoordinates(element);
23903
+ if (coords) {
23904
+ await page2.mouse.move(coords.centerX, coords.centerY);
23905
+ return { content: [{ type: "text", text: `Hovered over [ref=${ref}] at (${coords.centerX}, ${coords.centerY}) [box: ${coords.x}, ${coords.y}, ${coords.width}, ${coords.height}] (coordinate hover \u2014 ${hoverCanvasApp} canvas app)` }] };
23906
+ }
23907
+ return {
23908
+ content: [{ type: "text", text: `Element [ref=${ref}] has no bounding box \u2014 cannot coordinate-hover on ${hoverCanvasApp} canvas app. Try browser_hover with explicit x/y coordinates.` }],
23909
+ isError: true
23910
+ };
23911
+ }
23912
+ try {
23913
+ await element.hover();
23914
+ return { content: [{ type: "text", text: `Hovered over [ref=${ref}]` }] };
23915
+ } catch (hoverErr) {
23916
+ const coords = await getElementCoordinates(element);
23917
+ if (coords) {
23918
+ await page2.mouse.move(coords.centerX, coords.centerY);
23919
+ return { content: [{ type: "text", text: `Hovered over [ref=${ref}] at (${coords.centerX}, ${coords.centerY}) [box: ${coords.x}, ${coords.y}, ${coords.width}, ${coords.height}] (coordinate fallback \u2014 DOM hover failed)` }] };
23920
+ }
23921
+ throw hoverErr;
23922
+ }
23765
23923
  }
23766
23924
  if (selector) {
23767
23925
  await page2.hover(selector);
@@ -10497,7 +10497,6 @@ ZodNaN.create = (params) => {
10497
10497
  ...processCreateParams(params)
10498
10498
  });
10499
10499
  };
10500
- var BRAND = Symbol("zod_brand");
10501
10500
  var ZodBranded = class extends ZodType {
10502
10501
  _parse(input) {
10503
10502
  const { ctx } = this._processInputParams(input);
@@ -10722,7 +10721,6 @@ function $constructor(name, initializer3, params) {
10722
10721
  Object.defineProperty(_, "name", { value: name });
10723
10722
  return _;
10724
10723
  }
10725
- var $brand = Symbol("zod_brand");
10726
10724
  var $ZodAsyncError = class extends Error {
10727
10725
  constructor() {
10728
10726
  super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);
@@ -10869,7 +10867,7 @@ function floatSafeRemainder2(val, step) {
10869
10867
  const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", ""));
10870
10868
  return valInt % stepInt / 10 ** decCount;
10871
10869
  }
10872
- var EVALUATING = Symbol("evaluating");
10870
+ var EVALUATING = /* @__PURE__ */ Symbol("evaluating");
10873
10871
  function defineLazy(object3, key, getter) {
10874
10872
  let value = void 0;
10875
10873
  Object.defineProperty(object3, key, {
@@ -14396,8 +14394,6 @@ function en_default2() {
14396
14394
 
14397
14395
  // ../node_modules/zod/v4/core/registries.js
14398
14396
  var _a;
14399
- var $output = Symbol("ZodOutput");
14400
- var $input = Symbol("ZodInput");
14401
14397
  var $ZodRegistry = class {
14402
14398
  constructor() {
14403
14399
  this._map = /* @__PURE__ */ new WeakMap();
@@ -15199,7 +15195,7 @@ function _stringbool(Classes, _params) {
15199
15195
  type: "pipe",
15200
15196
  in: stringSchema,
15201
15197
  out: booleanSchema,
15202
- transform: (input, payload) => {
15198
+ transform: ((input, payload) => {
15203
15199
  let data = input;
15204
15200
  if (params.case !== "sensitive")
15205
15201
  data = data.toLowerCase();
@@ -15218,14 +15214,14 @@ function _stringbool(Classes, _params) {
15218
15214
  });
15219
15215
  return {};
15220
15216
  }
15221
- },
15222
- reverseTransform: (input, _payload) => {
15217
+ }),
15218
+ reverseTransform: ((input, _payload) => {
15223
15219
  if (input === true) {
15224
15220
  return truthyArray[0] || "true";
15225
15221
  } else {
15226
15222
  return falsyArray[0] || "false";
15227
15223
  }
15228
- },
15224
+ }),
15229
15225
  error: params.error
15230
15226
  });
15231
15227
  return codec2;
@@ -16463,10 +16459,10 @@ var ZodType2 = /* @__PURE__ */ $constructor("ZodType", (inst, def) => {
16463
16459
  inst.with = inst.check;
16464
16460
  inst.clone = (def2, params) => clone(inst, def2, params);
16465
16461
  inst.brand = () => inst;
16466
- inst.register = (reg, meta3) => {
16462
+ inst.register = ((reg, meta3) => {
16467
16463
  reg.add(inst, meta3);
16468
16464
  return inst;
16469
- };
16465
+ });
16470
16466
  inst.parse = (data, params) => parse2(inst, data, params, { callee: inst.parse });
16471
16467
  inst.safeParse = (data, params) => safeParse3(inst, data, params);
16472
16468
  inst.parseAsync = async (data, params) => parseAsync2(inst, data, params, { callee: inst.parseAsync });
@@ -19042,9 +19038,6 @@ function isTerminal(status) {
19042
19038
  return status === "completed" || status === "failed" || status === "cancelled";
19043
19039
  }
19044
19040
 
19045
- // ../node_modules/zod-to-json-schema/dist/esm/Options.js
19046
- var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use");
19047
-
19048
19041
  // ../node_modules/zod-to-json-schema/dist/esm/parsers/string.js
19049
19042
  var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");
19050
19043
 
@@ -10497,7 +10497,6 @@ ZodNaN.create = (params) => {
10497
10497
  ...processCreateParams(params)
10498
10498
  });
10499
10499
  };
10500
- var BRAND = Symbol("zod_brand");
10501
10500
  var ZodBranded = class extends ZodType {
10502
10501
  _parse(input) {
10503
10502
  const { ctx } = this._processInputParams(input);
@@ -10722,7 +10721,6 @@ function $constructor(name, initializer3, params) {
10722
10721
  Object.defineProperty(_, "name", { value: name });
10723
10722
  return _;
10724
10723
  }
10725
- var $brand = Symbol("zod_brand");
10726
10724
  var $ZodAsyncError = class extends Error {
10727
10725
  constructor() {
10728
10726
  super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);
@@ -10869,7 +10867,7 @@ function floatSafeRemainder2(val, step) {
10869
10867
  const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", ""));
10870
10868
  return valInt % stepInt / 10 ** decCount;
10871
10869
  }
10872
- var EVALUATING = Symbol("evaluating");
10870
+ var EVALUATING = /* @__PURE__ */ Symbol("evaluating");
10873
10871
  function defineLazy(object3, key, getter) {
10874
10872
  let value = void 0;
10875
10873
  Object.defineProperty(object3, key, {
@@ -14396,8 +14394,6 @@ function en_default2() {
14396
14394
 
14397
14395
  // ../node_modules/zod/v4/core/registries.js
14398
14396
  var _a;
14399
- var $output = Symbol("ZodOutput");
14400
- var $input = Symbol("ZodInput");
14401
14397
  var $ZodRegistry = class {
14402
14398
  constructor() {
14403
14399
  this._map = /* @__PURE__ */ new WeakMap();
@@ -15199,7 +15195,7 @@ function _stringbool(Classes, _params) {
15199
15195
  type: "pipe",
15200
15196
  in: stringSchema,
15201
15197
  out: booleanSchema,
15202
- transform: (input, payload) => {
15198
+ transform: ((input, payload) => {
15203
15199
  let data = input;
15204
15200
  if (params.case !== "sensitive")
15205
15201
  data = data.toLowerCase();
@@ -15218,14 +15214,14 @@ function _stringbool(Classes, _params) {
15218
15214
  });
15219
15215
  return {};
15220
15216
  }
15221
- },
15222
- reverseTransform: (input, _payload) => {
15217
+ }),
15218
+ reverseTransform: ((input, _payload) => {
15223
15219
  if (input === true) {
15224
15220
  return truthyArray[0] || "true";
15225
15221
  } else {
15226
15222
  return falsyArray[0] || "false";
15227
15223
  }
15228
- },
15224
+ }),
15229
15225
  error: params.error
15230
15226
  });
15231
15227
  return codec2;
@@ -16463,10 +16459,10 @@ var ZodType2 = /* @__PURE__ */ $constructor("ZodType", (inst, def) => {
16463
16459
  inst.with = inst.check;
16464
16460
  inst.clone = (def2, params) => clone(inst, def2, params);
16465
16461
  inst.brand = () => inst;
16466
- inst.register = (reg, meta3) => {
16462
+ inst.register = ((reg, meta3) => {
16467
16463
  reg.add(inst, meta3);
16468
16464
  return inst;
16469
- };
16465
+ });
16470
16466
  inst.parse = (data, params) => parse2(inst, data, params, { callee: inst.parse });
16471
16467
  inst.safeParse = (data, params) => safeParse3(inst, data, params);
16472
16468
  inst.parseAsync = async (data, params) => parseAsync2(inst, data, params, { callee: inst.parseAsync });
@@ -19042,9 +19038,6 @@ function isTerminal(status) {
19042
19038
  return status === "completed" || status === "failed" || status === "cancelled";
19043
19039
  }
19044
19040
 
19045
- // ../node_modules/zod-to-json-schema/dist/esm/Options.js
19046
- var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use");
19047
-
19048
19041
  // ../node_modules/zod-to-json-schema/dist/esm/parsers/string.js
19049
19042
  var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");
19050
19043
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@accomplish_ai/agent-core",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Core logic for Accomplish - OpenCode adapter, storage, providers, MCP tools, and skills",
5
5
  "type": "module",
6
6
  "license": "MIT",