opendevbrowser 0.0.27 → 0.0.28

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 (76) hide show
  1. package/README.md +1 -1
  2. package/dist/browser/canvas-manager.d.ts.map +1 -1
  3. package/dist/canvas/document-store.d.ts.map +1 -1
  4. package/dist/canvas/guidance.d.ts +22 -0
  5. package/dist/canvas/guidance.d.ts.map +1 -0
  6. package/dist/{chunk-MWBDO2L5.js → chunk-I5ZCOZZV.js} +224 -80
  7. package/dist/chunk-I5ZCOZZV.js.map +1 -0
  8. package/dist/{chunk-V5DJUSPV.js → chunk-T3VVHJTK.js} +1381 -318
  9. package/dist/chunk-T3VVHJTK.js.map +1 -0
  10. package/dist/cli/commands/inspiredesign.d.ts +2 -0
  11. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  12. package/dist/cli/commands/macro-resolve.d.ts +2 -0
  13. package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
  14. package/dist/cli/commands/product-video.d.ts +2 -0
  15. package/dist/cli/commands/product-video.d.ts.map +1 -1
  16. package/dist/cli/commands/research.d.ts +2 -0
  17. package/dist/cli/commands/research.d.ts.map +1 -1
  18. package/dist/cli/daemon-commands.d.ts.map +1 -1
  19. package/dist/cli/help.d.ts.map +1 -1
  20. package/dist/cli/index.js +125 -28
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/utils/workflow-message.d.ts +3 -0
  23. package/dist/cli/utils/workflow-message.d.ts.map +1 -1
  24. package/dist/daemon-fingerprint.json +1 -1
  25. package/dist/index.js +39 -15
  26. package/dist/index.js.map +1 -1
  27. package/dist/inspiredesign/contract.d.ts +52 -1
  28. package/dist/inspiredesign/contract.d.ts.map +1 -1
  29. package/dist/inspiredesign/handoff.d.ts +12 -0
  30. package/dist/inspiredesign/handoff.d.ts.map +1 -1
  31. package/dist/inspiredesign/reference-pattern-board.d.ts +1 -0
  32. package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
  33. package/dist/macros/execute-runtime.d.ts +2 -1
  34. package/dist/macros/execute-runtime.d.ts.map +1 -1
  35. package/dist/macros/execute.d.ts +4 -2
  36. package/dist/macros/execute.d.ts.map +1 -1
  37. package/dist/opendevbrowser.js +39 -15
  38. package/dist/opendevbrowser.js.map +1 -1
  39. package/dist/providers/browser-fallback.d.ts +7 -0
  40. package/dist/providers/browser-fallback.d.ts.map +1 -1
  41. package/dist/providers/community/index.d.ts.map +1 -1
  42. package/dist/providers/index.d.ts.map +1 -1
  43. package/dist/providers/renderer.d.ts.map +1 -1
  44. package/dist/providers/research-compiler.d.ts.map +1 -1
  45. package/dist/providers/runtime-bundle.d.ts +1 -1
  46. package/dist/providers/runtime-bundle.d.ts.map +1 -1
  47. package/dist/providers/runtime-factory.d.ts.map +1 -1
  48. package/dist/providers/shopping/index.d.ts.map +1 -1
  49. package/dist/providers/social/platform.d.ts.map +1 -1
  50. package/dist/providers/social/search-quality.d.ts.map +1 -1
  51. package/dist/providers/social/youtube.d.ts.map +1 -1
  52. package/dist/providers/workflow-handoff.d.ts +18 -1
  53. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  54. package/dist/providers/workflows.d.ts +3 -0
  55. package/dist/providers/workflows.d.ts.map +1 -1
  56. package/dist/{providers-TR3DUJZV.js → providers-QF2RFB4J.js} +2 -2
  57. package/dist/public-surface/generated-manifest.d.ts +6 -6
  58. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  59. package/dist/public-surface/source.d.ts +8 -8
  60. package/dist/public-surface/source.d.ts.map +1 -1
  61. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  62. package/dist/tools/macro_resolve.d.ts.map +1 -1
  63. package/dist/tools/product_video_run.d.ts.map +1 -1
  64. package/dist/tools/research_run.d.ts.map +1 -1
  65. package/dist/tools/shopping_run.d.ts.map +1 -1
  66. package/extension/manifest.json +1 -1
  67. package/package.json +1 -1
  68. package/skills/opendevbrowser-best-practices/SKILL.md +6 -6
  69. package/skills/opendevbrowser-design-agent/SKILL.md +5 -0
  70. package/skills/opendevbrowser-design-agent/artifacts/design-contract-playbook.md +6 -1
  71. package/skills/opendevbrowser-design-agent/assets/templates/design-contract.v1.json +15 -1
  72. package/skills/opendevbrowser-design-agent/assets/templates/inspiredesign-advanced-brief.v1.json +5 -2
  73. package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +2 -0
  74. package/dist/chunk-MWBDO2L5.js.map +0 -1
  75. package/dist/chunk-V5DJUSPV.js.map +0 -1
  76. /package/dist/{providers-TR3DUJZV.js.map → providers-QF2RFB4J.js.map} +0 -0
@@ -47,7 +47,7 @@ import {
47
47
  runResearchWorkflow,
48
48
  runShoppingWorkflow,
49
49
  toSnippet
50
- } from "./chunk-V5DJUSPV.js";
50
+ } from "./chunk-T3VVHJTK.js";
51
51
  import {
52
52
  ProviderRuntimeError
53
53
  } from "./chunk-FUSXMW3G.js";
@@ -3199,6 +3199,19 @@ var isExplicitShoppingExtensionRequest = (request) => {
3199
3199
  const preferredModes = request.runtimePolicy?.browser.preferredModes ?? request.preferredModes;
3200
3200
  return request.source === "shopping" && preferredModes?.length === 1 && preferredModes[0] === "extension";
3201
3201
  };
3202
+ var isExplicitSocialExtensionRequest = (request) => {
3203
+ const preferredModes = request.runtimePolicy?.browser.preferredModes ?? request.preferredModes;
3204
+ return request.source === "social" && request.runtimePolicy?.browser.forceTransport === true && preferredModes?.length === 1 && preferredModes[0] === "extension";
3205
+ };
3206
+ var shouldVerifyExtensionRequestUrl = (request) => isExplicitShoppingExtensionRequest(request) || isExplicitSocialExtensionRequest(request);
3207
+ var isRequiredExtensionSessionRequest = (request, runtimePolicy, preferredMode) => {
3208
+ if (preferredMode !== "extension") {
3209
+ return false;
3210
+ }
3211
+ const preferredModes = request.runtimePolicy?.browser.preferredModes ?? request.preferredModes;
3212
+ return runtimePolicy.browser.forceTransport === true || runtimePolicy.cookies.policy === "required" || preferredModes?.length === 1 && preferredModes[0] === "extension";
3213
+ };
3214
+ var requiresAuthenticatedExtensionSession = (runtimePolicy) => runtimePolicy.cookies.policy === "required";
3202
3215
  var shouldAttachExtensionStartUrl = (request) => request.source === "social" || request.source === "shopping";
3203
3216
  var SOCIAL_EXTENSION_MODE_ATTEMPTS = 3;
3204
3217
  var resolveSocialExtensionModeAttempts = (request, preferredMode) => preferredMode === "extension" && request.source === "social" ? SOCIAL_EXTENSION_MODE_ATTEMPTS : 1;
@@ -3301,6 +3314,29 @@ var fallbackFailure = (reasonCode, message, cookieDiagnostics, challengeOrchestr
3301
3314
  ...options.details ? options.details : {}
3302
3315
  }
3303
3316
  });
3317
+ var extensionSessionRequiredFailure = (message, cookieDiagnostics, runtimePolicy, details) => {
3318
+ const reasonMessage = `Logged-in extension session required: ${message}`;
3319
+ cookieDiagnostics.reasonCode = "auth_required";
3320
+ cookieDiagnostics.message = reasonMessage;
3321
+ return fallbackFailure("auth_required", reasonMessage, cookieDiagnostics, void 0, runtimePolicy, {
3322
+ mode: "extension",
3323
+ details: {
3324
+ ...details ?? {},
3325
+ extensionSessionRequired: true
3326
+ }
3327
+ });
3328
+ };
3329
+ var extensionTransportUnavailableFailure = (message, cookieDiagnostics, runtimePolicy, details) => {
3330
+ cookieDiagnostics.reasonCode = "env_limited";
3331
+ cookieDiagnostics.message = message;
3332
+ return fallbackFailure("env_limited", message, cookieDiagnostics, void 0, runtimePolicy, {
3333
+ mode: "extension",
3334
+ details: {
3335
+ ...details ?? {},
3336
+ extensionTransportRequired: true
3337
+ }
3338
+ });
3339
+ };
3304
3340
  var toJsonValue = (value) => {
3305
3341
  if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
3306
3342
  return value;
@@ -3364,7 +3400,7 @@ var buildFallbackChallengeOrchestration = (args2) => {
3364
3400
  mode: policy.mode,
3365
3401
  source: policy.source,
3366
3402
  ...policy.standDownReason ? { standDownReason: policy.standDownReason } : {},
3367
- helperEligibility: resolveFallbackHelperEligibility({
3403
+ helperEligibility: args2.helperEligibility ?? resolveFallbackHelperEligibility({
3368
3404
  mode: policy.mode,
3369
3405
  helperBridgeEnabled: args2.helperBridgeEnabled
3370
3406
  }),
@@ -3372,6 +3408,11 @@ var buildFallbackChallengeOrchestration = (args2) => {
3372
3408
  reason: args2.reason
3373
3409
  });
3374
3410
  };
3411
+ var NO_ACTIVE_CHALLENGE_HELPER_ELIGIBILITY = {
3412
+ allowed: false,
3413
+ reason: "No active auth or challenge blocker was detected after capture.",
3414
+ standDownReason: "helper_no_active_challenge"
3415
+ };
3375
3416
  var isPreserveEligibleBlocker = (blocker) => {
3376
3417
  return blocker?.type === "auth_required" || blocker?.type === "anti_bot_challenge";
3377
3418
  };
@@ -3771,16 +3812,20 @@ var createBrowserFallbackPort = (manager, cookieDefaults = {}, transportDefaults
3771
3812
  ensureNotAborted("mode_start");
3772
3813
  if (preferredMode === "extension") {
3773
3814
  if (!transportDefaults.extensionWsEndpoint) {
3774
- lastFailure = fallbackFailure("env_limited", "Extension fallback requires a relay endpoint.", cookieDiagnostics, void 0, runtimePolicyRecord);
3815
+ lastFailure = isRequiredExtensionSessionRequest(request, runtimePolicy, preferredMode) ? extensionTransportUnavailableFailure(
3816
+ "Extension fallback requires a relay endpoint.",
3817
+ cookieDiagnostics,
3818
+ runtimePolicyRecord
3819
+ ) : fallbackFailure("env_limited", "Extension fallback requires a relay endpoint.", cookieDiagnostics, void 0, runtimePolicyRecord);
3775
3820
  continue;
3776
3821
  }
3777
3822
  const attachOptions = shouldAttachExtensionStartUrl(request) ? { startUrl: requestUrl } : void 0;
3778
3823
  const attached = await manager.connectRelay(transportDefaults.extensionWsEndpoint, attachOptions);
3779
3824
  sessionId = attached.sessionId;
3780
- if (isExplicitShoppingExtensionRequest(request)) {
3825
+ if (shouldVerifyExtensionRequestUrl(request)) {
3781
3826
  attachedUrl = (await manager.status(sessionId)).url;
3782
3827
  navigatedDuringAttach = didExtensionAttachReachRequestUrl(requestUrl, attachedUrl);
3783
- if (isRestrictedExtensionAttachUrl(attachedUrl)) {
3828
+ if (request.source === "shopping" && isRestrictedExtensionAttachUrl(attachedUrl)) {
3784
3829
  const recovered = await reconnectExplicitShoppingExtensionSession({
3785
3830
  manager,
3786
3831
  sessionId,
@@ -3874,23 +3919,24 @@ var createBrowserFallbackPort = (manager, cookieDefaults = {}, transportDefaults
3874
3919
  "settle"
3875
3920
  )
3876
3921
  );
3877
- if (preferredMode === "extension" && isExplicitShoppingExtensionRequest(request)) {
3922
+ if (preferredMode === "extension" && shouldVerifyExtensionRequestUrl(request)) {
3878
3923
  const resolvedAttachStatus = await runWithinFallbackDeadline("status", async () => manager.status(activeSessionId));
3879
3924
  const observedUrl = normalizeExtensionAttachUrl(resolvedAttachStatus.url);
3880
3925
  if (!didExtensionAttachReachRequestUrl(requestUrl, resolvedAttachStatus.url)) {
3881
- lastFailure = fallbackFailure(
3882
- "env_limited",
3883
- "Extension fallback did not reach the requested shopping URL.",
3926
+ const details = {
3927
+ requestedUrl: requestUrl,
3928
+ ...observedUrl ? { observedUrl } : {}
3929
+ };
3930
+ lastFailure = requiresAuthenticatedExtensionSession(runtimePolicy) ? extensionSessionRequiredFailure(
3931
+ "Extension fallback did not reach the requested provider URL.",
3884
3932
  cookieDiagnostics,
3885
- void 0,
3886
3933
  runtimePolicyRecord,
3887
- {
3888
- mode: "extension",
3889
- details: {
3890
- requestedUrl: requestUrl,
3891
- ...observedUrl ? { observedUrl } : {}
3892
- }
3893
- }
3934
+ details
3935
+ ) : extensionTransportUnavailableFailure(
3936
+ "Extension fallback did not reach the requested provider URL.",
3937
+ cookieDiagnostics,
3938
+ runtimePolicyRecord,
3939
+ details
3894
3940
  );
3895
3941
  continue;
3896
3942
  }
@@ -4069,8 +4115,25 @@ var createBrowserFallbackPort = (manager, cookieDefaults = {}, transportDefaults
4069
4115
  runtimePolicy,
4070
4116
  helperBridgeEnabled,
4071
4117
  invoked: false,
4072
- reason: "Fallback capture cleared without an auth or challenge blocker, so challenge orchestration was not invoked."
4118
+ reason: "Fallback capture cleared without an auth or challenge blocker, so challenge orchestration was not invoked.",
4119
+ helperEligibility: NO_ACTIVE_CHALLENGE_HELPER_ELIGIBILITY
4073
4120
  });
4121
+ if (html.trim().length === 0) {
4122
+ lastFailure = fallbackFailure(
4123
+ request.reasonCode,
4124
+ `Browser fallback captured no HTML content at ${resolvedUrl}.`,
4125
+ cookieDiagnostics,
4126
+ challengeOrchestrationRecord,
4127
+ runtimePolicyRecord,
4128
+ {
4129
+ mode: toFallbackMode(status.mode),
4130
+ details: {
4131
+ captureDiagnostics
4132
+ }
4133
+ }
4134
+ );
4135
+ continue;
4136
+ }
4074
4137
  return {
4075
4138
  ok: true,
4076
4139
  reasonCode: request.reasonCode,
@@ -4107,7 +4170,7 @@ var createBrowserFallbackPort = (manager, cookieDefaults = {}, transportDefaults
4107
4170
  } : void 0;
4108
4171
  retryModeAttempt = preferredMode === "extension" && request.source === "social" && modeAttempt < maxModeAttempts;
4109
4172
  if (!retryModeAttempt) {
4110
- lastFailure = fallbackFailure(
4173
+ lastFailure = isRequiredExtensionSessionRequest(request, runtimePolicy, preferredMode) ? extensionTransportUnavailableFailure(message, cookieDiagnostics, runtimePolicyRecord, timeoutDetails) : fallbackFailure(
4111
4174
  "env_limited",
4112
4175
  message,
4113
4176
  cookieDiagnostics,
@@ -4212,7 +4275,7 @@ var createConfiguredProviderRuntime = (args2) => {
4212
4275
 
4213
4276
  // src/providers/runtime-bundle.ts
4214
4277
  var runtimeChallengeConfigFingerprints = /* @__PURE__ */ new WeakMap();
4215
- var fallbackPortChallengeConfigFingerprints = /* @__PURE__ */ new WeakMap();
4278
+ var fallbackPortFingerprints = /* @__PURE__ */ new WeakMap();
4216
4279
  var canReuseRuntime = (runtime, challengeFingerprint, hasInitOverride, hasExplicitChallengeConfig) => {
4217
4280
  if (!runtime || hasInitOverride) {
4218
4281
  return false;
@@ -4223,37 +4286,47 @@ var canReuseRuntime = (runtime, challengeFingerprint, hasInitOverride, hasExplic
4223
4286
  }
4224
4287
  return fingerprint === challengeFingerprint;
4225
4288
  };
4226
- var canReuseFallbackPort = (fallbackPort, challengeFingerprint) => {
4289
+ var canReuseFallbackPort = (fallbackPort, fingerprint) => {
4227
4290
  if (!fallbackPort) {
4228
4291
  return false;
4229
4292
  }
4230
- const fingerprint = fallbackPortChallengeConfigFingerprints.get(fallbackPort);
4231
- return fingerprint === void 0 || fingerprint === challengeFingerprint;
4293
+ const currentFingerprint = fallbackPortFingerprints.get(fallbackPort);
4294
+ if (currentFingerprint === void 0) {
4295
+ return !fingerprint.includes('"extensionWsEndpoint":"ws://');
4296
+ }
4297
+ return currentFingerprint === fingerprint;
4232
4298
  };
4233
4299
  var resolveFallbackTransportConfig = (config) => config && typeof config.relayPort === "number" && config.relayPort > 0 && config.relayToken !== false ? { extensionWsEndpoint: `ws://127.0.0.1:${config.relayPort}` } : {};
4300
+ var fallbackPortFingerprint = (challengeFingerprint, transportConfig) => JSON.stringify({
4301
+ challengeFingerprint,
4302
+ extensionWsEndpoint: transportConfig.extensionWsEndpoint ?? null
4303
+ });
4234
4304
  var createProviderRuntimeBundle = (args2) => {
4235
4305
  const challengeConfig = resolveEffectiveChallengeConfig(args2.config, args2.challengeConfig);
4236
4306
  const challengeFingerprint = challengeConfig ? JSON.stringify(challengeConfig) : null;
4237
- const browserFallbackPort = canReuseFallbackPort(args2.browserFallbackPort, challengeFingerprint) ? args2.browserFallbackPort : createBrowserFallbackPort(
4307
+ const transportConfig = resolveFallbackTransportConfig(args2.config);
4308
+ const fallbackFingerprint = fallbackPortFingerprint(challengeFingerprint, transportConfig);
4309
+ const challengeOrchestrator = args2.challengeOrchestrator ?? (challengeConfig ? new ChallengeOrchestrator(challengeConfig) : void 0);
4310
+ const browserFallbackPort = canReuseFallbackPort(args2.browserFallbackPort, fallbackFingerprint) ? args2.browserFallbackPort : createBrowserFallbackPort(
4238
4311
  args2.manager,
4239
4312
  {
4240
4313
  policy: args2.config?.providers?.cookiePolicy,
4241
4314
  source: args2.config?.providers?.cookieSource
4242
4315
  },
4243
- resolveFallbackTransportConfig(args2.config),
4244
- args2.challengeOrchestrator,
4316
+ transportConfig,
4317
+ challengeOrchestrator,
4245
4318
  challengeConfig?.mode ?? "browser_with_helper",
4246
4319
  challengeConfig?.optionalComputerUseBridge.enabled ?? true
4247
4320
  );
4248
4321
  if (browserFallbackPort && browserFallbackPort !== args2.browserFallbackPort) {
4249
- fallbackPortChallengeConfigFingerprints.set(browserFallbackPort, challengeFingerprint);
4322
+ fallbackPortFingerprints.set(browserFallbackPort, fallbackFingerprint);
4250
4323
  }
4251
4324
  const providerRuntime = createConfiguredProviderRuntime({
4252
4325
  config: args2.config,
4253
4326
  manager: args2.manager,
4254
4327
  browserFallbackPort,
4255
4328
  challengeConfig,
4256
- challengeOrchestrator: args2.challengeOrchestrator,
4329
+ challengeOrchestrator,
4257
4330
  init: args2.init
4258
4331
  });
4259
4332
  runtimeChallengeConfigFingerprints.set(
@@ -21733,6 +21806,7 @@ var APPROVED_LIBRARY_ENTRIES = {
21733
21806
  motion: new Set(PROJECT_DEFAULT_LIBRARY_POLICY.motion),
21734
21807
  threeD: new Set(PROJECT_DEFAULT_LIBRARY_POLICY.threeD)
21735
21808
  };
21809
+ var UNSUPPORTED_RUNTIME_LIBRARY_POLICY_KEYS = ["motion", "threeD"];
21736
21810
  var PROJECT_DEFAULT_RUNTIME_BUDGETS = {
21737
21811
  defaultLivePreviewLimit: 2,
21738
21812
  maxPinnedFullPreviewExtra: 1,
@@ -23170,6 +23244,8 @@ function buildGovernanceBlockStates(document2) {
23170
23244
  if (isNonEmptyRecord(block)) {
23171
23245
  if (key === "generationPlan") {
23172
23246
  status = assessGenerationPlan(block).status === "invalid" ? "invalid" : "present";
23247
+ } else if (key === "libraryPolicy" && hasUnsupportedRuntimeLanePolicy(document2)) {
23248
+ status = "invalid";
23173
23249
  } else {
23174
23250
  const inheritedDefault = OPTIONAL_INHERITED_KEYS.has(key) ? inheritedDefaultForGovernanceKey(key) : null;
23175
23251
  status = inheritedDefault && stableStringify(block) === stableStringify(inheritedDefault) ? "inherited" : "present";
@@ -23254,7 +23330,13 @@ function evaluateCanvasWarnings(document2, options = {}) {
23254
23330
  warnings.push(buildWarning("responsive-mismatch", "Viewport coverage is incomplete for desktop, tablet, and mobile previews.", { auditId: "CANVAS-02" }));
23255
23331
  }
23256
23332
  if (hasDisallowedLibrary(document2)) {
23257
- warnings.push(buildWarning("library-policy-violation", "Library policy references a non-approved canvas library.", { auditId: "CANVAS-04", severity: "error" }));
23333
+ const runtimeLaneViolations = runtimeLanePolicyViolations(resolveCanvasLibraryPolicy(document2));
23334
+ const details = runtimeLaneViolations.length > 0 ? { runtimeLaneViolations } : void 0;
23335
+ warnings.push(buildWarning("library-policy-violation", "Library policy references a non-approved canvas library.", {
23336
+ auditId: "CANVAS-04",
23337
+ severity: "error",
23338
+ ...details ? { details } : {}
23339
+ }));
23258
23340
  }
23259
23341
  if (hasIconPolicyViolation(document2)) {
23260
23342
  warnings.push(buildWarning("icon-policy-violation", "Icon policy references a non-approved icon family.", { auditId: "CANVAS-04", severity: "error" }));
@@ -23315,7 +23397,12 @@ function evaluateCanvasWarnings(document2, options = {}) {
23315
23397
  }
23316
23398
  function missingRequiredSaveBlocks(document2) {
23317
23399
  const states = buildGovernanceBlockStates(document2);
23318
- return REQUIRED_BEFORE_SAVE_KEYS.filter((key) => key === "generationPlan" ? states[key].status === "missing" || states[key].status === "invalid" : states[key].status === "missing");
23400
+ return REQUIRED_BEFORE_SAVE_KEYS.filter((key) => {
23401
+ if (key === "generationPlan" || key === "libraryPolicy") {
23402
+ return states[key].status === "missing" || states[key].status === "invalid";
23403
+ }
23404
+ return states[key].status === "missing";
23405
+ });
23319
23406
  }
23320
23407
  function validateCanvasSave(document2) {
23321
23408
  const missingBlocks = missingRequiredSaveBlocks(document2);
@@ -23351,6 +23438,20 @@ function hasDisallowedLibrary(document2) {
23351
23438
  const policy = resolveCanvasLibraryPolicy(document2);
23352
23439
  return Object.entries(policy).some(([category, entries]) => entries.some((entry) => !APPROVED_LIBRARY_ENTRIES[category].has(entry)));
23353
23440
  }
23441
+ function runtimeLanePolicyViolations(policy) {
23442
+ return UNSUPPORTED_RUNTIME_LIBRARY_POLICY_KEYS.map((category) => ({ category, entries: policy[category] })).filter((violation) => violation.entries.length > 0);
23443
+ }
23444
+ function hasUnsupportedRuntimeLanePolicy(document2) {
23445
+ return runtimeLanePolicyViolations(resolveCanvasLibraryPolicy(document2)).length > 0;
23446
+ }
23447
+ function assertNoUnsupportedRuntimeLanePolicy(document2) {
23448
+ const violations = runtimeLanePolicyViolations(resolveCanvasLibraryPolicy(document2));
23449
+ if (violations.length === 0) {
23450
+ return;
23451
+ }
23452
+ const paths = violations.map(({ category }) => `libraryPolicy.${category}`).join(", ");
23453
+ throw new Error(`${paths} must stay empty. Put shader, WebGL, Spline, and advanced motion cues in motionSystem or generationPlan.designVectors as advisory metadata only.`);
23454
+ }
23354
23455
  function hasIconPolicyViolation(document2) {
23355
23456
  const iconRoles = readCanvasIconRoles(document2);
23356
23457
  return Object.values(iconRoles).filter((entry) => Boolean(entry)).some((entry) => !APPROVED_LIBRARY_ENTRIES.icons.has(entry));
@@ -23681,6 +23782,7 @@ var CanvasDocumentStore = class {
23681
23782
  }
23682
23783
  replaceDocument(document2, revision, origin) {
23683
23784
  const nextDocument = normalizeCanvasDocument(document2);
23785
+ assertNoUnsupportedRuntimeLanePolicy(nextDocument);
23684
23786
  nextDocument.updatedAt = nowIso();
23685
23787
  this.ydoc.transact(() => {
23686
23788
  clearYMap(this.root);
@@ -30183,7 +30285,7 @@ function optionalString4(value) {
30183
30285
  return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
30184
30286
  }
30185
30287
 
30186
- // src/browser/canvas-manager.ts
30288
+ // src/canvas/guidance.ts
30187
30289
  var PREPLAN_CANVAS_GUIDANCE = {
30188
30290
  recommendedNextCommands: ["canvas.plan.set"],
30189
30291
  reason: "Handshake is complete. Submit a complete generationPlan before mutation."
@@ -30224,6 +30326,30 @@ var CANVAS_GUIDANCE_BY_COMMAND = {
30224
30326
  "canvas.document.save": PERSISTED_CANVAS_GUIDANCE,
30225
30327
  "canvas.document.export": EXPORTED_CANVAS_GUIDANCE
30226
30328
  };
30329
+ var CANVAS_REQUIRED_COMMANDS_BY_BLOCKER = {
30330
+ plan_required: ["canvas.plan.set"],
30331
+ generation_plan_invalid: ["canvas.plan.set", "canvas.plan.get"],
30332
+ revision_conflict: ["canvas.document.load"],
30333
+ policy_violation: ["canvas.plan.get", "canvas.document.load"],
30334
+ unsupported_target: ["canvas.session.status"],
30335
+ lease_reclaim_required: ["canvas.session.status"]
30336
+ };
30337
+ var cloneCanvasGuidance = (guidance) => ({
30338
+ recommendedNextCommands: [...guidance.recommendedNextCommands],
30339
+ reason: guidance.reason
30340
+ });
30341
+ var buildCanvasCommandGuidance = (input) => {
30342
+ if (input.planStatus === "invalid") {
30343
+ return cloneCanvasGuidance(INVALID_PLAN_CANVAS_GUIDANCE);
30344
+ }
30345
+ if (input.planStatus !== "accepted") {
30346
+ return cloneCanvasGuidance(PREPLAN_CANVAS_GUIDANCE);
30347
+ }
30348
+ return cloneCanvasGuidance(CANVAS_GUIDANCE_BY_COMMAND[input.command] ?? PLAN_ACCEPTED_CANVAS_GUIDANCE);
30349
+ };
30350
+ var getCanvasRequiredNextCommands = (code) => [...CANVAS_REQUIRED_COMMANDS_BY_BLOCKER[code]];
30351
+
30352
+ // src/browser/canvas-manager.ts
30227
30353
  function resolveGenerationPlanState(plan) {
30228
30354
  const assessment = assessGenerationPlan(plan);
30229
30355
  if (assessment.status === "accepted") {
@@ -32170,14 +32296,10 @@ var CanvasManager = class {
32170
32296
  };
32171
32297
  }
32172
32298
  buildCanvasGuidance(session, command) {
32173
- if (session.planStatus === "invalid") {
32174
- return cloneCanvasGuidance(INVALID_PLAN_CANVAS_GUIDANCE);
32175
- }
32176
- if (session.planStatus !== "accepted") {
32177
- return cloneCanvasGuidance(PREPLAN_CANVAS_GUIDANCE);
32178
- }
32179
- const guidance = CANVAS_GUIDANCE_BY_COMMAND[command] ?? PLAN_ACCEPTED_CANVAS_GUIDANCE;
32180
- return cloneCanvasGuidance(guidance);
32299
+ return buildCanvasCommandGuidance({
32300
+ planStatus: session.planStatus,
32301
+ command
32302
+ });
32181
32303
  }
32182
32304
  buildSessionSummary(session) {
32183
32305
  const document2 = session.store.getDocument();
@@ -32408,7 +32530,7 @@ var CanvasManager = class {
32408
32530
  const blocker = {
32409
32531
  code: "plan_required",
32410
32532
  blockingCommand: command,
32411
- requiredNextCommands: ["canvas.plan.set"],
32533
+ requiredNextCommands: getCanvasRequiredNextCommands("plan_required"),
32412
32534
  latestRevision: session.store.getRevision(),
32413
32535
  message: "generationPlan must be accepted before mutation."
32414
32536
  };
@@ -32418,7 +32540,7 @@ var CanvasManager = class {
32418
32540
  const blocker = {
32419
32541
  code: "generation_plan_invalid",
32420
32542
  blockingCommand: command,
32421
- requiredNextCommands: ["canvas.plan.set", "canvas.plan.get"],
32543
+ requiredNextCommands: getCanvasRequiredNextCommands("generation_plan_invalid"),
32422
32544
  latestRevision: session.store.getRevision(),
32423
32545
  message: this.describeGenerationPlanFailure(missingFields, issues)
32424
32546
  };
@@ -32436,7 +32558,7 @@ var CanvasManager = class {
32436
32558
  const blocker = {
32437
32559
  code: "revision_conflict",
32438
32560
  blockingCommand: command,
32439
- requiredNextCommands: ["canvas.document.load"],
32561
+ requiredNextCommands: getCanvasRequiredNextCommands("revision_conflict"),
32440
32562
  latestRevision: session.store.getRevision(),
32441
32563
  message: "The canvas document revision changed before this patch batch was applied."
32442
32564
  };
@@ -32446,7 +32568,7 @@ var CanvasManager = class {
32446
32568
  const blocker = {
32447
32569
  code: "policy_violation",
32448
32570
  blockingCommand: command,
32449
- requiredNextCommands: ["canvas.plan.get", "canvas.document.load"],
32571
+ requiredNextCommands: getCanvasRequiredNextCommands("policy_violation"),
32450
32572
  latestRevision: session.store.getRevision(),
32451
32573
  message: `Required save governance blocks are missing: ${missingBlocks.join(", ")}.`
32452
32574
  };
@@ -32464,7 +32586,7 @@ var CanvasManager = class {
32464
32586
  const blocker = {
32465
32587
  code: "unsupported_target",
32466
32588
  blockingCommand: command,
32467
- requiredNextCommands: ["canvas.session.status"],
32589
+ requiredNextCommands: getCanvasRequiredNextCommands("unsupported_target"),
32468
32590
  latestRevision: session.store.getRevision(),
32469
32591
  message: `Canvas target is unavailable: ${targetId}.`
32470
32592
  };
@@ -32481,7 +32603,7 @@ var CanvasManager = class {
32481
32603
  const blocker = {
32482
32604
  code: "lease_reclaim_required",
32483
32605
  blockingCommand: "canvas.session.status",
32484
- requiredNextCommands: ["canvas.session.status"],
32606
+ requiredNextCommands: getCanvasRequiredNextCommands("lease_reclaim_required"),
32485
32607
  latestRevision: session.store.getRevision(),
32486
32608
  message: "The canvas lease was reclaimed or replaced."
32487
32609
  };
@@ -32535,13 +32657,13 @@ var CanvasManager = class {
32535
32657
  const blocker = session.planStatus === "invalid" ? {
32536
32658
  code: "generation_plan_invalid",
32537
32659
  blockingCommand: "canvas.feedback.poll",
32538
- requiredNextCommands: ["canvas.plan.set", "canvas.plan.get"],
32660
+ requiredNextCommands: getCanvasRequiredNextCommands("generation_plan_invalid"),
32539
32661
  latestRevision: session.store.getRevision(),
32540
32662
  message: this.describeGenerationPlanFailure([], session.planIssues)
32541
32663
  } : {
32542
32664
  code: "plan_required",
32543
32665
  blockingCommand: "canvas.feedback.poll",
32544
- requiredNextCommands: ["canvas.plan.set"],
32666
+ requiredNextCommands: getCanvasRequiredNextCommands("plan_required"),
32545
32667
  latestRevision: session.store.getRevision(),
32546
32668
  message: "generationPlan must be accepted before the live design loop is ready."
32547
32669
  };
@@ -34289,12 +34411,6 @@ function attachDetails(error, details) {
34289
34411
  Object.assign(error, details);
34290
34412
  return error;
34291
34413
  }
34292
- function cloneCanvasGuidance(guidance) {
34293
- return {
34294
- recommendedNextCommands: [...guidance.recommendedNextCommands],
34295
- reason: guidance.reason
34296
- };
34297
- }
34298
34414
 
34299
34415
  // src/relay/relay-server.ts
34300
34416
  import { createServer } from "http";
@@ -36752,6 +36868,10 @@ var readTargetedSocialPlatform = (providerId) => {
36752
36868
  return "bluesky";
36753
36869
  case "social/reddit":
36754
36870
  return "reddit";
36871
+ case "social/facebook":
36872
+ return "facebook";
36873
+ case "social/threads":
36874
+ return "threads";
36755
36875
  default:
36756
36876
  return null;
36757
36877
  }
@@ -36902,7 +37022,8 @@ var buildRunOptions = (resolution, overrides) => {
36902
37022
  return {
36903
37023
  source,
36904
37024
  ...providerId ? { providerIds: [providerId] } : {},
36905
- ...overrides?.challengeAutomationMode ? { challengeAutomationMode: overrides.challengeAutomationMode } : {}
37025
+ ...overrides?.challengeAutomationMode ? { challengeAutomationMode: overrides.challengeAutomationMode } : {},
37026
+ ...overrides?.browserMode ? { runtimePolicy: { browserMode: overrides.browserMode } } : {}
36906
37027
  };
36907
37028
  };
36908
37029
  var executeMacroResolution = async (resolution, runtime, overrides) => {
@@ -36990,7 +37111,10 @@ var executeMacroWithRuntime = async (args2) => {
36990
37111
  await executeMacroResolution(
36991
37112
  args2.resolution,
36992
37113
  runtime,
36993
- args2.challengeAutomationMode ? { challengeAutomationMode: args2.challengeAutomationMode } : void 0
37114
+ args2.challengeAutomationMode || args2.browserMode ? {
37115
+ ...args2.browserMode ? { browserMode: args2.browserMode } : {},
37116
+ ...args2.challengeAutomationMode ? { challengeAutomationMode: args2.challengeAutomationMode } : {}
37117
+ } : void 0
36994
37118
  )
36995
37119
  );
36996
37120
  };
@@ -38035,21 +38159,32 @@ async function handleDaemonCommand(core, request) {
38035
38159
  count: cookies.length
38036
38160
  };
38037
38161
  }
38038
- case "macro.resolve":
38162
+ case "macro.resolve": {
38163
+ const execute = optionalBoolean2(params2.execute) ?? false;
38164
+ const browserMode = optionalWorkflowBrowserMode(params2.browserMode);
38165
+ const challengeAutomationMode = optionalChallengeAutomationMode(params2.challengeAutomationMode);
38166
+ if (!execute && browserMode) {
38167
+ throw new Error("browserMode requires execute=true for macro resolution");
38168
+ }
38169
+ if (!execute && challengeAutomationMode) {
38170
+ throw new Error("challengeAutomationMode requires execute=true for macro resolution");
38171
+ }
38039
38172
  return resolveMacroExpression(
38040
38173
  {
38041
38174
  expression: requireString3(params2.expression, "expression"),
38042
38175
  defaultProvider: optionalString6(params2.defaultProvider),
38043
38176
  includeCatalog: optionalBoolean2(params2.includeCatalog) ?? false,
38044
- execute: optionalBoolean2(params2.execute) ?? false,
38177
+ execute,
38045
38178
  timeoutMs: optionalNumber(params2.timeoutMs, "timeoutMs"),
38046
- challengeAutomationMode: optionalChallengeAutomationMode(params2.challengeAutomationMode)
38179
+ browserMode,
38180
+ challengeAutomationMode
38047
38181
  },
38048
38182
  core.config,
38049
38183
  core.manager,
38050
38184
  core.browserFallbackPort,
38051
38185
  core.providerRuntime
38052
38186
  );
38187
+ }
38053
38188
  case "research.run":
38054
38189
  return runResearchWorkflow(
38055
38190
  createDaemonWorkflowRuntime(core),
@@ -38066,6 +38201,7 @@ async function handleDaemonCommand(core, request) {
38066
38201
  timeoutMs: optionalNumber(params2.timeoutMs, "timeoutMs"),
38067
38202
  outputDir: optionalString6(params2.outputDir),
38068
38203
  ttlHours: optionalNumber(params2.ttlHours, "ttlHours"),
38204
+ browserMode: optionalWorkflowBrowserMode(params2.browserMode),
38069
38205
  useCookies: optionalBoolean2(params2.useCookies),
38070
38206
  challengeAutomationMode: optionalChallengeAutomationMode(params2.challengeAutomationMode),
38071
38207
  cookiePolicyOverride: optionalCookiePolicy(params2.cookiePolicyOverride)
@@ -38103,6 +38239,7 @@ async function handleDaemonCommand(core, request) {
38103
38239
  timeoutMs: inspiredesignTimeoutMs,
38104
38240
  outputDir: optionalString6(params2.outputDir),
38105
38241
  ttlHours: optionalNumber(params2.ttlHours, "ttlHours"),
38242
+ browserMode: optionalWorkflowBrowserMode(params2.browserMode),
38106
38243
  useCookies: optionalBoolean2(params2.useCookies),
38107
38244
  challengeAutomationMode: optionalChallengeAutomationMode(params2.challengeAutomationMode),
38108
38245
  cookiePolicyOverride: optionalCookiePolicy(params2.cookiePolicyOverride)
@@ -38129,6 +38266,7 @@ async function handleDaemonCommand(core, request) {
38129
38266
  output_dir: optionalString6(params2.output_dir),
38130
38267
  ttl_hours: optionalNumber(params2.ttl_hours, "ttl_hours"),
38131
38268
  timeoutMs: productVideoTimeoutMs,
38269
+ browserMode: optionalWorkflowBrowserMode(params2.browserMode),
38132
38270
  useCookies: optionalBoolean2(params2.useCookies),
38133
38271
  challengeAutomationMode: optionalChallengeAutomationMode(params2.challengeAutomationMode),
38134
38272
  cookiePolicyOverride: optionalCookiePolicy(params2.cookiePolicyOverride)
@@ -39089,6 +39227,7 @@ async function resolveMacroExpression(options, config, manager, browserFallbackP
39089
39227
  manager,
39090
39228
  browserFallbackPort,
39091
39229
  timeoutMs: options.timeoutMs,
39230
+ browserMode: options.browserMode,
39092
39231
  challengeAutomationMode: options.challengeAutomationMode
39093
39232
  });
39094
39233
  const handoff = buildMacroResolveSuccessHandoff({
@@ -40471,8 +40610,8 @@ var onboarding_metadata_default = {
40471
40610
  skillList: "opendevbrowser_skill_list",
40472
40611
  skillLoad: 'opendevbrowser_skill_load opendevbrowser-best-practices "quick start"',
40473
40612
  validatedLanes: 'opendevbrowser_skill_load opendevbrowser-best-practices "validated capability lanes"',
40474
- validatedResearch: 'npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --source-selection auto --mode json --output-format json',
40475
- validatedShopping: 'npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --mode json --output-format json',
40613
+ validatedResearch: 'npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --source-selection auto --browser-mode managed --mode json --output-format json',
40614
+ validatedShopping: 'npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json',
40476
40615
  computerUseEntry: 'npx opendevbrowser research run --topic "account recovery flow" --source-selection auto --challenge-automation-mode browser --mode json --output-format json',
40477
40616
  happyPath: "npx opendevbrowser launch --no-extension --headless --start-url https://example.com --output-format json"
40478
40617
  },
@@ -40616,7 +40755,7 @@ var DEFAULT_WORKFLOW_TRANSPORT_TIMEOUT_MS = 12e4;
40616
40755
  // src/public-surface/generated-manifest.ts
40617
40756
  var PUBLIC_SURFACE_MANIFEST = {
40618
40757
  "schemaVersion": "2026-04-04",
40619
- "generatedAt": "2026-04-28T03:51:39.553Z",
40758
+ "generatedAt": "2026-04-30T02:27:58.736Z",
40620
40759
  "cli": {
40621
40760
  "groups": [
40622
40761
  {
@@ -41042,7 +41181,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41042
41181
  "--timeout-ms"
41043
41182
  ],
41044
41183
  "examples": [
41045
- "npx opendevbrowser status-capabilities --session-id s1 --target-id page-1 --challenge-automation-mode browser --timeout-ms 30000 --output-format json"
41184
+ "npx opendevbrowser status-capabilities --session-id s1 --target-id page-1 --challenge-automation-mode browser_with_helper --timeout-ms 30000 --output-format json"
41046
41185
  ],
41047
41186
  "notes": [],
41048
41187
  "groupId": "session_lifecycle",
@@ -41086,7 +41225,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41086
41225
  {
41087
41226
  "name": "research",
41088
41227
  "description": "Run research workflows",
41089
- "usage": "npx opendevbrowser research run --topic <text> [--days <n>|--from <date> --to <date>] [--source-selection <family>] [--sources <csv>] [--include-engagement] [--limit-per-source <n>] [--mode <mode>] [--timeout-ms <ms>] [--output-dir <path>] [--ttl-hours <n>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>]",
41228
+ "usage": "npx opendevbrowser research run --topic <text> [--days <n>|--from <date> --to <date>] [--source-selection <family>] [--sources <csv>] [--include-engagement] [--limit-per-source <n>] [--browser-mode <mode>] [--mode <mode>] [--timeout-ms <ms>] [--output-dir <path>] [--ttl-hours <n>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>]",
41090
41229
  "flags": [
41091
41230
  "--topic",
41092
41231
  "--days",
@@ -41096,6 +41235,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41096
41235
  "--sources",
41097
41236
  "--include-engagement",
41098
41237
  "--limit-per-source",
41238
+ "--browser-mode",
41099
41239
  "--mode",
41100
41240
  "--timeout-ms",
41101
41241
  "--output-dir",
@@ -41106,7 +41246,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41106
41246
  "--cookie-policy"
41107
41247
  ],
41108
41248
  "examples": [
41109
- 'npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --source-selection auto --mode json --output-format json'
41249
+ 'npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --source-selection auto --browser-mode managed --mode json --output-format json'
41110
41250
  ],
41111
41251
  "notes": [
41112
41252
  "Generic topical research is currently safest with --source-selection auto; add shopping only for deliberate commercial comparison."
@@ -41136,7 +41276,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41136
41276
  "--cookie-policy"
41137
41277
  ],
41138
41278
  "examples": [
41139
- 'npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --mode json --output-format json'
41279
+ 'npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json'
41140
41280
  ],
41141
41281
  "notes": [
41142
41282
  "Treat --region as advisory unless the workflow output reports region_authoritative=true."
@@ -41148,7 +41288,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41148
41288
  {
41149
41289
  "name": "product-video",
41150
41290
  "description": "Run product presentation asset workflows",
41151
- "usage": "npx opendevbrowser product-video run (--product-url <url> | --product-name <name>) [--provider-hint <provider>] [--include-screenshots <bool>] [--include-all-images <bool>] [--include-copy <bool>] [--timeout-ms <ms>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>] [--output-dir <path>] [--ttl-hours <n>]",
41291
+ "usage": "npx opendevbrowser product-video run (--product-url <url> | --product-name <name>) [--provider-hint <provider>] [--include-screenshots[=<bool>]] [--include-all-images[=<bool>]] [--include-copy[=<bool>]] [--timeout-ms <ms>] [--browser-mode <mode>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>] [--output-dir <path>] [--ttl-hours <n>]",
41152
41292
  "flags": [
41153
41293
  "--product-url",
41154
41294
  "--product-name",
@@ -41157,6 +41297,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41157
41297
  "--include-all-images",
41158
41298
  "--include-copy",
41159
41299
  "--timeout-ms",
41300
+ "--browser-mode",
41160
41301
  "--use-cookies",
41161
41302
  "--challenge-automation-mode",
41162
41303
  "--cookie-policy-override",
@@ -41165,7 +41306,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41165
41306
  "--ttl-hours"
41166
41307
  ],
41167
41308
  "examples": [
41168
- 'npx opendevbrowser product-video run --product-url "https://example.com/p/1" --include-screenshots --output-format json'
41309
+ 'npx opendevbrowser product-video run --product-url "https://example.com/p/1" --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --include-screenshots --output-format json'
41169
41310
  ],
41170
41311
  "notes": [
41171
41312
  "Confirm whether the returned pack is visual-ready or metadata-first before briefing production."
@@ -41177,7 +41318,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41177
41318
  {
41178
41319
  "name": "inspiredesign",
41179
41320
  "description": "Run inspiredesign workflows",
41180
- "usage": "npx opendevbrowser inspiredesign run --brief <text> [--url <url>]... [--capture-mode <mode>] [--include-prototype-guidance[=<bool>]] [--mode <mode>] [--timeout-ms <ms>] [--output-dir <path>] [--ttl-hours <n>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>]",
41321
+ "usage": "npx opendevbrowser inspiredesign run --brief <text> [--url <url>]... [--capture-mode <mode>] [--include-prototype-guidance[=<bool>]] [--mode <mode>] [--timeout-ms <ms>] [--output-dir <path>] [--ttl-hours <n>] [--browser-mode <mode>] [--use-cookies[=<bool>]] [--challenge-automation-mode <mode>] [--cookie-policy-override <policy>]",
41181
41322
  "flags": [
41182
41323
  "--brief",
41183
41324
  "--url",
@@ -41187,13 +41328,14 @@ var PUBLIC_SURFACE_MANIFEST = {
41187
41328
  "--timeout-ms",
41188
41329
  "--output-dir",
41189
41330
  "--ttl-hours",
41331
+ "--browser-mode",
41190
41332
  "--use-cookies",
41191
41333
  "--challenge-automation-mode",
41192
41334
  "--cookie-policy-override",
41193
41335
  "--cookie-policy"
41194
41336
  ],
41195
41337
  "examples": [
41196
- 'npx opendevbrowser inspiredesign run --brief "Extract a reusable dashboard design contract from live references" --url https://linear.app --include-prototype-guidance --output-dir /tmp/inspiredesign --output-format json'
41338
+ 'npx opendevbrowser inspiredesign run --brief "Extract a reusable dashboard design contract from live references" --url https://linear.app --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --include-prototype-guidance --output-dir /tmp/inspiredesign --output-format json'
41197
41339
  ],
41198
41340
  "notes": [
41199
41341
  "Any inspiredesign --url forces deep capture for DOM/layout evidence; without URLs, --capture-mode defaults to off.",
@@ -41222,19 +41364,21 @@ var PUBLIC_SURFACE_MANIFEST = {
41222
41364
  {
41223
41365
  "name": "macro-resolve",
41224
41366
  "description": "Resolve or execute a macro expression via provider actions",
41225
- "usage": "npx opendevbrowser macro-resolve --expression <macro> [--default-provider <provider>] [--include-catalog] [--execute] [--timeout-ms <ms>] [--challenge-automation-mode <mode>]",
41367
+ "usage": "npx opendevbrowser macro-resolve --expression <macro> [--default-provider <provider>] [--include-catalog] [--execute [--timeout-ms <ms>] [--browser-mode <mode>] [--challenge-automation-mode <mode>]]",
41226
41368
  "flags": [
41227
41369
  "--expression",
41228
41370
  "--default-provider",
41229
41371
  "--include-catalog",
41230
41372
  "--execute",
41231
41373
  "--timeout-ms",
41374
+ "--browser-mode",
41232
41375
  "--challenge-automation-mode"
41233
41376
  ],
41234
41377
  "examples": [
41235
- `npx opendevbrowser macro-resolve --expression '@community.search("browser automation failures", 4)' --execute --challenge-automation-mode browser --output-format json`
41378
+ `npx opendevbrowser macro-resolve --expression '@community.search("browser automation failures", 4)' --execute --browser-mode extension --challenge-automation-mode browser_with_helper --output-format json`
41236
41379
  ],
41237
41380
  "notes": [
41381
+ "Use --browser-mode and --challenge-automation-mode only with --execute.",
41238
41382
  "When --execute is enabled, inspect execution.meta.blocker before trusting a blocked result as complete."
41239
41383
  ],
41240
41384
  "groupId": "provider_workflows",
@@ -41900,7 +42044,7 @@ var PUBLIC_SURFACE_MANIFEST = {
41900
42044
  "--timeout-ms"
41901
42045
  ],
41902
42046
  "examples": [
41903
- "npx opendevbrowser session-inspector-plan --session-id s1 --target-id page-1 --challenge-automation-mode browser --output-format json"
42047
+ "npx opendevbrowser session-inspector-plan --session-id s1 --target-id page-1 --challenge-automation-mode browser_with_helper --output-format json"
41904
42048
  ],
41905
42049
  "notes": [
41906
42050
  "Inspect browser-scoped challenge automation before enabling browser_with_helper on a live rerun."
@@ -42846,7 +42990,7 @@ var PUBLIC_SURFACE_MANIFEST = {
42846
42990
  "name": "opendevbrowser_status_capabilities",
42847
42991
  "description": "Inspect runtime capability discovery for the host and an optional session.",
42848
42992
  "cliEquivalent": "status-capabilities",
42849
- "example": "npx opendevbrowser status-capabilities --session-id s1 --target-id page-1 --challenge-automation-mode browser --timeout-ms 30000 --output-format json"
42993
+ "example": "npx opendevbrowser status-capabilities --session-id s1 --target-id page-1 --challenge-automation-mode browser_with_helper --timeout-ms 30000 --output-format json"
42850
42994
  },
42851
42995
  {
42852
42996
  "name": "opendevbrowser_session_inspector",
@@ -42858,7 +43002,7 @@ var PUBLIC_SURFACE_MANIFEST = {
42858
43002
  "name": "opendevbrowser_session_inspector_plan",
42859
43003
  "description": "Inspect browser-scoped computer-use policy, eligibility, and safe suggested steps.",
42860
43004
  "cliEquivalent": "session-inspector-plan",
42861
- "example": "npx opendevbrowser session-inspector-plan --session-id s1 --target-id page-1 --challenge-automation-mode browser --output-format json"
43005
+ "example": "npx opendevbrowser session-inspector-plan --session-id s1 --target-id page-1 --challenge-automation-mode browser_with_helper --output-format json"
42862
43006
  },
42863
43007
  {
42864
43008
  "name": "opendevbrowser_session_inspector_audit",
@@ -43112,31 +43256,31 @@ var PUBLIC_SURFACE_MANIFEST = {
43112
43256
  "name": "opendevbrowser_macro_resolve",
43113
43257
  "description": "Resolve or execute provider macro expressions.",
43114
43258
  "cliEquivalent": "macro-resolve",
43115
- "example": `npx opendevbrowser macro-resolve --expression '@community.search("browser automation failures", 4)' --execute --challenge-automation-mode browser --output-format json`
43259
+ "example": `npx opendevbrowser macro-resolve --expression '@community.search("browser automation failures", 4)' --execute --browser-mode extension --challenge-automation-mode browser_with_helper --output-format json`
43116
43260
  },
43117
43261
  {
43118
43262
  "name": "opendevbrowser_research_run",
43119
43263
  "description": "Run the research workflow directly.",
43120
43264
  "cliEquivalent": "research",
43121
- "example": 'npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --source-selection auto --mode json --output-format json'
43265
+ "example": 'npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --source-selection auto --browser-mode managed --mode json --output-format json'
43122
43266
  },
43123
43267
  {
43124
43268
  "name": "opendevbrowser_shopping_run",
43125
43269
  "description": "Run the shopping workflow directly.",
43126
43270
  "cliEquivalent": "shopping",
43127
- "example": 'npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --mode json --output-format json'
43271
+ "example": 'npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json'
43128
43272
  },
43129
43273
  {
43130
43274
  "name": "opendevbrowser_product_video_run",
43131
43275
  "description": "Run the product-video asset workflow directly.",
43132
43276
  "cliEquivalent": "product-video",
43133
- "example": 'npx opendevbrowser product-video run --product-url "https://example.com/p/1" --include-screenshots --output-format json'
43277
+ "example": 'npx opendevbrowser product-video run --product-url "https://example.com/p/1" --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --include-screenshots --output-format json'
43134
43278
  },
43135
43279
  {
43136
43280
  "name": "opendevbrowser_inspiredesign_run",
43137
43281
  "description": "Run the inspiredesign workflow directly.",
43138
43282
  "cliEquivalent": "inspiredesign",
43139
- "example": 'npx opendevbrowser inspiredesign run --brief "Extract a reusable dashboard design contract from live references" --url https://linear.app --include-prototype-guidance --output-dir /tmp/inspiredesign --output-format json'
43283
+ "example": 'npx opendevbrowser inspiredesign run --brief "Extract a reusable dashboard design contract from live references" --url https://linear.app --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --include-prototype-guidance --output-dir /tmp/inspiredesign --output-format json'
43140
43284
  },
43141
43285
  {
43142
43286
  "name": "opendevbrowser_canvas",
@@ -43622,4 +43766,4 @@ export {
43622
43766
  TOOL_SURFACE_ENTRIES
43623
43767
  };
43624
43768
  /* v8 ignore next -- @preserve */
43625
- //# sourceMappingURL=chunk-MWBDO2L5.js.map
43769
+ //# sourceMappingURL=chunk-I5ZCOZZV.js.map