@nuanu-ai/agentbrowse 0.2.47 → 0.2.49

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 (198) hide show
  1. package/README.md +81 -10
  2. package/dist/agentpay-gateway.d.ts +9 -0
  3. package/dist/agentpay-gateway.d.ts.map +1 -1
  4. package/dist/agentpay-gateway.js +31 -1
  5. package/dist/agentpay-stagehand-llm.d.ts.map +1 -1
  6. package/dist/agentpay-stagehand-llm.js +9 -1
  7. package/dist/command-api-tracing.d.ts +19 -0
  8. package/dist/command-api-tracing.d.ts.map +1 -0
  9. package/dist/command-api-tracing.js +137 -0
  10. package/dist/commands/act.d.ts.map +1 -1
  11. package/dist/commands/act.js +822 -670
  12. package/dist/commands/act.test-harness.d.ts +6 -0
  13. package/dist/commands/act.test-harness.d.ts.map +1 -1
  14. package/dist/commands/act.test-harness.js +44 -1
  15. package/dist/commands/action-acceptance.d.ts.map +1 -1
  16. package/dist/commands/action-acceptance.js +115 -0
  17. package/dist/commands/captcha-solve.d.ts.map +1 -1
  18. package/dist/commands/captcha-solve.js +83 -16
  19. package/dist/commands/click-action-executor.d.ts +0 -1
  20. package/dist/commands/click-action-executor.d.ts.map +1 -1
  21. package/dist/commands/click-action-executor.js +31 -77
  22. package/dist/commands/close.d.ts +3 -3
  23. package/dist/commands/close.d.ts.map +1 -1
  24. package/dist/commands/close.js +178 -0
  25. package/dist/commands/descriptor-validation.d.ts.map +1 -1
  26. package/dist/commands/descriptor-validation.js +75 -57
  27. package/dist/commands/end-session.d.ts +25 -0
  28. package/dist/commands/end-session.d.ts.map +1 -0
  29. package/dist/commands/end-session.js +161 -0
  30. package/dist/commands/extract-stagehand-executor.js +1 -1
  31. package/dist/commands/extract.d.ts.map +1 -1
  32. package/dist/commands/extract.js +339 -202
  33. package/dist/commands/fill-secret.d.ts +3 -3
  34. package/dist/commands/fill-secret.d.ts.map +1 -1
  35. package/dist/commands/fill-secret.js +419 -234
  36. package/dist/commands/get-secrets-catalog.d.ts.map +1 -1
  37. package/dist/commands/get-secrets-catalog.js +66 -5
  38. package/dist/commands/init.d.ts.map +1 -1
  39. package/dist/commands/init.js +6 -3
  40. package/dist/commands/interaction-kernel.d.ts +46 -0
  41. package/dist/commands/interaction-kernel.d.ts.map +1 -0
  42. package/dist/commands/interaction-kernel.js +215 -0
  43. package/dist/commands/launch.d.ts +1 -3
  44. package/dist/commands/launch.d.ts.map +1 -1
  45. package/dist/commands/launch.js +115 -27
  46. package/dist/commands/navigate.d.ts.map +1 -1
  47. package/dist/commands/navigate.js +188 -45
  48. package/dist/commands/observe-accessibility.d.ts.map +1 -1
  49. package/dist/commands/observe-accessibility.js +46 -39
  50. package/dist/commands/observe-dom-label-contract.d.ts.map +1 -1
  51. package/dist/commands/observe-dom-label-contract.js +5 -0
  52. package/dist/commands/observe-inventory.d.ts +13 -0
  53. package/dist/commands/observe-inventory.d.ts.map +1 -1
  54. package/dist/commands/observe-inventory.js +320 -65
  55. package/dist/commands/observe-persistence.d.ts.map +1 -1
  56. package/dist/commands/observe-persistence.js +3 -0
  57. package/dist/commands/observe-projection.d.ts +1 -0
  58. package/dist/commands/observe-projection.d.ts.map +1 -1
  59. package/dist/commands/observe-projection.js +7 -2
  60. package/dist/commands/observe-protected.d.ts +1 -0
  61. package/dist/commands/observe-protected.d.ts.map +1 -1
  62. package/dist/commands/observe-protected.js +9 -4
  63. package/dist/commands/observe-semantics.d.ts.map +1 -1
  64. package/dist/commands/observe-semantics.js +5 -2
  65. package/dist/commands/observe-stagehand.d.ts +1 -0
  66. package/dist/commands/observe-stagehand.d.ts.map +1 -1
  67. package/dist/commands/observe-stagehand.js +2 -0
  68. package/dist/commands/observe.d.ts +2 -0
  69. package/dist/commands/observe.d.ts.map +1 -1
  70. package/dist/commands/observe.js +387 -203
  71. package/dist/commands/observe.test-harness.d.ts +8 -0
  72. package/dist/commands/observe.test-harness.d.ts.map +1 -1
  73. package/dist/commands/observe.test-harness.js +48 -1
  74. package/dist/commands/poll-secret.d.ts +6 -0
  75. package/dist/commands/poll-secret.d.ts.map +1 -0
  76. package/dist/commands/poll-secret.js +159 -0
  77. package/dist/commands/request-secret.d.ts +6 -0
  78. package/dist/commands/request-secret.d.ts.map +1 -0
  79. package/dist/commands/request-secret.js +284 -0
  80. package/dist/commands/screenshot.d.ts.map +1 -1
  81. package/dist/commands/screenshot.js +172 -7
  82. package/dist/commands/select-action-executor.d.ts.map +1 -1
  83. package/dist/commands/semantic-observe.d.ts +4 -0
  84. package/dist/commands/semantic-observe.d.ts.map +1 -1
  85. package/dist/commands/semantic-observe.js +388 -17
  86. package/dist/commands/start-session.d.ts +31 -0
  87. package/dist/commands/start-session.d.ts.map +1 -0
  88. package/dist/commands/start-session.js +347 -0
  89. package/dist/commands/status.d.ts +2 -1
  90. package/dist/commands/status.d.ts.map +1 -1
  91. package/dist/commands/status.js +166 -144
  92. package/dist/control-semantics.d.ts +1 -0
  93. package/dist/control-semantics.d.ts.map +1 -1
  94. package/dist/control-semantics.js +51 -9
  95. package/dist/generated/build-config.d.ts +2 -0
  96. package/dist/generated/build-config.d.ts.map +1 -0
  97. package/dist/generated/build-config.js +2 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +163 -63
  100. package/dist/otel-exporter.d.ts +58 -0
  101. package/dist/otel-exporter.d.ts.map +1 -0
  102. package/dist/otel-exporter.js +263 -0
  103. package/dist/otel-projector.d.ts +75 -0
  104. package/dist/otel-projector.d.ts.map +1 -0
  105. package/dist/otel-projector.js +409 -0
  106. package/dist/owned-browser.d.ts +1 -1
  107. package/dist/owned-browser.d.ts.map +1 -1
  108. package/dist/owned-browser.js +13 -1
  109. package/dist/owned-process.d.ts +2 -0
  110. package/dist/owned-process.d.ts.map +1 -1
  111. package/dist/owned-process.js +7 -3
  112. package/dist/playwright-runtime.d.ts +1 -1
  113. package/dist/playwright-runtime.d.ts.map +1 -1
  114. package/dist/playwright-runtime.js +8 -8
  115. package/dist/run-observability.d.ts +25 -0
  116. package/dist/run-observability.d.ts.map +1 -0
  117. package/dist/run-observability.js +115 -0
  118. package/dist/run-store.d.ts +274 -0
  119. package/dist/run-store.d.ts.map +1 -0
  120. package/dist/run-store.js +631 -0
  121. package/dist/runtime-metrics.d.ts +27 -0
  122. package/dist/runtime-metrics.d.ts.map +1 -0
  123. package/dist/runtime-metrics.js +66 -0
  124. package/dist/runtime-page-state.d.ts +11 -0
  125. package/dist/runtime-page-state.d.ts.map +1 -0
  126. package/dist/runtime-page-state.js +62 -0
  127. package/dist/runtime-protected-state.d.ts +16 -0
  128. package/dist/runtime-protected-state.d.ts.map +1 -0
  129. package/dist/runtime-protected-state.js +157 -0
  130. package/dist/runtime-state.d.ts +10 -44
  131. package/dist/runtime-state.d.ts.map +1 -1
  132. package/dist/runtime-state.js +57 -222
  133. package/dist/secrets/backend.d.ts +65 -16
  134. package/dist/secrets/backend.d.ts.map +1 -1
  135. package/dist/secrets/backend.js +135 -95
  136. package/dist/secrets/catalog-sync.d.ts.map +1 -1
  137. package/dist/secrets/catalog-sync.js +4 -1
  138. package/dist/secrets/form-matcher.d.ts +5 -5
  139. package/dist/secrets/form-matcher.d.ts.map +1 -1
  140. package/dist/secrets/form-matcher.js +292 -164
  141. package/dist/secrets/intent-output.d.ts +6 -10
  142. package/dist/secrets/intent-output.d.ts.map +1 -1
  143. package/dist/secrets/intent-output.js +4 -58
  144. package/dist/secrets/mock-agentpay-cabinet.d.ts +38 -27
  145. package/dist/secrets/mock-agentpay-cabinet.d.ts.map +1 -1
  146. package/dist/secrets/mock-agentpay-cabinet.js +177 -111
  147. package/dist/secrets/protected-artifact-guard.d.ts +2 -2
  148. package/dist/secrets/protected-artifact-guard.d.ts.map +1 -1
  149. package/dist/secrets/protected-artifact-guard.js +2 -2
  150. package/dist/secrets/protected-bindings.d.ts +1 -1
  151. package/dist/secrets/protected-bindings.d.ts.map +1 -1
  152. package/dist/secrets/protected-bindings.js +6 -0
  153. package/dist/secrets/protected-field-semantics.d.ts +9 -0
  154. package/dist/secrets/protected-field-semantics.d.ts.map +1 -0
  155. package/dist/secrets/protected-field-semantics.js +154 -0
  156. package/dist/secrets/protected-field-values.d.ts.map +1 -1
  157. package/dist/secrets/protected-field-values.js +3 -3
  158. package/dist/secrets/protected-fill.d.ts +1 -1
  159. package/dist/secrets/protected-fill.d.ts.map +1 -1
  160. package/dist/secrets/protected-fill.js +45 -149
  161. package/dist/secrets/protected-value-adapters.d.ts +2 -1
  162. package/dist/secrets/protected-value-adapters.d.ts.map +1 -1
  163. package/dist/secrets/protected-value-adapters.js +80 -1
  164. package/dist/secrets/request-output.d.ts +11 -0
  165. package/dist/secrets/request-output.d.ts.map +1 -0
  166. package/dist/secrets/request-output.js +75 -0
  167. package/dist/secrets/types.d.ts +15 -9
  168. package/dist/secrets/types.d.ts.map +1 -1
  169. package/dist/secrets/types.js +3 -0
  170. package/dist/session-event-exporter.d.ts +36 -0
  171. package/dist/session-event-exporter.d.ts.map +1 -0
  172. package/dist/session-event-exporter.js +428 -0
  173. package/dist/session.d.ts +16 -7
  174. package/dist/session.d.ts.map +1 -1
  175. package/dist/session.js +150 -23
  176. package/dist/sessions-backend.d.ts +354 -0
  177. package/dist/sessions-backend.d.ts.map +1 -0
  178. package/dist/sessions-backend.js +126 -0
  179. package/dist/solver/browser-launcher.d.ts +1 -1
  180. package/dist/solver/browser-launcher.d.ts.map +1 -1
  181. package/dist/solver/browser-launcher.js +39 -13
  182. package/dist/solver/captcha-solver.d.ts.map +1 -1
  183. package/dist/solver/captcha-solver.js +8 -1
  184. package/dist/solver/config.d.ts +0 -1
  185. package/dist/solver/config.d.ts.map +1 -1
  186. package/dist/solver/config.js +0 -22
  187. package/dist/solver/types.d.ts +1 -0
  188. package/dist/solver/types.d.ts.map +1 -1
  189. package/dist/workflow-session-completion.d.ts +33 -0
  190. package/dist/workflow-session-completion.d.ts.map +1 -0
  191. package/dist/workflow-session-completion.js +156 -0
  192. package/package.json +11 -1
  193. package/dist/commands/create-intent.d.ts +0 -6
  194. package/dist/commands/create-intent.d.ts.map +0 -1
  195. package/dist/commands/create-intent.js +0 -75
  196. package/dist/commands/poll-intent.d.ts +0 -6
  197. package/dist/commands/poll-intent.d.ts.map +0 -1
  198. package/dist/commands/poll-intent.js +0 -57
@@ -0,0 +1,154 @@
1
+ import { inferComparableValueTypeFromFacts } from '../control-semantics.js';
2
+ const LOGIN_USERNAME_SIGNAL_RE = /\b(email|e-mail|username|user name|login|account(?: email| name)?|member(?: email| name| id)?)\b/i;
3
+ const LOGIN_PASSWORD_SIGNAL_RE = /\b(password|passcode|pass word)\b/i;
4
+ const PAYMENT_CARD_NAME_SIGNAL_RE = /\b(cardholder|card holder|name on card|cardholder name|full name)\b/i;
5
+ const PAYMENT_CARD_PAN_SIGNAL_RE = /\b(card number|card no|cc-number|cc number)\b/i;
6
+ const PAYMENT_CARD_EXP_SIGNAL_RE = /\b(expiration|expiry|exp(?:iry)? date|exp date|mm\s*\/\s*yy|mmyy|mm\/yy)\b/i;
7
+ const PAYMENT_CARD_CVV_SIGNAL_RE = /\b(security code|cvv|cvc)\b/i;
8
+ const IDENTITY_DOCUMENT_SIGNAL_RE = /\b(passport|document(?: number| no)?|id(?: number| no)?|identity(?: number)?)\b/i;
9
+ const IDENTITY_BIRTH_SIGNAL_RE = /\b(date of birth|birth date|dob)\b/i;
10
+ const IDENTITY_NATIONALITY_SIGNAL_RE = /\b(nationality|citizenship)\b/i;
11
+ const IDENTITY_ISSUING_COUNTRY_SIGNAL_RE = /\b(issuing country|country of issue|country\/region of issue|issuing state)\b/i;
12
+ const IDENTITY_ISSUE_DATE_SIGNAL_RE = /\b(issue date|date of issue)\b/i;
13
+ const IDENTITY_EXPIRY_DATE_SIGNAL_RE = /\b(expiry date|expiration date|date of expiry)\b/i;
14
+ function normalizeText(value) {
15
+ return value?.replace(/\s+/g, ' ').trim().toLowerCase() ?? '';
16
+ }
17
+ function directFieldSignals(target) {
18
+ const values = new Set();
19
+ const push = (value) => {
20
+ const normalized = normalizeText(value);
21
+ if (normalized) {
22
+ values.add(normalized);
23
+ }
24
+ };
25
+ push(target.label);
26
+ push(target.displayLabel);
27
+ push(target.placeholder);
28
+ push(target.inputName);
29
+ push(target.inputType);
30
+ push(target.autocomplete);
31
+ push(target.semantics?.name);
32
+ return [...values];
33
+ }
34
+ function uniqueMeaningHints(hints) {
35
+ const seen = new Set();
36
+ const result = [];
37
+ for (const hint of hints) {
38
+ const key = `${hint.kind}:${hint.fieldKey}:${hint.valueHint}`;
39
+ if (seen.has(key)) {
40
+ continue;
41
+ }
42
+ seen.add(key);
43
+ result.push(hint);
44
+ }
45
+ return result;
46
+ }
47
+ export function inferProtectedFieldMeaningFromTarget(target) {
48
+ const autocomplete = normalizeText(target.autocomplete);
49
+ const inputType = normalizeText(target.inputType);
50
+ const inputName = normalizeText(target.inputName);
51
+ const signals = directFieldSignals(target);
52
+ const comparableValueType = inferComparableValueTypeFromFacts({
53
+ kind: target.kind,
54
+ role: target.semantics?.role,
55
+ label: target.label,
56
+ displayLabel: target.displayLabel,
57
+ placeholder: target.placeholder,
58
+ inputName: target.inputName,
59
+ inputType: target.inputType,
60
+ autocomplete: target.autocomplete,
61
+ states: target.semantics?.states,
62
+ structure: target.structure,
63
+ });
64
+ const hints = [];
65
+ if (autocomplete.includes('username') ||
66
+ autocomplete.includes('email') ||
67
+ inputType === 'email' ||
68
+ /\b(user(name)?|login|email|account)\b/.test(inputName) ||
69
+ signals.some((signal) => LOGIN_USERNAME_SIGNAL_RE.test(signal))) {
70
+ hints.push({ kind: 'login', fieldKey: 'username', valueHint: 'direct' });
71
+ }
72
+ if (autocomplete.includes('current-password') ||
73
+ inputType === 'password' ||
74
+ /\bpassword\b/.test(inputName) ||
75
+ signals.some((signal) => LOGIN_PASSWORD_SIGNAL_RE.test(signal))) {
76
+ hints.push({ kind: 'login', fieldKey: 'password', valueHint: 'direct' });
77
+ }
78
+ if (autocomplete.includes('cc-number') || comparableValueType === 'card-number') {
79
+ hints.push({ kind: 'payment_card', fieldKey: 'pan', valueHint: 'direct' });
80
+ }
81
+ else if (/\b(card[-_ ]?number|cardnumber|cc-?number)\b/.test(inputName) ||
82
+ signals.some((signal) => PAYMENT_CARD_PAN_SIGNAL_RE.test(signal))) {
83
+ hints.push({ kind: 'payment_card', fieldKey: 'pan', valueHint: 'direct' });
84
+ }
85
+ if (autocomplete.includes('cc-exp') || comparableValueType === 'expiry') {
86
+ hints.push({ kind: 'payment_card', fieldKey: 'exp_month', valueHint: 'direct' });
87
+ hints.push({ kind: 'payment_card', fieldKey: 'exp_year', valueHint: 'direct' });
88
+ }
89
+ else if (/\b(exp|expiry|expiration)\b/.test(inputName) ||
90
+ signals.some((signal) => PAYMENT_CARD_EXP_SIGNAL_RE.test(signal))) {
91
+ hints.push({ kind: 'payment_card', fieldKey: 'exp_month', valueHint: 'direct' });
92
+ hints.push({ kind: 'payment_card', fieldKey: 'exp_year', valueHint: 'direct' });
93
+ }
94
+ if (autocomplete.includes('cc-csc') || comparableValueType === 'cvc') {
95
+ hints.push({ kind: 'payment_card', fieldKey: 'cvv', valueHint: 'direct' });
96
+ }
97
+ else if (/\b(cvv|cvc|security)\b/.test(inputName) ||
98
+ signals.some((signal) => PAYMENT_CARD_CVV_SIGNAL_RE.test(signal))) {
99
+ hints.push({ kind: 'payment_card', fieldKey: 'cvv', valueHint: 'direct' });
100
+ }
101
+ if (autocomplete.includes('cc-name') ||
102
+ /\b(cardholder|card-holder|cc-name)\b/.test(inputName) ||
103
+ signals.some((signal) => PAYMENT_CARD_NAME_SIGNAL_RE.test(signal))) {
104
+ hints.push({ kind: 'payment_card', fieldKey: 'cardholder', valueHint: 'direct' });
105
+ }
106
+ if (autocomplete.includes('given-name')) {
107
+ hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'full_name.given' });
108
+ }
109
+ if (autocomplete.includes('family-name')) {
110
+ hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'full_name.family' });
111
+ }
112
+ if (autocomplete === 'name' ||
113
+ /\bfull_?name\b/.test(inputName) ||
114
+ signals.some((signal) => /\bfull name\b/.test(signal))) {
115
+ hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'direct' });
116
+ }
117
+ if (/\b(first|given|forename)_?name\b/.test(inputName) ||
118
+ signals.some((signal) => /\b(first name|given name|forename)\b/.test(signal))) {
119
+ hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'full_name.given' });
120
+ }
121
+ if (/\b(last|family|surname)_?name\b/.test(inputName) ||
122
+ signals.some((signal) => /\b(last name|family name|surname)\b/.test(signal))) {
123
+ hints.push({ kind: 'identity', fieldKey: 'full_name', valueHint: 'full_name.family' });
124
+ }
125
+ if (autocomplete.includes('bday') ||
126
+ (comparableValueType === 'date' &&
127
+ (/\b(date_?of_?birth|birth_?date|dob)\b/.test(inputName) ||
128
+ signals.some((signal) => IDENTITY_BIRTH_SIGNAL_RE.test(signal))))) {
129
+ hints.push({ kind: 'identity', fieldKey: 'date_of_birth', valueHint: 'direct' });
130
+ }
131
+ if (/\b(passport|document|identity|id)(?:_?number|_?no)?\b/.test(inputName) ||
132
+ signals.some((signal) => IDENTITY_DOCUMENT_SIGNAL_RE.test(signal))) {
133
+ hints.push({ kind: 'identity', fieldKey: 'document_number', valueHint: 'direct' });
134
+ }
135
+ if (/\b(nationality|citizenship)\b/.test(inputName) ||
136
+ signals.some((signal) => IDENTITY_NATIONALITY_SIGNAL_RE.test(signal))) {
137
+ hints.push({ kind: 'identity', fieldKey: 'nationality', valueHint: 'direct' });
138
+ }
139
+ if (/\b(issuing_?country|country_?of_?issue|issuing_?state)\b/.test(inputName) ||
140
+ signals.some((signal) => IDENTITY_ISSUING_COUNTRY_SIGNAL_RE.test(signal))) {
141
+ hints.push({ kind: 'identity', fieldKey: 'issuing_country', valueHint: 'direct' });
142
+ }
143
+ if (comparableValueType === 'date' &&
144
+ (/\b(issue(?:_?date)?)\b/.test(inputName) ||
145
+ signals.some((signal) => IDENTITY_ISSUE_DATE_SIGNAL_RE.test(signal)))) {
146
+ hints.push({ kind: 'identity', fieldKey: 'issue_date', valueHint: 'direct' });
147
+ }
148
+ if (comparableValueType === 'date' &&
149
+ (/\b(expiry|expiration)(?:_?date)?\b/.test(inputName) ||
150
+ signals.some((signal) => IDENTITY_EXPIRY_DATE_SIGNAL_RE.test(signal)))) {
151
+ hints.push({ kind: 'identity', fieldKey: 'expiry_date', valueHint: 'direct' });
152
+ }
153
+ return uniqueMeaningHints(hints);
154
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"protected-field-values.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-field-values.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAyDtF,wBAAsB,mCAAmC,CAAC,MAAM,EAAE;IAChE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;QACtB,OAAO,EAAE,wBAAwB,CAAC;QAClC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;KACjC,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA4G/B"}
1
+ {"version":3,"file":"protected-field-values.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-field-values.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAyDtF,wBAAsB,mCAAmC,CAAC,MAAM,EAAE;IAChE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;QACtB,OAAO,EAAE,wBAAwB,CAAC;QAClC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;KACjC,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6G/B"}
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { AgentpayStagehandLlmClient } from '../agentpay-stagehand-llm.js';
3
3
  import { tryResolveAgentpayGatewayConfig } from '../agentpay-gateway.js';
4
- import { recordLlmUsage, recordPayloadBudget } from '../runtime-state.js';
4
+ import { recordLlmUsage, recordPayloadBudget } from '../runtime-metrics.js';
5
5
  import { resolveProtectedFieldPolicy } from './field-policy.js';
6
6
  import { resolveDeterministicProtectedBindingValue } from './protected-value-adapters.js';
7
7
  import { protectedBindingKey, protectedBindingValueHintSchema } from './protected-bindings.js';
@@ -56,8 +56,8 @@ export async function resolveAssistedProtectedFieldValues(params) {
56
56
  return new Map();
57
57
  }
58
58
  const resolvedValues = new Map();
59
- const unresolvedBindings = assistedBindings.filter(({ binding }) => {
60
- const deterministicValue = resolveDeterministicProtectedBindingValue(binding, params.protectedValues);
59
+ const unresolvedBindings = assistedBindings.filter(({ binding, target }) => {
60
+ const deterministicValue = resolveDeterministicProtectedBindingValue(binding, params.protectedValues, target ?? undefined);
61
61
  if (typeof deterministicValue !== 'string' ||
62
62
  deterministicValue.trim().length === 0 ||
63
63
  !canUseDeterministicValueForPolicy(binding, params.fieldPolicies)) {
@@ -41,7 +41,7 @@ export declare function executeProtectedFill(params: {
41
41
  export declare const __testProtectedFill: {
42
42
  actionForTarget: typeof actionForTarget;
43
43
  formatCardExpiry: typeof formatCardExpiry;
44
- resolveBindingValue: (fieldKeys: ReadonlyArray<StoredSecretFieldKey>, protectedValues: Record<string, string>) => string;
44
+ resolveBindingValue: (fieldKeys: ReadonlyArray<StoredSecretFieldKey>, protectedValues: Record<string, string>, target?: TargetDescriptor) => string;
45
45
  };
46
46
  export {};
47
47
  //# sourceMappingURL=protected-fill.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"protected-fill.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-fill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAqBnF,OAAO,KAAK,EAEV,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAGpB,KAAK,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC/D,MAAM,EAAE,4BAA4B,GAAG,mBAAmB,CAAC;IAC3D,sBAAsB,CAAC,EAAE,IAAI,CAAC;CAC/B;AAED,KAAK,2BAA2B,GAC5B,gBAAgB,GAChB,iBAAiB,GACjB,yBAAyB,GACzB,wBAAwB,GACxB,2BAA2B,GAC3B,gBAAgB,CAAC;AAarB,MAAM,MAAM,4BAA4B,GACpC;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,MAAM,EAAE,2BAA2B,CAAC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,GACD;IACE,IAAI,EAAE,mBAAmB,CAAC;IAC1B,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC,GACD;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EACF,yBAAyB,GACzB,mCAAmC,GACnC,sCAAsC,GACtC,kCAAkC,GAClC,eAAe,CAAC;CACrB,CAAC;AAoIN,iBAAS,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,mBAAmB,CActE;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7D;AA2VD,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,YAAY,EAAE,qBAAqB,CAAC;IACpC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C,GAAG,OAAO,CAAC,4BAA4B,CAAC,CA6KxC;AAED,eAAO,MAAM,mBAAmB;;;qCAIjB,aAAa,CAAC,oBAAoB,CAAC,mBAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAY1C,CAAC"}
1
+ {"version":3,"file":"protected-fill.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-fill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAiBnF,OAAO,KAAK,EAEV,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAGpB,KAAK,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC/D,MAAM,EAAE,4BAA4B,GAAG,mBAAmB,CAAC;IAC3D,sBAAsB,CAAC,EAAE,IAAI,CAAC;CAC/B;AAED,KAAK,2BAA2B,GAC5B,gBAAgB,GAChB,iBAAiB,GACjB,yBAAyB,GACzB,wBAAwB,GACxB,2BAA2B,GAC3B,gBAAgB,CAAC;AAarB,MAAM,MAAM,4BAA4B,GACpC;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,MAAM,EAAE,2BAA2B,CAAC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,GACD;IACE,IAAI,EAAE,mBAAmB,CAAC;IAC1B,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC,GACD;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EACF,yBAAyB,GACzB,mCAAmC,GACnC,sCAAsC,GACtC,kCAAkC,GAClC,eAAe,CAAC;CACrB,CAAC;AAEN,iBAAS,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,mBAAmB,CActE;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7D;AAsTD,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,YAAY,EAAE,qBAAqB,CAAC;IACpC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAuLxC;AAED,eAAO,MAAM,mBAAmB;;;qCAIjB,aAAa,CAAC,oBAAoB,CAAC,mBAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAC9B,gBAAgB;CAuB5B,CAAC"}
@@ -1,98 +1,13 @@
1
1
  import { getSurface, getTarget } from '../runtime-state.js';
2
- import { createAcceptanceProbe, rankLocatorCandidates, waitForAcceptanceProbe, } from '../commands/action-acceptance.js';
3
- import { buildLocator, resolveLocatorRoot, } from '../commands/action-fallbacks.js';
2
+ import { createAcceptanceProbe, waitForAcceptanceProbe } from '../commands/action-acceptance.js';
4
3
  import { applyActionWithFallbacks } from '../commands/action-executor.js';
5
4
  import { normalizePageSignature, readLocatorDomSignature, } from '../commands/descriptor-validation.js';
6
- import { resolveSurfaceScopeRoot } from '../commands/target-resolution.js';
5
+ import { assertStoredBindingStillValid, resolvePreparedLocatorCandidates, resolveInteractionRoots, } from '../commands/interaction-kernel.js';
7
6
  import { resolveProtectedFieldPolicy } from './field-policy.js';
8
7
  import { protectedBindingKey } from './protected-bindings.js';
9
8
  import { resolveAssistedProtectedFieldValues } from './protected-field-values.js';
10
9
  import { resolveDeterministicProtectedBindingValue } from './protected-value-adapters.js';
11
10
  import { sortProtectedBindingsForExecution } from './fill-ordering.js';
12
- function targetUsesSurfaceAsPrimaryLocator(target, surface) {
13
- const surfaceCandidateKeys = new Set(surface.locatorCandidates.map((candidate) => [
14
- candidate.strategy,
15
- candidate.name ?? '',
16
- candidate.value,
17
- candidate.attribute ?? '',
18
- candidate.scope ?? '',
19
- ].join(':')));
20
- return target.locatorCandidates.some((candidate) => surfaceCandidateKeys.has([
21
- candidate.strategy,
22
- candidate.name ?? '',
23
- candidate.value,
24
- candidate.attribute ?? '',
25
- candidate.scope ?? '',
26
- ].join(':')));
27
- }
28
- function resolveLocatorRootForCandidate(baseRoot, defaultRoot, surfaceRoot, scope) {
29
- if (scope === 'root') {
30
- return baseRoot;
31
- }
32
- if (scope === 'surface') {
33
- return surfaceRoot;
34
- }
35
- return defaultRoot;
36
- }
37
- async function prepareLocator(locator, action, strategy, attempts, options) {
38
- const count = await locator.count().catch(() => 0);
39
- if (count === 0) {
40
- attempts.push(`resolve.skip:${strategy}:empty`);
41
- return { locator: null };
42
- }
43
- if (count > 1) {
44
- attempts.push(`resolve.skip:${strategy}:ambiguous:${count}`);
45
- return { locator: null };
46
- }
47
- const resolvedLocator = locator.first();
48
- const visible = await resolvedLocator.isVisible().catch(() => false);
49
- if (!visible) {
50
- attempts.push(`resolve.skip:${strategy}:hidden`);
51
- return { locator: null };
52
- }
53
- const disabled = await resolvedLocator.isDisabled?.().catch(() => false);
54
- if (disabled) {
55
- attempts.push(`resolve.skip:${strategy}:disabled`);
56
- return { locator: null, blockedReason: 'disabled' };
57
- }
58
- if (action === 'fill' || action === 'type') {
59
- const editable = await resolvedLocator.isEditable().catch(() => false);
60
- if (!editable) {
61
- const descendants = resolvedLocator.locator('input:not([type="hidden"]), textarea, select, [contenteditable="true"]');
62
- const descendantCount = await descendants.count().catch(() => 0);
63
- const visibleEditableDescendants = [];
64
- for (let index = 0; index < descendantCount; index += 1) {
65
- const descendant = descendants.nth(index);
66
- const descendantVisible = await descendant.isVisible().catch(() => false);
67
- if (!descendantVisible) {
68
- continue;
69
- }
70
- const descendantEditable = await descendant.isEditable().catch(() => false);
71
- if (!descendantEditable) {
72
- continue;
73
- }
74
- visibleEditableDescendants.push(descendant);
75
- }
76
- if (visibleEditableDescendants.length === 1) {
77
- attempts.push(`resolve.descendant-editable:${strategy}`);
78
- return { locator: visibleEditableDescendants[0] ?? null };
79
- }
80
- if (visibleEditableDescendants.length > 1) {
81
- attempts.push(`resolve.skip:${strategy}:descendant-ambiguous:${visibleEditableDescendants.length}`);
82
- return { locator: null };
83
- }
84
- const readonly = await resolvedLocator
85
- .getAttribute?.('readonly')
86
- .then((value) => value !== null)
87
- .catch(() => false);
88
- if (readonly && !options?.allowReadonlyFallback) {
89
- attempts.push(`resolve.skip:${strategy}:readonly`);
90
- return { locator: null, blockedReason: 'readonly' };
91
- }
92
- }
93
- }
94
- return { locator: resolvedLocator };
95
- }
96
11
  function actionForTarget(target) {
97
12
  if (target.controlFamily === 'select') {
98
13
  return 'select';
@@ -113,11 +28,11 @@ function formatCardExpiry(month, year) {
113
28
  const normalizedYear = year.trim().length > 2 ? year.trim().slice(-2) : year.trim().padStart(2, '0');
114
29
  return `${normalizedMonth}/${normalizedYear}`;
115
30
  }
116
- function resolveBindingValue(fields, protectedValues, fieldPolicies, assistedValues) {
31
+ function resolveBindingValue(fields, target, protectedValues, fieldPolicies, assistedValues) {
117
32
  if (fields.length === 1) {
118
33
  const field = fields[0];
119
34
  const policy = resolveProtectedFieldPolicy(fieldPolicies, field.fieldKey);
120
- const deterministicValue = resolveDeterministicProtectedBindingValue(field, protectedValues);
35
+ const deterministicValue = resolveDeterministicProtectedBindingValue(field, protectedValues, target);
121
36
  if (policy === 'llm_assisted') {
122
37
  const assistedValue = assistedValues.get(protectedBindingKey(field));
123
38
  if (typeof assistedValue === 'string' && assistedValue.length > 0) {
@@ -266,52 +181,37 @@ async function prepareBindings(session, page, fillableForm) {
266
181
  };
267
182
  }
268
183
  const surface = target.surfaceRef ? getSurface(session, target.surfaceRef) : null;
269
- const baseRoot = resolveLocatorRoot(page, target.framePath ?? surface?.framePath);
270
- let locatorRoot = baseRoot;
271
- let surfaceRoot = null;
272
- if (surface) {
273
- surfaceRoot = await resolveSurfaceScopeRoot(page, surface, attempts).catch(() => null);
274
- if (surfaceRoot && !targetUsesSurfaceAsPrimaryLocator(target, surface)) {
275
- locatorRoot = surfaceRoot;
276
- }
277
- else if (!surfaceRoot) {
278
- attempts.push('surface.resolve.fallback:page');
279
- }
280
- }
184
+ const { baseRoot, locatorRoot, surfaceRoot } = await resolveInteractionRoots(page, target, surface, attempts);
281
185
  let resolvedLocator = null;
282
186
  let sawDomSignatureMismatch = false;
283
187
  let sawBlockedTarget = false;
284
188
  const action = actionForTarget(target);
285
- for (const candidate of rankLocatorCandidates(target.locatorCandidates, action)) {
286
- const candidateRoot = resolveLocatorRootForCandidate(baseRoot, locatorRoot, surfaceRoot, candidate.scope);
287
- if (!candidateRoot) {
288
- attempts.push(`resolve.skip:${candidate.strategy}:surface-unavailable`);
289
- continue;
290
- }
291
- const locator = buildLocator(candidateRoot, candidate);
292
- if (!locator) {
293
- continue;
294
- }
295
- const prepared = await prepareLocator(locator, action, candidate.strategy, attempts, {
189
+ const resolution = await resolvePreparedLocatorCandidates({
190
+ target,
191
+ action,
192
+ baseRoot,
193
+ locatorRoot,
194
+ surfaceRoot,
195
+ attempts,
196
+ prepareOptions: {
296
197
  allowReadonlyFallback: action === 'fill' && target.controlFamily === 'datepicker',
297
- });
298
- if (prepared.blockedReason === 'disabled' || prepared.blockedReason === 'readonly') {
299
- sawBlockedTarget = true;
300
- }
301
- if (!prepared.locator) {
302
- continue;
303
- }
304
- if (target.domSignature) {
305
- const liveSignature = await readLocatorDomSignature(prepared.locator).catch(() => null);
306
- if (liveSignature && liveSignature !== target.domSignature) {
307
- sawDomSignatureMismatch = true;
308
- attempts.push(`domSignature.mismatch:${candidate.strategy}`);
309
- continue;
198
+ },
199
+ onPreparedLocator: async (preparedLocator, strategy) => {
200
+ if (target.domSignature) {
201
+ const liveSignature = await readLocatorDomSignature(preparedLocator).catch(() => null);
202
+ if (liveSignature && liveSignature !== target.domSignature) {
203
+ sawDomSignatureMismatch = true;
204
+ attempts.push(`domSignature.mismatch:${strategy}`);
205
+ return false;
206
+ }
310
207
  }
311
- }
312
- resolvedLocator = prepared.locator;
313
- attempts.push(`resolve:${candidate.strategy}`);
314
- break;
208
+ resolvedLocator = preparedLocator;
209
+ attempts.push(`resolve:${strategy}`);
210
+ return true;
211
+ },
212
+ });
213
+ if (resolution.sawDisabledTarget || resolution.sawReadonlyTarget) {
214
+ sawBlockedTarget = true;
315
215
  }
316
216
  if (!resolvedLocator) {
317
217
  return {
@@ -339,22 +239,6 @@ async function prepareBindings(session, page, fillableForm) {
339
239
  }
340
240
  return preparedBindings;
341
241
  }
342
- async function assertBindingStillValid(page, binding, stage) {
343
- if (binding.target.pageSignature &&
344
- normalizePageSignature(page.url()) !== binding.target.pageSignature) {
345
- throw new Error(`binding_stale:page_signature_mismatch:${stage}`);
346
- }
347
- const liveCount = await binding.locator.count().catch(() => 0);
348
- if (liveCount === 0) {
349
- throw new Error(`binding_stale:locator_resolution_failed:${stage}`);
350
- }
351
- if (binding.target.domSignature) {
352
- const liveSignature = await readLocatorDomSignature(binding.locator).catch(() => null);
353
- if (liveSignature && liveSignature !== binding.target.domSignature) {
354
- throw new Error(`binding_stale:dom_signature_mismatch:${stage}`);
355
- }
356
- }
357
- }
358
242
  function staleReasonFromError(error) {
359
243
  const message = error instanceof Error ? error.message : String(error);
360
244
  if (message.includes('page_signature_mismatch')) {
@@ -398,7 +282,7 @@ export async function executeProtectedFill(params) {
398
282
  let acceptanceProbe = null;
399
283
  let acceptanceResult = null;
400
284
  try {
401
- actionValue = resolveBindingValue(binding.fields, params.protectedValues, params.fieldPolicies, assistedValues);
285
+ actionValue = resolveBindingValue(binding.fields, binding.target, params.protectedValues, params.fieldPolicies, assistedValues);
402
286
  }
403
287
  catch (error) {
404
288
  const message = error instanceof Error ? error.message : String(error);
@@ -438,7 +322,9 @@ export async function executeProtectedFill(params) {
438
322
  await applyActionWithFallbacks(params.page, binding.root, binding.locator, binding.action, actionValue, binding.attempts, binding.target.controlFamily, {
439
323
  guards: {
440
324
  assertStillValid: async (stage) => {
441
- await assertBindingStillValid(params.page, binding, stage);
325
+ await assertStoredBindingStillValid(params.page, binding.locator, binding.target, stage, {
326
+ errorForReason: (reason, validationStage) => `binding_stale:${reason}:${validationStage}`,
327
+ });
442
328
  },
443
329
  },
444
330
  });
@@ -522,9 +408,19 @@ export async function executeProtectedFill(params) {
522
408
  export const __testProtectedFill = {
523
409
  actionForTarget,
524
410
  formatCardExpiry,
525
- resolveBindingValue: (fieldKeys, protectedValues) => resolveBindingValue(fieldKeys.map((fieldKey) => ({
411
+ resolveBindingValue: (fieldKeys, protectedValues, target) => resolveBindingValue(fieldKeys.map((fieldKey) => ({
526
412
  fieldKey,
527
413
  targetRef: 't_test',
528
414
  valueHint: 'direct',
529
- })), protectedValues, undefined, new Map()),
415
+ })), target ??
416
+ {
417
+ ref: 't_test',
418
+ pageRef: 'p0',
419
+ capability: 'actionable',
420
+ lifecycle: 'live',
421
+ availability: { state: 'available' },
422
+ allowedActions: ['fill'],
423
+ locatorCandidates: [],
424
+ createdAt: 0,
425
+ }, protectedValues, undefined, new Map()),
530
426
  };
@@ -1,3 +1,4 @@
1
+ import type { TargetDescriptor } from '../runtime-state.js';
1
2
  import type { FillableFormFieldBinding } from './types.js';
2
- export declare function resolveDeterministicProtectedBindingValue(binding: Pick<FillableFormFieldBinding, 'fieldKey' | 'valueHint'>, protectedValues: Record<string, string>): string | null;
3
+ export declare function resolveDeterministicProtectedBindingValue(binding: Pick<FillableFormFieldBinding, 'fieldKey' | 'valueHint'>, protectedValues: Record<string, string>, target?: Pick<TargetDescriptor, 'label' | 'displayLabel' | 'context'>): string | null;
3
4
  //# sourceMappingURL=protected-value-adapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"protected-value-adapters.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-value-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAwB,MAAM,YAAY,CAAC;AAqBjF,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,UAAU,GAAG,WAAW,CAAC,EACjE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,MAAM,GAAG,IAAI,CA+Bf"}
1
+ {"version":3,"file":"protected-value-adapters.d.ts","sourceRoot":"","sources":["../../src/secrets/protected-value-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAwB,MAAM,YAAY,CAAC;AAwFjF,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,UAAU,GAAG,WAAW,CAAC,EACjE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAAC,GACpE,MAAM,GAAG,IAAI,CAqEf"}
@@ -11,7 +11,86 @@ function directStoredValue(protectedValues, fieldKey) {
11
11
  const value = protectedValues[fieldKey];
12
12
  return typeof value === 'string' && value.trim().length > 0 ? value : null;
13
13
  }
14
- export function resolveDeterministicProtectedBindingValue(binding, protectedValues) {
14
+ function parseIsoDate(value) {
15
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value.trim());
16
+ if (!match) {
17
+ return null;
18
+ }
19
+ const year = match[1];
20
+ const month = match[2];
21
+ const day = match[3];
22
+ if (!year || !month || !day) {
23
+ return null;
24
+ }
25
+ return { year, month, day };
26
+ }
27
+ function monthName(month) {
28
+ const names = [
29
+ 'January',
30
+ 'February',
31
+ 'March',
32
+ 'April',
33
+ 'May',
34
+ 'June',
35
+ 'July',
36
+ 'August',
37
+ 'September',
38
+ 'October',
39
+ 'November',
40
+ 'December',
41
+ ];
42
+ return names[Number(month) - 1] ?? month;
43
+ }
44
+ function monthShortName(month) {
45
+ return monthName(month).slice(0, 3);
46
+ }
47
+ function monthProjectionStyle(target) {
48
+ const context = [target?.label, target?.displayLabel, target?.context?.hintText]
49
+ .filter(Boolean)
50
+ .join(' ')
51
+ .replace(/\s+/g, ' ')
52
+ .trim()
53
+ .toLowerCase();
54
+ if (/\bjanuary\b|\bfebruary\b|\bmarch\b|\bapril\b|\bmay\b|\bjune\b|\bjuly\b|\baugust\b|\bseptember\b|\boctober\b|\bnovember\b|\bdecember\b/.test(context)) {
55
+ return 'name';
56
+ }
57
+ if (/\bjan\b|\bfeb\b|\bmar\b|\bapr\b|\bjun\b|\bjul\b|\baug\b|\bsep\b|\boct\b|\bnov\b|\bdec\b/.test(context)) {
58
+ return 'short';
59
+ }
60
+ return 'numeric';
61
+ }
62
+ export function resolveDeterministicProtectedBindingValue(binding, protectedValues, target) {
63
+ if (binding.fieldKey === 'date_of_birth') {
64
+ const dateOfBirth = directStoredValue(protectedValues, 'date_of_birth');
65
+ if (!dateOfBirth) {
66
+ return null;
67
+ }
68
+ const valueHint = binding.valueHint ?? 'direct';
69
+ if (valueHint === 'direct') {
70
+ return dateOfBirth;
71
+ }
72
+ const parsed = parseIsoDate(dateOfBirth);
73
+ if (!parsed) {
74
+ return null;
75
+ }
76
+ if (valueHint === 'date_of_birth.day') {
77
+ return String(Number(parsed.day));
78
+ }
79
+ if (valueHint === 'date_of_birth.year') {
80
+ return parsed.year;
81
+ }
82
+ if (valueHint === 'date_of_birth.month') {
83
+ const style = monthProjectionStyle(target);
84
+ if (style === 'name') {
85
+ return monthName(parsed.month);
86
+ }
87
+ if (style === 'short') {
88
+ return monthShortName(parsed.month);
89
+ }
90
+ return parsed.month;
91
+ }
92
+ return null;
93
+ }
15
94
  if (binding.fieldKey !== 'full_name') {
16
95
  return binding.valueHint === 'direct'
17
96
  ? directStoredValue(protectedValues, binding.fieldKey)
@@ -0,0 +1,11 @@
1
+ import type { SecretRequestSnapshot, SecretRequestStatus, SecretRequestType } from './types.js';
2
+ export declare function serializeSecretRequest(snapshot: SecretRequestSnapshot): Record<string, unknown>;
3
+ export declare function serializeSecretRequestContext(snapshot: SecretRequestSnapshot): Record<string, unknown>;
4
+ export type SecretRequestStatusContract = {
5
+ message: string;
6
+ reason: string;
7
+ nextAction?: string;
8
+ outcomeType?: 'approval_pending' | 'approval_denied' | 'request_expired';
9
+ };
10
+ export declare function describeSecretRequestStatus(status: SecretRequestStatus, requestType: SecretRequestType): SecretRequestStatusContract;
11
+ //# sourceMappingURL=request-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-output.d.ts","sourceRoot":"","sources":["../../src/secrets/request-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhG,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAc/F;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,qBAAqB,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;CAC1E,CAAC;AAQF,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,iBAAiB,GAC7B,2BAA2B,CA0C7B"}
@@ -0,0 +1,75 @@
1
+ export function serializeSecretRequest(snapshot) {
2
+ return {
3
+ requestId: snapshot.requestId,
4
+ fillRef: snapshot.fillRef,
5
+ requestType: snapshot.requestType,
6
+ status: snapshot.status,
7
+ ...(snapshot.storedSecretRef ? { storedSecretRef: snapshot.storedSecretRef } : {}),
8
+ ...(snapshot.kind ? { kind: snapshot.kind } : {}),
9
+ createdAt: snapshot.createdAt,
10
+ updatedAt: snapshot.updatedAt,
11
+ ...(snapshot.expiresAt ? { expiresAt: snapshot.expiresAt } : {}),
12
+ ...(snapshot.resolvedAt ? { resolvedAt: snapshot.resolvedAt } : {}),
13
+ ...(snapshot.claimedAt ? { claimedAt: snapshot.claimedAt } : {}),
14
+ };
15
+ }
16
+ export function serializeSecretRequestContext(snapshot) {
17
+ return {
18
+ requestType: snapshot.requestType,
19
+ ...(snapshot.storedSecretRef ? { storedSecretRef: snapshot.storedSecretRef } : {}),
20
+ ...(snapshot.kind ? { kind: snapshot.kind } : {}),
21
+ createdAt: snapshot.createdAt,
22
+ updatedAt: snapshot.updatedAt,
23
+ ...(snapshot.expiresAt ? { expiresAt: snapshot.expiresAt } : {}),
24
+ ...(snapshot.resolvedAt ? { resolvedAt: snapshot.resolvedAt } : {}),
25
+ ...(snapshot.claimedAt ? { claimedAt: snapshot.claimedAt } : {}),
26
+ };
27
+ }
28
+ function fulfilledReasonForType(type) {
29
+ return type === 'secret_read'
30
+ ? 'AgentPay approved access to the saved secret values for this request.'
31
+ : 'The user supplied the requested secret values for this request.';
32
+ }
33
+ export function describeSecretRequestStatus(status, requestType) {
34
+ switch (status) {
35
+ case 'pending':
36
+ return {
37
+ outcomeType: 'approval_pending',
38
+ message: 'Protected secret request is waiting for user approval.',
39
+ reason: 'AgentPay has not approved this secret request yet.',
40
+ nextAction: 'poll-secret',
41
+ };
42
+ case 'fulfilled':
43
+ return {
44
+ message: 'Protected secret request is approved and ready to fill.',
45
+ reason: fulfilledReasonForType(requestType),
46
+ nextAction: 'fill-secret',
47
+ };
48
+ case 'denied':
49
+ return {
50
+ outcomeType: 'approval_denied',
51
+ message: 'Protected secret request was denied and cannot be used.',
52
+ reason: 'AgentPay reports that the user denied this protected request.',
53
+ nextAction: 'ask-user',
54
+ };
55
+ case 'expired':
56
+ return {
57
+ outcomeType: 'request_expired',
58
+ message: 'Protected secret request is no longer usable.',
59
+ reason: 'AgentPay reports that this secret request expired before it could be claimed.',
60
+ nextAction: 'request-secret',
61
+ };
62
+ case 'failed':
63
+ return {
64
+ message: 'Protected secret request failed and cannot be used.',
65
+ reason: 'AgentPay reports that this secret request failed before it could be claimed.',
66
+ nextAction: 'request-secret',
67
+ };
68
+ case 'canceled':
69
+ return {
70
+ message: 'Protected secret request was canceled and cannot be used.',
71
+ reason: 'AgentPay reports that this secret request was canceled before it could be claimed.',
72
+ nextAction: 'request-secret',
73
+ };
74
+ }
75
+ }