@nuanu-ai/agentbrowse 0.2.48 → 0.2.50

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 (60) hide show
  1. package/README.md +34 -7
  2. package/dist/agentpay-gateway.d.ts +1 -0
  3. package/dist/agentpay-gateway.d.ts.map +1 -1
  4. package/dist/agentpay-gateway.js +5 -2
  5. package/dist/commands/act.d.ts.map +1 -1
  6. package/dist/commands/act.js +46 -61
  7. package/dist/commands/action-acceptance.d.ts +3 -7
  8. package/dist/commands/action-acceptance.d.ts.map +1 -1
  9. package/dist/commands/action-acceptance.js +8 -25
  10. package/dist/commands/browser-status.d.ts +6 -0
  11. package/dist/commands/browser-status.d.ts.map +1 -0
  12. package/dist/commands/browser-status.js +228 -0
  13. package/dist/commands/close.d.ts.map +1 -1
  14. package/dist/commands/close.js +35 -30
  15. package/dist/commands/end-session.d.ts +1 -1
  16. package/dist/commands/end-session.d.ts.map +1 -1
  17. package/dist/commands/end-session.js +3 -1
  18. package/dist/commands/init.d.ts.map +1 -1
  19. package/dist/commands/init.js +6 -3
  20. package/dist/commands/launch.d.ts +1 -1
  21. package/dist/commands/launch.d.ts.map +1 -1
  22. package/dist/commands/launch.js +38 -35
  23. package/dist/commands/observe-projection.d.ts +2 -1
  24. package/dist/commands/observe-projection.d.ts.map +1 -1
  25. package/dist/commands/observe-projection.js +12 -1
  26. package/dist/commands/observe.d.ts.map +1 -1
  27. package/dist/commands/observe.js +62 -92
  28. package/dist/commands/start-session.d.ts.map +1 -1
  29. package/dist/commands/start-session.js +15 -11
  30. package/dist/commands/status.d.ts +22 -2
  31. package/dist/commands/status.d.ts.map +1 -1
  32. package/dist/commands/status.js +36 -215
  33. package/dist/generated/build-config.d.ts +2 -0
  34. package/dist/generated/build-config.d.ts.map +1 -0
  35. package/dist/generated/build-config.js +2 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +35 -27
  38. package/dist/otel-exporter.d.ts.map +1 -1
  39. package/dist/otel-exporter.js +5 -11
  40. package/dist/run-store.d.ts +1 -1
  41. package/dist/run-store.d.ts.map +1 -1
  42. package/dist/run-store.js +3 -7
  43. package/dist/secrets/backend.d.ts +0 -1
  44. package/dist/secrets/backend.d.ts.map +1 -1
  45. package/dist/secrets/backend.js +0 -1
  46. package/dist/session-event-exporter.d.ts +1 -3
  47. package/dist/session-event-exporter.d.ts.map +1 -1
  48. package/dist/session-event-exporter.js +1 -14
  49. package/dist/sessions-backend.d.ts +20 -26
  50. package/dist/sessions-backend.d.ts.map +1 -1
  51. package/dist/sessions-backend.js +5 -5
  52. package/dist/solver/captcha-solver.d.ts.map +1 -1
  53. package/dist/solver/captcha-solver.js +12 -8
  54. package/dist/solver/config.d.ts +0 -1
  55. package/dist/solver/config.d.ts.map +1 -1
  56. package/dist/solver/config.js +0 -22
  57. package/dist/workflow-session-completion.d.ts +1 -1
  58. package/dist/workflow-session-completion.d.ts.map +1 -1
  59. package/dist/workflow-session-completion.js +23 -3
  60. package/package.json +3 -1
@@ -0,0 +1,228 @@
1
+ /**
2
+ * browse browser-status — Check live browser/page/runtime state.
3
+ */
4
+ import { getSessionPort, loadSession, supportsCaptchaSolve } from '../session.js';
5
+ import { connectPlaywright, disconnectPlaywright, resolveCurrentPageContext, } from '../playwright-runtime.js';
6
+ import { finishRunStep, startRunStep } from '../run-store.js';
7
+ import { appendCommandLifecycleEventBestEffort, captureStepSnapshotBestEffort, } from '../run-observability.js';
8
+ function tryResolveHost(url) {
9
+ if (!url) {
10
+ return undefined;
11
+ }
12
+ try {
13
+ return new URL(url).hostname || undefined;
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ function buildRuntimeSummary(session) {
20
+ return session?.runtime
21
+ ? {
22
+ currentPageRef: session.runtime.currentPageRef,
23
+ pageCount: Object.keys(session.runtime.pages).length,
24
+ surfaceCount: Object.keys(session.runtime.surfaces ?? {}).length,
25
+ targetCount: Object.keys(session.runtime.targets).length,
26
+ metrics: session.runtime.metrics,
27
+ }
28
+ : undefined;
29
+ }
30
+ function buildProtectedStatusPayload(params) {
31
+ return {
32
+ success: true,
33
+ alive: true,
34
+ outcomeType: 'protected_exposure_active',
35
+ ...(params.captchaSolveCapable !== undefined
36
+ ? { captchaSolveCapable: params.captchaSolveCapable }
37
+ : {}),
38
+ runtime: params.runtimeSummary,
39
+ ...(params.currentPageMismatch ? { currentPageMismatch: params.currentPageMismatch } : {}),
40
+ protectedExposureActive: true,
41
+ pageRef: params.pageRef,
42
+ url: params.pageUrl ?? 'unknown',
43
+ title: params.pageTitle ?? 'unknown',
44
+ ...(tryResolveHost(params.pageUrl) ? { host: tryResolveHost(params.pageUrl) } : {}),
45
+ fillRef: params.protectedExposure.fillRef,
46
+ requestId: params.protectedExposure.requestId,
47
+ activatedAt: params.protectedExposure.activatedAt,
48
+ exposureReason: params.protectedExposure.reason,
49
+ message: 'Protected values may still be visible on the current page.',
50
+ reason: 'AgentBrowse is treating the current page as sensitive because a protected fill was executed and values may still be visible.',
51
+ };
52
+ }
53
+ async function readCanonicalStatus(session) {
54
+ let browser = null;
55
+ try {
56
+ browser = await connectPlaywright(session.cdpUrl);
57
+ const resolved = await resolveCurrentPageContext(browser, session);
58
+ const persisted = session.runtime?.currentPageRef;
59
+ const title = (await resolved.page
60
+ .title()
61
+ .catch(() => session.runtime?.pages[resolved.pageRef]?.title ?? '')) ||
62
+ session.runtime?.pages[resolved.pageRef]?.title ||
63
+ 'unknown';
64
+ const url = resolved.page.url() || session.runtime?.pages[resolved.pageRef]?.url || 'unknown';
65
+ return {
66
+ pageRef: resolved.pageRef,
67
+ url,
68
+ title,
69
+ ...(persisted && (persisted !== resolved.pageRef || resolved.recoveredVia)
70
+ ? {
71
+ currentPageMismatch: {
72
+ persistedPageRef: persisted,
73
+ ...(persisted !== resolved.pageRef ? { livePageRef: resolved.pageRef } : {}),
74
+ ...(resolved.recoveredVia ? { recoveredVia: resolved.recoveredVia } : {}),
75
+ },
76
+ }
77
+ : {}),
78
+ };
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ finally {
84
+ if (browser) {
85
+ await disconnectPlaywright(browser);
86
+ }
87
+ }
88
+ }
89
+ async function readFallbackLiveStatus(port) {
90
+ const res = await fetch(`http://localhost:${port}/json/version`);
91
+ if (!res.ok) {
92
+ return undefined;
93
+ }
94
+ const listRes = await fetch(`http://localhost:${port}/json/list`);
95
+ const targets = (await listRes.json());
96
+ return targets.find((target) => target.type === 'page' && !target.url.startsWith('devtools://'));
97
+ }
98
+ async function finishBrowserStatusStepBestEffort(session, runId, stepId, result) {
99
+ if (!runId || !stepId) {
100
+ return;
101
+ }
102
+ const step = {
103
+ runId,
104
+ stepId,
105
+ command: 'browser-status',
106
+ };
107
+ captureStepSnapshotBestEffort({
108
+ session: session ?? {
109
+ cdpUrl: '',
110
+ pid: 0,
111
+ launchedAt: new Date(0).toISOString(),
112
+ },
113
+ step,
114
+ phase: 'point-in-time',
115
+ pageRef: typeof result.pageRef === 'string' ? result.pageRef : session?.runtime?.currentPageRef,
116
+ url: typeof result.url === 'string' ? result.url : undefined,
117
+ title: typeof result.title === 'string' ? result.title : undefined,
118
+ });
119
+ appendCommandLifecycleEventBestEffort({
120
+ step,
121
+ phase: result.success ? 'completed' : 'failed',
122
+ attributes: {
123
+ alive: result.alive === true,
124
+ ...(typeof result.outcomeType === 'string' ? { outcomeType: result.outcomeType } : {}),
125
+ ...(typeof result.pageRef === 'string' ? { pageRef: result.pageRef } : {}),
126
+ },
127
+ });
128
+ try {
129
+ finishRunStep({
130
+ runId,
131
+ stepId,
132
+ success: result.success,
133
+ ...(typeof result.outcomeType === 'string'
134
+ ? { outcomeType: result.outcomeType }
135
+ : { outcomeType: result.alive === true ? 'browser_alive' : 'browser_not_running' }),
136
+ ...(typeof result.message === 'string' ? { message: result.message } : {}),
137
+ ...(typeof result.reason === 'string' ? { reason: result.reason } : {}),
138
+ });
139
+ }
140
+ catch {
141
+ // Best effort only.
142
+ }
143
+ }
144
+ export async function browserStatus() {
145
+ const session = loadSession();
146
+ const port = getSessionPort(session);
147
+ const runtimeSummary = buildRuntimeSummary(session);
148
+ const statusStep = session?.activeRunId
149
+ ? startRunStep({
150
+ runId: session.activeRunId,
151
+ command: 'browser-status',
152
+ input: {
153
+ hasSession: session !== null,
154
+ hasRuntime: Boolean(session?.runtime),
155
+ },
156
+ })
157
+ : null;
158
+ appendCommandLifecycleEventBestEffort({
159
+ step: statusStep,
160
+ phase: 'started',
161
+ attributes: {
162
+ hasSession: session !== null,
163
+ hasRuntime: Boolean(session?.runtime),
164
+ },
165
+ });
166
+ if (session) {
167
+ const canonical = await readCanonicalStatus(session);
168
+ if (canonical) {
169
+ const protectedExposure = session.runtime?.protectedExposureByPage?.[canonical.pageRef];
170
+ if (protectedExposure) {
171
+ const result = buildProtectedStatusPayload({
172
+ runtimeSummary,
173
+ pageRef: canonical.pageRef,
174
+ pageUrl: canonical.url,
175
+ pageTitle: canonical.title,
176
+ captchaSolveCapable: supportsCaptchaSolve(session),
177
+ currentPageMismatch: canonical.currentPageMismatch,
178
+ protectedExposure,
179
+ });
180
+ await finishBrowserStatusStepBestEffort(session, session.activeRunId, statusStep?.stepId, result);
181
+ return result;
182
+ }
183
+ const result = {
184
+ success: true,
185
+ alive: true,
186
+ captchaSolveCapable: supportsCaptchaSolve(session),
187
+ pageRef: canonical.pageRef,
188
+ url: canonical.url,
189
+ title: canonical.title,
190
+ runtime: runtimeSummary,
191
+ ...(canonical.currentPageMismatch
192
+ ? { currentPageMismatch: canonical.currentPageMismatch }
193
+ : {}),
194
+ };
195
+ await finishBrowserStatusStepBestEffort(session, session.activeRunId, statusStep?.stepId, result);
196
+ return result;
197
+ }
198
+ }
199
+ try {
200
+ const page = await readFallbackLiveStatus(port);
201
+ if (!page) {
202
+ const result = { success: true, alive: false, runtime: runtimeSummary };
203
+ await finishBrowserStatusStepBestEffort(session, session?.activeRunId, statusStep?.stepId, result);
204
+ return result;
205
+ }
206
+ const result = {
207
+ success: true,
208
+ alive: true,
209
+ ...(session ? { captchaSolveCapable: supportsCaptchaSolve(session) } : {}),
210
+ url: page.url ?? 'unknown',
211
+ title: page.title ?? 'unknown',
212
+ ...(session?.runtime ? { currentPageUnresolved: true } : {}),
213
+ runtime: runtimeSummary,
214
+ };
215
+ await finishBrowserStatusStepBestEffort(session, session?.activeRunId, statusStep?.stepId, result);
216
+ return result;
217
+ }
218
+ catch {
219
+ const result = {
220
+ success: true,
221
+ alive: false,
222
+ ...(session?.runtime ? { currentPageUnresolved: true } : {}),
223
+ runtime: runtimeSummary,
224
+ };
225
+ await finishBrowserStatusStepBestEffort(session, session?.activeRunId, statusStep?.stepId, result);
226
+ return result;
227
+ }
228
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EACD,sBAAsB,GACtB,8BAA8B,GAC9B,0BAA0B,GAC1B,2BAA2B,GAC3B,kCAAkC,CAAC;IACvC,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,uBAAuB,GAAG,wDAAwD,CAAC;IAC5F,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AA8ElE,wBAAsB,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,CA6IlD"}
1
+ {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EACD,sBAAsB,GACtB,8BAA8B,GAC9B,0BAA0B,GAC1B,2BAA2B,GAC3B,kCAAkC,CAAC;IACvC,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,uBAAuB,GAAG,wDAAwD,CAAC;IAC5F,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AA8FlE,wBAAsB,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,CAyIlD"}
@@ -9,6 +9,12 @@ import { info } from '../output.js';
9
9
  import { closeOwnedBrowser } from '../owned-browser.js';
10
10
  import { isManagedBrowserPid } from '../owned-process.js';
11
11
  import { completeWorkflowSessionRemote } from '../workflow-session-completion.js';
12
+ function isNonBlockingWorkflowCompletionFailure(error) {
13
+ return (error === 'workflow_session_unavailable' ||
14
+ error === 'workflow_session_already_closed' ||
15
+ error === 'workflow_run_unavailable' ||
16
+ error === 'workflow_step_unavailable');
17
+ }
12
18
  function isCloseableManagedSession(session) {
13
19
  if (!session) {
14
20
  return false;
@@ -136,37 +142,36 @@ export async function close() {
136
142
  reason: 'The active browser session was closed by the close command.',
137
143
  });
138
144
  if (!remoteCompletion.success) {
139
- const reason = remoteCompletion.reason;
140
- const failureError = remoteCompletion.error === 'backend_session_complete_failed'
141
- ? 'workflow_session_complete_failed'
142
- : remoteCompletion.error;
143
- const failureMessage = 'Browser closed but workflow session completion failed.';
144
- appendCommandLifecycleEventBestEffort({
145
- step: closeStep,
146
- phase: 'failed',
147
- attributes: {
148
- outcomeType: remoteCompletion.error === 'backend_session_complete_failed'
149
- ? 'workflow_session_complete_failed'
150
- : remoteCompletion.error,
145
+ if (isNonBlockingWorkflowCompletionFailure(remoteCompletion.error)) {
146
+ info(`[close] clearing stale workflow state after browser close: ${remoteCompletion.reason}`);
147
+ }
148
+ else {
149
+ const reason = remoteCompletion.reason;
150
+ const failureError = 'workflow_session_complete_failed';
151
+ const failureMessage = 'Browser closed but workflow session completion failed.';
152
+ appendCommandLifecycleEventBestEffort({
153
+ step: closeStep,
154
+ phase: 'failed',
155
+ attributes: {
156
+ outcomeType: failureError,
157
+ reason,
158
+ },
159
+ });
160
+ await finalizeStepBestEffort(session?.activeRunId, closeStep?.stepId, {
161
+ success: false,
162
+ outcomeType: failureError,
163
+ message: failureMessage,
151
164
  reason,
152
- },
153
- });
154
- await finalizeStepBestEffort(session?.activeRunId, closeStep?.stepId, {
155
- success: false,
156
- outcomeType: remoteCompletion.error === 'backend_session_complete_failed'
157
- ? 'workflow_session_complete_failed'
158
- : remoteCompletion.error,
159
- message: failureMessage,
160
- reason,
161
- skipExport: true,
162
- });
163
- return {
164
- success: false,
165
- error: failureError,
166
- outcomeType: remoteCompletion.error === 'backend_session_complete_failed' ? 'failed' : 'blocked',
167
- message: failureMessage,
168
- reason,
169
- };
165
+ skipExport: true,
166
+ });
167
+ return {
168
+ success: false,
169
+ error: failureError,
170
+ outcomeType: 'failed',
171
+ message: failureMessage,
172
+ reason,
173
+ };
174
+ }
170
175
  }
171
176
  }
172
177
  appendCommandLifecycleEventBestEffort({
@@ -15,7 +15,7 @@ export type EndSessionSuccessResult = {
15
15
  };
16
16
  export type EndSessionFailureResult = {
17
17
  success: false;
18
- error: 'workflow_session_unavailable' | 'workflow_run_unavailable' | 'workflow_step_unavailable' | 'backend_session_complete_failed';
18
+ error: 'workflow_session_unavailable' | 'workflow_session_already_closed' | 'workflow_run_unavailable' | 'workflow_step_unavailable' | 'backend_session_complete_failed';
19
19
  outcomeType: 'blocked' | 'failed';
20
20
  message: 'Workflow session end failed.';
21
21
  reason: string;
@@ -1 +1 @@
1
- {"version":3,"file":"end-session.d.ts","sourceRoot":"","sources":["../../src/commands/end-session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAOhE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,4BAA4B,CAAC;IAC1C,OAAO,EAAE,6BAA6B,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EACD,8BAA8B,GAC9B,0BAA0B,GAC1B,2BAA2B,GAC3B,iCAAiC,CAAC;IACtC,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,8BAA8B,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,GAAG,uBAAuB,CAAC;AA0DjF,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0IlF"}
1
+ {"version":3,"file":"end-session.d.ts","sourceRoot":"","sources":["../../src/commands/end-session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAOhE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,4BAA4B,CAAC;IAC1C,OAAO,EAAE,6BAA6B,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EACD,8BAA8B,GAC9B,iCAAiC,GACjC,0BAA0B,GAC1B,2BAA2B,GAC3B,iCAAiC,CAAC;IACtC,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,8BAA8B,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,GAAG,uBAAuB,CAAC;AA4DjF,wBAAsB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4IlF"}
@@ -91,7 +91,9 @@ export async function endSession(session) {
91
91
  message: 'Workflow session completed.',
92
92
  });
93
93
  if (!remoteCompletion.success) {
94
- const outcomeType = remoteCompletion.error === 'backend_session_complete_failed' ? 'backend_session_complete_failed' : 'blocked';
94
+ const outcomeType = remoteCompletion.error === 'backend_session_complete_failed'
95
+ ? 'backend_session_complete_failed'
96
+ : 'blocked';
95
97
  appendCommandLifecycleEventBestEffort({
96
98
  step: endSessionStepHandle,
97
99
  phase: 'failed',
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBzE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BzE"}
@@ -1,4 +1,5 @@
1
1
  import { outputJSON } from '../output.js';
2
+ import { DEFAULT_AGENTPAY_API_URL } from '../generated/build-config.js';
2
3
  import { getConfigPath, readConfig, writeConfig } from '../solver/config.js';
3
4
  function normalizeApiUrl(value) {
4
5
  return value.replace(/\/$/, '');
@@ -6,13 +7,15 @@ function normalizeApiUrl(value) {
6
7
  export async function init(apiKey, apiUrl) {
7
8
  const config = readConfig();
8
9
  const normalizedApiKey = apiKey.trim();
9
- const normalizedApiUrl = apiUrl?.trim() ? normalizeApiUrl(apiUrl.trim()) : undefined;
10
+ const normalizedApiUrl = apiUrl?.trim()
11
+ ? normalizeApiUrl(apiUrl.trim())
12
+ : DEFAULT_AGENTPAY_API_URL;
10
13
  const nextConfig = {
11
14
  ...config,
12
15
  agentpay: {
13
16
  ...(config.agentpay ?? {}),
14
17
  apiKey: normalizedApiKey,
15
- ...(normalizedApiUrl ? { apiUrl: normalizedApiUrl } : {}),
18
+ apiUrl: normalizedApiUrl,
16
19
  },
17
20
  };
18
21
  writeConfig(nextConfig);
@@ -21,7 +24,7 @@ export async function init(apiKey, apiUrl) {
21
24
  configPath: getConfigPath(),
22
25
  agentpay: {
23
26
  apiKeyConfigured: true,
24
- apiUrl: normalizedApiUrl ?? null,
27
+ apiUrl: normalizedApiUrl,
25
28
  },
26
29
  });
27
30
  }
@@ -5,8 +5,8 @@ export type LaunchCliOptions = {
5
5
  compact?: boolean;
6
6
  profile?: string;
7
7
  headless?: boolean;
8
+ useProxy?: boolean;
8
9
  proxy?: string;
9
- noProxy?: boolean;
10
10
  };
11
11
  export type LaunchSuccessResult = {
12
12
  success: true;
@@ -1 +1 @@
1
- {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgCH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;IACnB,mBAAmB,EAAE,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,uBAAuB,CAAC;IAC/B,WAAW,EAAE,SAAS,CAAC;IACvB,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAErE,wBAAsB,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgBzF"}
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgCH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;IACnB,mBAAmB,EAAE,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,uBAAuB,CAAC;IAC/B,WAAW,EAAE,SAAS,CAAC;IACvB,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAErE,wBAAsB,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAazF"}
@@ -20,49 +20,52 @@ const COMPACT_WINDOW = {
20
20
  export async function launch(url, opts) {
21
21
  const existingSession = loadSession();
22
22
  pruneLocalRunsBestEffort('launch', existingSession?.activeRunId);
23
- const cleanupFailure = await cleanupOwnedSession(existingSession);
24
- if (cleanupFailure) {
25
- return cleanupFailure;
26
- }
23
+ await cleanupOwnedSession(existingSession);
27
24
  const compact = opts?.compact ?? true;
28
25
  const profileName = opts?.profile ?? DEFAULT_PROFILE;
29
26
  const headless = opts?.headless ?? false;
27
+ const useProxy = opts?.useProxy ?? false;
30
28
  const proxyOverride = opts?.proxy;
31
- const noProxy = opts?.noProxy ?? false;
32
- return launchManaged(url, profileName, headless, compact, proxyOverride, noProxy);
29
+ return launchManaged(url, profileName, headless, compact, useProxy, proxyOverride);
33
30
  }
34
31
  async function cleanupOwnedSession(existingSession) {
35
32
  const excludePids = new Set();
36
- const workflowCleanupFailure = await cleanupPreviousWorkflowState(existingSession);
37
- if (workflowCleanupFailure) {
38
- return workflowCleanupFailure;
39
- }
33
+ await cleanupPreviousWorkflowState(existingSession);
40
34
  if (isOwnedSession(existingSession)) {
41
35
  excludePids.add(existingSession.pid);
42
- if (await isSessionAlive(existingSession)) {
43
- const closeResult = await closeOwnedBrowser(existingSession);
44
- if (!closeResult.success) {
45
- return buildLaunchFailure(new Error(closeResult.reason));
36
+ try {
37
+ if (await isSessionAlive(existingSession)) {
38
+ const closeResult = await closeOwnedBrowser(existingSession);
39
+ if (!closeResult.success) {
40
+ info(`[launch] previous managed browser close failed before relaunch: ${closeResult.reason}; continuing with fresh launch attempt`);
41
+ }
42
+ }
43
+ else {
44
+ info(`[launch] previous managed browser pid ${existingSession.pid} was already gone; closing active workflow context before relaunch`);
46
45
  }
47
46
  }
48
- else {
49
- info(`[launch] previous managed browser pid ${existingSession.pid} was already gone; closing active workflow context before relaunch`);
47
+ catch (error) {
48
+ info(`[launch] previous managed browser cleanup failed before relaunch: ${formatUnknownError(error)}; continuing with fresh launch attempt`);
50
49
  }
51
50
  }
52
51
  // Phase-1 ownership removed port-global prekill, so launch needs a second guardrail
53
52
  // for crashes that happen before a session record is persisted or cleaned up.
54
- const orphanCleanup = await cleanupManagedBrowserPids({ excludePids });
55
- if (orphanCleanup.blocked.length > 0) {
56
- return buildLaunchFailure(new Error(`Orphaned managed browser pid${orphanCleanup.blocked.length === 1 ? '' : 's'} ${orphanCleanup.blocked.join(', ')} did not exit after SIGTERM/SIGKILL.`));
53
+ try {
54
+ const orphanCleanup = await cleanupManagedBrowserPids({ excludePids });
55
+ if (orphanCleanup.blocked.length > 0) {
56
+ info(`[launch] orphaned managed browser pid${orphanCleanup.blocked.length === 1 ? '' : 's'} ${orphanCleanup.blocked.join(', ')} remained alive before relaunch; continuing with fresh launch attempt`);
57
+ }
58
+ if (orphanCleanup.terminated.length > 0) {
59
+ info(`[launch] cleaned up orphaned managed browser pid${orphanCleanup.terminated.length === 1 ? '' : 's'} ${orphanCleanup.terminated.join(', ')}`);
60
+ }
57
61
  }
58
- if (orphanCleanup.terminated.length > 0) {
59
- info(`[launch] cleaned up orphaned managed browser pid${orphanCleanup.terminated.length === 1 ? '' : 's'} ${orphanCleanup.terminated.join(', ')}`);
62
+ catch (error) {
63
+ info(`[launch] orphaned managed browser cleanup failed before relaunch: ${formatUnknownError(error)}; continuing with fresh launch attempt`);
60
64
  }
61
- return null;
62
65
  }
63
66
  async function cleanupPreviousWorkflowState(existingSession) {
64
67
  if (!existingSession) {
65
- return null;
68
+ return;
66
69
  }
67
70
  if (existingSession.intentSessionId) {
68
71
  const remoteCompletion = await completeWorkflowSessionRemote({
@@ -80,10 +83,12 @@ async function cleanupPreviousWorkflowState(existingSession) {
80
83
  if (!remoteCompletion.success) {
81
84
  if (isStaleWorkflowBindingFailure(remoteCompletion.error)) {
82
85
  info(`[launch] clearing stale workflow binding before relaunch: ${remoteCompletion.reason}`);
83
- deleteStaleRunBestEffort('launch', existingSession.activeRunId);
86
+ if (remoteCompletion.error === 'workflow_run_unavailable') {
87
+ deleteStaleRunBestEffort('launch', existingSession.activeRunId);
88
+ }
84
89
  }
85
90
  else {
86
- return buildLaunchFailure(new Error(`Active workflow session cleanup blocked relaunch: ${remoteCompletion.reason}`));
91
+ info(`[launch] active workflow session cleanup failed before relaunch: ${remoteCompletion.reason}; continuing with forced local reset`);
87
92
  }
88
93
  }
89
94
  }
@@ -97,10 +102,12 @@ async function cleanupPreviousWorkflowState(existingSession) {
97
102
  },
98
103
  });
99
104
  persistClearedWorkflowStateBestEffort('launch', existingSession);
100
- return null;
101
105
  }
102
106
  function isStaleWorkflowBindingFailure(error) {
103
- return error === 'workflow_run_unavailable' || error === 'workflow_step_unavailable';
107
+ return (error === 'workflow_session_unavailable' ||
108
+ error === 'workflow_session_already_closed' ||
109
+ error === 'workflow_run_unavailable' ||
110
+ error === 'workflow_step_unavailable');
104
111
  }
105
112
  function pruneLocalRunsBestEffort(command, activeRunId) {
106
113
  try {
@@ -158,7 +165,7 @@ function buildLaunchFailure(err) {
158
165
  reason: formatUnknownError(err),
159
166
  };
160
167
  }
161
- async function launchManaged(url, profileName, headless, compact, proxyOverride, noProxy = false) {
168
+ async function launchManaged(url, profileName, headless, compact, useProxy = false, proxyOverride) {
162
169
  let session;
163
170
  let browser = null;
164
171
  let runtimeProxy;
@@ -166,10 +173,9 @@ async function launchManaged(url, profileName, headless, compact, proxyOverride,
166
173
  const baseProfile = ensureProfile(profileName);
167
174
  const config = readConfig();
168
175
  runtimeProxy = resolveLaunchProxy({
169
- profileProxy: baseProfile.fingerprint.proxy,
170
176
  configProxy: config.defaults?.proxy,
177
+ useProxy,
171
178
  cliProxy: proxyOverride,
172
- noProxy,
173
179
  });
174
180
  const profile = withLaunchProxy(baseProfile, runtimeProxy);
175
181
  const gateway = tryResolveAgentpayGatewayConfig();
@@ -255,7 +261,7 @@ function formatUnknownError(err) {
255
261
  return String(err);
256
262
  }
257
263
  function resolveLaunchProxy(options) {
258
- if (options.noProxy) {
264
+ if (!options.useProxy) {
259
265
  return undefined;
260
266
  }
261
267
  if (options.cliProxy) {
@@ -264,10 +270,7 @@ function resolveLaunchProxy(options) {
264
270
  if (options.configProxy) {
265
271
  return normalizeProxySetting(options.configProxy);
266
272
  }
267
- if (options.profileProxy) {
268
- return normalizeProxySetting(options.profileProxy);
269
- }
270
- return undefined;
273
+ throw new Error('Proxy launch requested but no proxy is configured. Pass `--proxy <url>` or set defaults.proxy in ~/.agentpay/config.json.');
271
274
  }
272
275
  function withLaunchProxy(profile, proxy) {
273
276
  return {
@@ -21,6 +21,7 @@ export type GoalObserveTargetCandidate = DomObservedTarget & {
21
21
  goalTargetKey: string;
22
22
  };
23
23
  export type GoalObserveInventoryCandidate = GoalObserveTargetCandidate | GoalObserveScopeCandidate;
24
+ type AgentFacingTargetValidationEvidence = Omit<TargetValidationEvidence, 'required'>;
24
25
  type ExpandWorkflowGraphTargetOptions = {
25
26
  selectedSurfaceIds?: ReadonlySet<string>;
26
27
  };
@@ -34,7 +35,7 @@ export declare function compactTargets(targets: ReadonlyArray<Pick<TargetDescrip
34
35
  inputName?: string;
35
36
  inputType?: string;
36
37
  autocomplete?: string;
37
- validation?: TargetValidationEvidence;
38
+ validation?: AgentFacingTargetValidationEvidence;
38
39
  context?: string;
39
40
  state?: Record<string, string | boolean | number>;
40
41
  structure?: TargetDescriptor['structure'];
@@ -1 +1 @@
1
- {"version":3,"file":"observe-projection.d.ts","sourceRoot":"","sources":["../../src/commands/observe-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAY/D,MAAM,MAAM,yBAAyB,GAAG;IACtC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,iBAAiB,GAAG;IAC3D,iBAAiB,EAAE,QAAQ,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,0BAA0B,GAAG,yBAAyB,CAAC;AAuKnG,KAAK,gCAAgC,GAAG;IACtC,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC5C,eAAe,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACjD,OAAO,GAAE,gCAAqC,GAC7C,iBAAiB,EAAE,CA2IrB;AA0HD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,CACpB,IAAI,CACF,gBAAgB,EACd,KAAK,GACL,MAAM,GACN,OAAO,GACP,cAAc,GACd,aAAa,GACb,WAAW,GACX,WAAW,GACX,cAAc,GACd,YAAY,GACZ,SAAS,GACT,WAAW,GACX,WAAW,GACX,YAAY,GACZ,cAAc,GACd,YAAY,CACf,CACF,GACA,KAAK,CAAC;IACP,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;IAClD,SAAS,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,eAAe,GAAG,QAAQ,CAAC;CAC3D,CAAC,CAoBD;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,CACnB,IAAI,CACF,iBAAiB,EACf,KAAK,GACL,MAAM,GACN,OAAO,GACP,cAAc,GACd,kBAAkB,GAClB,kBAAkB,GAClB,YAAY,GACZ,sBAAsB,CACzB,CACF,GACA,KAAK,CAAC;IACP,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,MAAM,EAAE,KAAK,CAAC;CACf,CAAC,CAcD;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,MAAM,EAAE,KAAK,GAAG,WAAW,GAAG,eAAe,GAAG,QAAQ,CAAC;CAC1D,CAAC;AAEF,KAAK,gCAAgC,GAAG;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CACnB,IAAI,CACF,iBAAiB,EACf,KAAK,GACL,MAAM,GACN,OAAO,GACP,cAAc,GACd,kBAAkB,GAClB,kBAAkB,GAClB,sBAAsB,CACzB,CACF,CAAC;IACF,OAAO,EAAE,aAAa,CACpB,IAAI,CACF,gBAAgB,EACd,KAAK,GACL,MAAM,GACN,OAAO,GACP,cAAc,GACd,aAAa,GACb,WAAW,GACX,WAAW,GACX,cAAc,GACd,YAAY,GACZ,SAAS,GACT,WAAW,GACX,WAAW,GACX,YAAY,GACZ,cAAc,GACd,YAAY,CACf,CACF,CAAC;CACH,CAAC;AAQF,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,gCAAgC,GACxC,oBAAoB,EAAE,CAwExB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC;IACvF,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,KAAK,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,yBAAyB,CAAC;KACvC,CAAC,CAAC;IACH,sBAAsB,EAAE,KAAK,CAAC;QAC5B,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC3C,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC,CAAC;CACJ,CAAC,CAwBD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC;IAChF,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,KAAK,CAAC;CACf,CAAC,CAOD;AAED,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACzC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,GACtD,6BAA6B,EAAE,CAkEjC;AAcD,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC5C,kBAAkB,EAAE,aAAa,CAAC,6BAA6B,CAAC,GAC/D;IACD,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACjC,CAkDA;AAED,wBAAgB,4BAA4B,CAC1C,gBAAgB,EAAE,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC,EACrE,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,EACvC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,GAAG,CAAC,MAAM,CAAC,CAkBb;AAED,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC5C,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACjD,eAAe,EAAE,aAAa,CAAC,iBAAiB,CAAC,GAChD,gBAAgB,EAAE,CAiCpB"}
1
+ {"version":3,"file":"observe-projection.d.ts","sourceRoot":"","sources":["../../src/commands/observe-projection.ts"],"names":[],"mappings":"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"}
@@ -67,6 +67,17 @@ function selectedSurfaceSelectorsOf(selectedTargets) {
67
67
  }
68
68
  return selectors;
69
69
  }
70
+ function compactValidationEvidence(validation) {
71
+ if (!validation) {
72
+ return undefined;
73
+ }
74
+ const compacted = {
75
+ invalid: validation.invalid,
76
+ message: validation.message,
77
+ errorStyling: validation.errorStyling,
78
+ };
79
+ return Object.values(compacted).some((value) => value !== undefined) ? compacted : undefined;
80
+ }
70
81
  function selectedSurfaceRefsOf(selectedTargets) {
71
82
  return new Set(selectedTargets
72
83
  .map((target) => target.surfaceRef?.trim())
@@ -325,7 +336,7 @@ export function compactTargets(targets) {
325
336
  inputName: target.inputName,
326
337
  inputType: target.inputType,
327
338
  autocomplete: target.autocomplete,
328
- validation: target.validation,
339
+ validation: compactValidationEvidence(target.validation),
329
340
  context: summarizeContext(target.context),
330
341
  state: target.semantics?.states,
331
342
  structure: target.structure,
@@ -1 +1 @@
1
- {"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AA+DnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AA0G/D,eAAO,MAAM,yBAAyB;;;;iBAwZtB,CAAC;gBAAwB,CAAC;;;;;CAxZ2B,CAAC;AACtE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGrC,CAAC;AAEF,wBAAsB,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ezF"}
1
+ {"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AA+DnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAwJ/D,eAAO,MAAM,yBAAyB;;;;iBAkXrB,CAAC;gBAAwB,CAAC;;;;;CAlX0B,CAAC;AACtE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGrC,CAAC;AAEF,wBAAsB,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8XzF"}