@crosshands/cli 0.1.6 → 0.2.1

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 (54) hide show
  1. package/dist/bin.js +3 -3
  2. package/dist/bin.js.map +1 -1
  3. package/dist/broker-host.d.ts +2 -1
  4. package/dist/broker-host.d.ts.map +1 -1
  5. package/dist/broker-host.js +65 -40
  6. package/dist/broker-host.js.map +1 -1
  7. package/dist/broker-result.d.ts +7 -0
  8. package/dist/broker-result.d.ts.map +1 -0
  9. package/dist/broker-result.js +10 -0
  10. package/dist/broker-result.js.map +1 -0
  11. package/dist/index.d.ts +6 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +60 -32
  14. package/dist/index.js.map +1 -1
  15. package/dist/intent/dispatch.d.ts +13 -0
  16. package/dist/intent/dispatch.d.ts.map +1 -0
  17. package/dist/intent/dispatch.js +277 -0
  18. package/dist/intent/dispatch.js.map +1 -0
  19. package/dist/intent/env.d.ts +11 -0
  20. package/dist/intent/env.d.ts.map +1 -0
  21. package/dist/intent/env.js +10 -0
  22. package/dist/intent/env.js.map +1 -0
  23. package/dist/intent/evaluate.d.ts +31 -0
  24. package/dist/intent/evaluate.d.ts.map +1 -0
  25. package/dist/intent/evaluate.js +156 -0
  26. package/dist/intent/evaluate.js.map +1 -0
  27. package/dist/intent/http.d.ts +8 -0
  28. package/dist/intent/http.d.ts.map +1 -0
  29. package/dist/intent/http.js +4 -0
  30. package/dist/intent/http.js.map +1 -0
  31. package/dist/intent/log.d.ts +82 -0
  32. package/dist/intent/log.d.ts.map +1 -0
  33. package/dist/intent/log.js +124 -0
  34. package/dist/intent/log.js.map +1 -0
  35. package/dist/intent/tree.d.ts +13 -0
  36. package/dist/intent/tree.d.ts.map +1 -0
  37. package/dist/intent/tree.js +99 -0
  38. package/dist/intent/tree.js.map +1 -0
  39. package/dist/local-client.d.ts +1 -0
  40. package/dist/local-client.d.ts.map +1 -1
  41. package/dist/local-client.js +23 -15
  42. package/dist/local-client.js.map +1 -1
  43. package/package.json +6 -6
  44. package/src/bin.ts +4 -3
  45. package/src/broker-host.ts +68 -38
  46. package/src/broker-result.ts +14 -0
  47. package/src/index.ts +71 -35
  48. package/src/intent/dispatch.ts +373 -0
  49. package/src/intent/env.ts +13 -0
  50. package/src/intent/evaluate.ts +211 -0
  51. package/src/intent/http.ts +10 -0
  52. package/src/intent/log.ts +219 -0
  53. package/src/intent/tree.ts +108 -0
  54. package/src/local-client.ts +31 -15
@@ -0,0 +1,277 @@
1
+ import { ComputerError, createComputerError, hasIntentTarget, parsePublicInput, parsePublicOutput, PublicMutationResultSchema, PublicSnapshotResultSchema, SnapshotResultSchema, splitPublicInput, toBrokerInput } from '@crosshands/contract';
2
+ import { unwrapBrokerResult } from '../broker-result.js';
3
+ import { parseJevEnv } from './env.js';
4
+ import { JevEvaluateError, liveEvaluator, namedTargetAllowed, suggestionFromAnswers } from './evaluate.js';
5
+ import { elapsedMs } from './http.js';
6
+ import { createJevCall, emitCall, recordRank } from './log.js';
7
+ import { clickableMoves, parseTreeMoves } from './tree.js';
8
+ const NAMED_GATE = new Set(['click', 'setValue']);
9
+ function policyUnavailable() {
10
+ return createComputerError('policy_unavailable', 'Jev could not rank this snapshot').toJSON();
11
+ }
12
+ function snapshotResultOf(value) {
13
+ return SnapshotResultSchema.parse(value);
14
+ }
15
+ function notAttempted(error, suggestion) {
16
+ return PublicMutationResultSchema.parse({
17
+ outcome: { state: 'not_attempted', error },
18
+ ...(suggestion === undefined ? {} : { suggestion })
19
+ });
20
+ }
21
+ function withSnapshotIssue(look, issue) {
22
+ return PublicSnapshotResultSchema.parse({
23
+ ...look,
24
+ issues: [...look.issues, issue]
25
+ });
26
+ }
27
+ function contextTokenOf(input) {
28
+ if (!('contextToken' in input) || typeof input.contextToken !== 'string')
29
+ return undefined;
30
+ return input.contextToken;
31
+ }
32
+ function elementIndexOf(input) {
33
+ if (!('target' in input))
34
+ return undefined;
35
+ const target = input.target;
36
+ if (target === null || typeof target !== 'object' || !('elementIndex' in target))
37
+ return undefined;
38
+ return typeof target.elementIndex === 'number' ? target.elementIndex : undefined;
39
+ }
40
+ function boundIndex(operation, suggestion) {
41
+ const move = suggestion.move;
42
+ if (operation === 'setValue' && move.kind === 'setValue')
43
+ return move.elementIndex;
44
+ if ((operation === 'click' || operation === 'scroll' || operation === 'performSecondaryAction') &&
45
+ move.kind === 'click') {
46
+ return move.elementIndex;
47
+ }
48
+ return undefined;
49
+ }
50
+ function errorFromResult(result) {
51
+ const mutation = PublicMutationResultSchema.safeParse(result);
52
+ if (mutation.success) {
53
+ const outcome = mutation.data.outcome;
54
+ if (outcome.state === 'not_attempted' || outcome.state === 'failed')
55
+ return outcome.error?.code;
56
+ return undefined;
57
+ }
58
+ const snapshot = PublicSnapshotResultSchema.safeParse(result);
59
+ if (!snapshot.success)
60
+ return undefined;
61
+ return snapshot.data.issues.find((issue) => issue.code === 'policy_unavailable')?.code;
62
+ }
63
+ function boundFromCall(call, result) {
64
+ if (call?.phase !== 'bind')
65
+ return undefined;
66
+ const mutation = PublicMutationResultSchema.safeParse(result);
67
+ return mutation.success && mutation.data.resolvedTarget !== undefined;
68
+ }
69
+ async function rank(look, goal, evaluate, app) {
70
+ const snapshotId = look.snapshot.id;
71
+ const parseStarted = Date.now();
72
+ const moves = clickableMoves(parseTreeMoves(look.snapshot.treeText));
73
+ const stats = {
74
+ snapshotId,
75
+ treeChars: look.snapshot.treeText.length,
76
+ elementCount: look.snapshot.elementCount,
77
+ candidateCount: moves.length,
78
+ parseMs: elapsedMs(parseStarted),
79
+ goalChars: goal.length,
80
+ app: look.snapshot.app.id
81
+ };
82
+ if (moves.length === 0) {
83
+ return {
84
+ ok: true,
85
+ suggestion: {
86
+ untrusted: true,
87
+ snapshotId,
88
+ move: { kind: 'blocked', reason: 'no_candidate' }
89
+ },
90
+ stats
91
+ };
92
+ }
93
+ const evalStarted = Date.now();
94
+ try {
95
+ const evaluated = await evaluate({
96
+ goal,
97
+ ...(app === undefined ? {} : { app }),
98
+ moves
99
+ });
100
+ return {
101
+ ok: true,
102
+ suggestion: suggestionFromAnswers(snapshotId, moves, evaluated.answers),
103
+ stats: {
104
+ ...stats,
105
+ evaluateMs: elapsedMs(evalStarted),
106
+ ...(evaluated.http === undefined ? {} : { http: evaluated.http })
107
+ }
108
+ };
109
+ }
110
+ catch (cause) {
111
+ if (cause instanceof ComputerError)
112
+ throw cause;
113
+ const http = cause instanceof JevEvaluateError ? cause.http : undefined;
114
+ return {
115
+ ok: false,
116
+ stats: {
117
+ ...stats,
118
+ evaluateMs: elapsedMs(evalStarted),
119
+ ...(http === undefined ? {} : { http })
120
+ }
121
+ };
122
+ }
123
+ }
124
+ function evaluatorFor(env, override) {
125
+ if (override !== undefined)
126
+ return override;
127
+ if (env.kind !== 'on')
128
+ return undefined;
129
+ return liveEvaluator(env.apiKey);
130
+ }
131
+ async function lookAgain(request, token) {
132
+ return snapshotResultOf(await request('getAppState', { contextToken: token, captureScreenshot: false }));
133
+ }
134
+ async function suggestObserve(request, input, goal, env, evaluate, record) {
135
+ const result = await request('getAppState', toBrokerInput('getAppState', input));
136
+ if (goal === undefined || env.kind === 'off')
137
+ return result;
138
+ const look = snapshotResultOf(result);
139
+ if (env.kind === 'fail_closed' || evaluate === undefined) {
140
+ return withSnapshotIssue(look, policyUnavailable());
141
+ }
142
+ const app = 'app' in input && typeof input.app === 'string' ? input.app : undefined;
143
+ try {
144
+ const ranked = await rank(look, goal, evaluate, app);
145
+ if (!ranked.ok) {
146
+ record('observe', ranked.stats);
147
+ return withSnapshotIssue(look, policyUnavailable());
148
+ }
149
+ record('observe', ranked.stats, ranked.suggestion);
150
+ return parsePublicOutput('getAppState', { ...look, suggestion: ranked.suggestion });
151
+ }
152
+ catch {
153
+ return withSnapshotIssue(look, policyUnavailable());
154
+ }
155
+ }
156
+ async function bindIntentTarget(request, operation, input, goal, env, evaluate, record) {
157
+ if (env.kind === 'off') {
158
+ throw createComputerError('invalid_argument', 'intent targeting requires CROSSHANDS_JEV=1');
159
+ }
160
+ if (env.kind === 'fail_closed' || evaluate === undefined || goal === undefined) {
161
+ throw createComputerError('intent_unavailable', 'Jev is enabled but no TypeSafe key is set');
162
+ }
163
+ const token = contextTokenOf(input);
164
+ if (token === undefined) {
165
+ throw createComputerError('invalid_argument', 'intent targeting requires a context token');
166
+ }
167
+ let look;
168
+ try {
169
+ look = await lookAgain(request, token);
170
+ }
171
+ catch (cause) {
172
+ if (cause instanceof ComputerError)
173
+ throw cause;
174
+ return notAttempted(policyUnavailable());
175
+ }
176
+ const ranked = await rank(look, goal, evaluate);
177
+ if (!ranked.ok) {
178
+ record('bind', ranked.stats);
179
+ return notAttempted(policyUnavailable());
180
+ }
181
+ record('bind', ranked.stats, ranked.suggestion);
182
+ const index = boundIndex(operation, ranked.suggestion);
183
+ if (index === undefined)
184
+ return notAttempted(policyUnavailable(), ranked.suggestion);
185
+ const bound = {
186
+ ...splitPublicInput(input).rest,
187
+ contextToken: look.context.token,
188
+ target: { kind: 'element', elementIndex: index }
189
+ };
190
+ const result = await request(operation, toBrokerInput(operation, bound));
191
+ const body = result !== null && typeof result === 'object' ? result : {};
192
+ return parsePublicOutput(operation, {
193
+ ...body,
194
+ resolvedTarget: { kind: 'element', elementIndex: index },
195
+ suggestion: ranked.suggestion
196
+ });
197
+ }
198
+ async function gateNamedTarget(request, input, goal, evaluate, record) {
199
+ const named = elementIndexOf(input);
200
+ const token = contextTokenOf(input);
201
+ if (token === undefined || named === undefined)
202
+ return undefined;
203
+ try {
204
+ const look = await lookAgain(request, token);
205
+ const ranked = await rank(look, goal, evaluate);
206
+ if (!ranked.ok) {
207
+ record('named', ranked.stats);
208
+ return notAttempted(policyUnavailable());
209
+ }
210
+ record('named', ranked.stats, ranked.suggestion);
211
+ const picked = ranked.suggestion.move.kind === 'click' || ranked.suggestion.move.kind === 'setValue'
212
+ ? ranked.suggestion.move.elementIndex
213
+ : undefined;
214
+ if (picked !== named || !namedTargetAllowed(ranked.suggestion.confidence)) {
215
+ return notAttempted(createComputerError('goal_mismatch', 'Named target does not match the per-call goal').toJSON(), ranked.suggestion);
216
+ }
217
+ }
218
+ catch {
219
+ return notAttempted(policyUnavailable());
220
+ }
221
+ return undefined;
222
+ }
223
+ export async function dispatchPublicOperation(broker, operation, rawInput, options = {}) {
224
+ const envState = parseJevEnv(options.env);
225
+ const parsed = parsePublicInput(operation, rawInput);
226
+ const { goal } = splitPublicInput(parsed);
227
+ const evaluate = evaluatorFor(envState, options.evaluate);
228
+ const log = options.log;
229
+ const call = log === undefined ? undefined : createJevCall(operation, goal);
230
+ const record = (phase, stats, suggestion) => {
231
+ recordRank(log, call, phase, stats, suggestion);
232
+ };
233
+ const request = async (name, input) => {
234
+ if (call !== undefined)
235
+ call.brokerCalls += 1;
236
+ return unwrapBrokerResult(await broker.request(name, input));
237
+ };
238
+ async function dispatch() {
239
+ if (operation === 'getAppState') {
240
+ return suggestObserve(request, parsed, goal, envState, evaluate, record);
241
+ }
242
+ if (hasIntentTarget(parsed)) {
243
+ return bindIntentTarget(request, operation, parsed, goal, envState, evaluate, record);
244
+ }
245
+ if (goal !== undefined &&
246
+ envState.kind === 'on' &&
247
+ evaluate !== undefined &&
248
+ NAMED_GATE.has(operation)) {
249
+ const gated = await gateNamedTarget(request, parsed, goal, evaluate, record);
250
+ if (gated !== undefined)
251
+ return gated;
252
+ }
253
+ return request(operation, toBrokerInput(operation, parsed));
254
+ }
255
+ const started = Date.now();
256
+ try {
257
+ const result = await dispatch();
258
+ if (call !== undefined) {
259
+ const extra = {};
260
+ const error = errorFromResult(result);
261
+ const bound = boundFromCall(call, result);
262
+ if (error !== undefined)
263
+ extra.error = error;
264
+ if (bound !== undefined)
265
+ extra.bound = bound;
266
+ emitCall(log, call, started, extra);
267
+ }
268
+ return result;
269
+ }
270
+ catch (cause) {
271
+ if (call !== undefined) {
272
+ emitCall(log, call, started, cause instanceof ComputerError ? { error: cause.code } : {});
273
+ }
274
+ throw cause;
275
+ }
276
+ }
277
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/intent/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EAKd,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAe,MAAM,UAAU,CAAA;AACnD,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EAEtB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EACL,aAAa,EACb,QAAQ,EACR,UAAU,EAKX,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAY1D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAwB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;AAMxE,SAAS,iBAAiB;IACxB,OAAO,mBAAmB,CAAC,oBAAoB,EAAE,kCAAkC,CAAC,CAAC,MAAM,EAAE,CAAA;AAC/F,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC1C,CAAC;AAED,SAAS,YAAY,CACnB,KAA2C,EAC3C,UAAuB;IAEvB,OAAO,0BAA0B,CAAC,KAAK,CAAC;QACtC,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;QAC1C,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;KACpD,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAoB,EACpB,KAA2C;IAE3C,OAAO,0BAA0B,CAAC,KAAK,CAAC;QACtC,GAAG,IAAI;QACP,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC1F,OAAO,KAAK,CAAC,YAAY,CAAA;AAC3B,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;IAC3B,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC;QAAE,OAAO,SAAS,CAAA;IAClG,OAAO,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAA;AAClF,CAAC;AAED,SAAS,UAAU,CAAC,SAAgC,EAAE,UAAsB;IAC1E,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;IAC5B,IAAI,SAAS,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC,YAAY,CAAA;IAClF,IACE,CAAC,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,wBAAwB,CAAC;QAC3F,IAAI,CAAC,IAAI,KAAK,OAAO,EACrB,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACtC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC7D,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAA;QACrC,IAAI,OAAO,CAAC,KAAK,KAAK,eAAe,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI,CAAA;QAC/F,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC7D,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IACvC,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,oBAAoB,CAAC,EAAE,IAAI,CAAA;AACxF,CAAC;AAED,SAAS,aAAa,CAAC,IAAyB,EAAE,MAAe;IAC/D,IAAI,IAAI,EAAE,KAAK,KAAK,MAAM;QAAE,OAAO,SAAS,CAAA;IAC5C,MAAM,QAAQ,GAAG,0BAA0B,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC7D,OAAO,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAA;AACvE,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,IAAoB,EACpB,IAAY,EACZ,QAAoB,EACpB,GAAY;IAEZ,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;IACnC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;IACpE,MAAM,KAAK,GAAiB;QAC1B,UAAU;QACV,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;QACxC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY;QACxC,cAAc,EAAE,KAAK,CAAC,MAAM;QAC5B,OAAO,EAAE,SAAS,CAAC,YAAY,CAAC;QAChC,SAAS,EAAE,IAAI,CAAC,MAAM;QACtB,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;KAC1B,CAAA;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,UAAU,EAAE;gBACV,SAAS,EAAE,IAAI;gBACf,UAAU;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE;aAClD;YACD,KAAK;SACN,CAAA;IACH,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC;YAC/B,IAAI;YACJ,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;YACrC,KAAK;SACN,CAAC,CAAA;QACF,OAAO;YACL,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,qBAAqB,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC;YACvE,KAAK,EAAE;gBACL,GAAG,KAAK;gBACR,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;gBAClC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;aAClE;SACF,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa;YAAE,MAAM,KAAK,CAAA;QAC/C,MAAM,IAAI,GAAG,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;QACvE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,GAAG,KAAK;gBACR,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;gBAClC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;aACxC;SACF,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,QAAgC;IACjE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IACvC,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAClC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAgC,EAAE,KAAa;IACtE,OAAO,gBAAgB,CACrB,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAChF,CAAA;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAgC,EAChC,KAA0C,EAC1C,IAAwB,EACxB,GAAW,EACX,QAAgC,EAChC,MAAoB;IAEpB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAA;IAChF,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,MAAM,CAAA;IAC3D,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACrC,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzD,OAAO,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;IACrD,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;IACnF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;QACpD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/B,OAAO,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;QACrD,CAAC;QACD,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;QAClD,OAAO,iBAAiB,CAAC,aAAa,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAgC,EAChC,SAAgC,EAChC,KAAa,EACb,IAAwB,EACxB,GAAW,EACX,QAAgC,EAChC,MAAoB;IAEpB,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACvB,MAAM,mBAAmB,CAAC,kBAAkB,EAAE,4CAA4C,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/E,MAAM,mBAAmB,CAAC,oBAAoB,EAAE,2CAA2C,CAAC,CAAA;IAC9F,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,mBAAmB,CAAC,kBAAkB,EAAE,2CAA2C,CAAC,CAAA;IAC5F,CAAC;IACD,IAAI,IAAoB,CAAA;IACxB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa;YAAE,MAAM,KAAK,CAAA;QAC/C,OAAO,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAC5B,OAAO,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAC1C,CAAC;IACD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IACtD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC,iBAAiB,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IACpF,MAAM,KAAK,GAAG;QACZ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI;QAC/B,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;QAChC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,YAAY,EAAE,KAAK,EAAE;KAC1D,CAAA;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;IACxE,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IACxE,OAAO,iBAAiB,CAAC,SAAS,EAAE;QAClC,GAAG,IAAI;QACP,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE;QACxD,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAgC,EAChC,KAAa,EACb,IAAY,EACZ,QAAoB,EACpB,MAAoB;IAEpB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACnC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACnC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAChE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAC7B,OAAO,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAA;QAC1C,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;QAChD,MAAM,MAAM,GACV,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU;YACnF,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY;YACrC,CAAC,CAAC,SAAS,CAAA;QACf,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1E,OAAO,YAAY,CACjB,mBAAmB,CACjB,eAAe,EACf,+CAA+C,CAChD,CAAC,MAAM,EAAE,EACV,MAAM,CAAC,UAAU,CAClB,CAAA;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAoB,EACpB,SAAgC,EAChC,QAAiB,EACjB,UAA2B,EAAE;IAE7B,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IACpD,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;IACvB,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC3E,MAAM,MAAM,GAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;QACxD,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;IACjD,CAAC,CAAA;IACD,MAAM,OAAO,GAA4B,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC7D,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,IAAI,CAAC,CAAA;QAC7C,OAAO,kBAAkB,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAA;IAED,KAAK,UAAU,QAAQ;QACrB,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;YAChC,OAAO,cAAc,CACnB,OAAO,EACP,MAA6C,EAC7C,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,MAAM,CACP,CAAA;QACH,CAAC;QACD,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;QACvF,CAAC;QACD,IACE,IAAI,KAAK,SAAS;YAClB,QAAQ,CAAC,IAAI,KAAK,IAAI;YACtB,QAAQ,KAAK,SAAS;YACtB,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EACzB,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC5E,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAA;QACvC,CAAC;QACD,OAAO,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAA;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,KAAK,GAAwC,EAAE,CAAA;YACrD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;YACrC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YACzC,IAAI,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;YAC5C,IAAI,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;YAC5C,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC3F,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type JevEnv = {
2
+ kind: 'off';
3
+ } | {
4
+ kind: 'fail_closed';
5
+ reason: 'missing_key';
6
+ } | {
7
+ kind: 'on';
8
+ apiKey: string;
9
+ };
10
+ export declare function parseJevEnv(env?: NodeJS.ProcessEnv): JevEnv;
11
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/intent/env.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GACd;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAElC,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAOxE"}
@@ -0,0 +1,10 @@
1
+ export function parseJevEnv(env = process.env) {
2
+ if (env.CROSSHANDS_JEV !== '1')
3
+ return { kind: 'off' };
4
+ const apiKey = env.TYPESAFE_API_KEY;
5
+ if (typeof apiKey !== 'string' || apiKey.length === 0) {
6
+ return { kind: 'fail_closed', reason: 'missing_key' };
7
+ }
8
+ return { kind: 'on', apiKey };
9
+ }
10
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/intent/env.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,WAAW,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC9D,IAAI,GAAG,CAAC,cAAc,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACtD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAA;IACnC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,CAAA;IACvD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Suggestion } from '@crosshands/contract';
2
+ import { type JevHttpStats } from './http.js';
3
+ import type { TreeMove } from './tree.js';
4
+ export type { JevHttpStats };
5
+ export declare class JevEvaluateError extends Error {
6
+ readonly http: JevHttpStats;
7
+ constructor(message: string, http: JevHttpStats);
8
+ }
9
+ export type JevAnswers = {
10
+ move: 'click' | 'setValue' | 'wait' | 'done' | 'blocked';
11
+ clickWhich?: string;
12
+ setValueWhich?: string;
13
+ confidence?: number;
14
+ goalMet?: number;
15
+ blockedReason?: string;
16
+ };
17
+ export type EvaluateResult = {
18
+ answers: JevAnswers;
19
+ http?: JevHttpStats;
20
+ };
21
+ export type EvaluateInput = {
22
+ goal: string;
23
+ app?: string;
24
+ moves: readonly TreeMove[];
25
+ };
26
+ export type EvaluateFn = (input: EvaluateInput) => Promise<EvaluateResult>;
27
+ export declare const GATE_REFUSE_BELOW = 0.35;
28
+ export declare function namedTargetAllowed(confidence: number | undefined): boolean;
29
+ export declare function suggestionFromAnswers(snapshotId: string, moves: readonly TreeMove[], answers: JevAnswers): Suggestion;
30
+ export declare function liveEvaluator(apiKey: string): EvaluateFn;
31
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/intent/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEzC,YAAY,EAAE,YAAY,EAAE,CAAA;AAE5B,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;gBACf,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;CAKhD;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACxD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,UAAU,CAAA;IACnB,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;AAE1E,eAAO,MAAM,iBAAiB,OAAO,CAAA;AAErC,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAG1E;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,OAAO,EAAE,UAAU,GAClB,UAAU,CAiCZ;AAuDD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAyExD"}
@@ -0,0 +1,156 @@
1
+ import { elapsedMs } from './http.js';
2
+ export class JevEvaluateError extends Error {
3
+ http;
4
+ constructor(message, http) {
5
+ super(message);
6
+ this.name = 'JevEvaluateError';
7
+ this.http = http;
8
+ }
9
+ }
10
+ export const GATE_REFUSE_BELOW = 0.35;
11
+ export function namedTargetAllowed(confidence) {
12
+ if (confidence === undefined)
13
+ return true;
14
+ return confidence >= GATE_REFUSE_BELOW;
15
+ }
16
+ export function suggestionFromAnswers(snapshotId, moves, answers) {
17
+ const byIndex = new Map(moves.map((move) => [String(move.elementIndex), move]));
18
+ if (answers.move === 'wait') {
19
+ return { untrusted: true, snapshotId, move: { kind: 'wait' }, confidence: answers.confidence };
20
+ }
21
+ if (answers.move === 'done') {
22
+ return { untrusted: true, snapshotId, move: { kind: 'done' }, confidence: answers.confidence };
23
+ }
24
+ if (answers.move === 'blocked') {
25
+ return {
26
+ untrusted: true,
27
+ snapshotId,
28
+ move: { kind: 'blocked', reason: answers.blockedReason ?? 'blocked' },
29
+ confidence: answers.confidence
30
+ };
31
+ }
32
+ const raw = answers.move === 'setValue' ? answers.setValueWhich : answers.clickWhich;
33
+ const selected = raw === undefined ? undefined : byIndex.get(raw);
34
+ if (selected === undefined) {
35
+ return {
36
+ untrusted: true,
37
+ snapshotId,
38
+ move: { kind: 'blocked', reason: 'no_candidate' },
39
+ confidence: answers.confidence
40
+ };
41
+ }
42
+ return {
43
+ untrusted: true,
44
+ snapshotId,
45
+ move: { kind: answers.move, elementIndex: selected.elementIndex },
46
+ confidence: answers.confidence,
47
+ label: `${selected.role} ${selected.label}`.trim()
48
+ };
49
+ }
50
+ function criteria(moves) {
51
+ return Object.fromEntries(moves.map((move) => [String(move.elementIndex), `${move.role} ${move.label}`.trim()]));
52
+ }
53
+ const JEV_MODEL = 'jev-latest';
54
+ function httpStats(started, requestBytes, status, responseBytes) {
55
+ return {
56
+ status,
57
+ durationMs: elapsedMs(started),
58
+ requestBytes,
59
+ responseBytes
60
+ };
61
+ }
62
+ function answersOf(raw) {
63
+ const move = raw.move?.choice;
64
+ if (move !== 'click' &&
65
+ move !== 'setValue' &&
66
+ move !== 'wait' &&
67
+ move !== 'done' &&
68
+ move !== 'blocked') {
69
+ return { move: 'blocked', blockedReason: 'no_candidate' };
70
+ }
71
+ const clickWhich = raw.click_which?.choice;
72
+ const setValueWhich = raw.setvalue_which?.choice;
73
+ const confidence = raw.move?.confidence ?? raw.click_which?.confidence;
74
+ const goalMet = raw.goal_met?.noul;
75
+ return {
76
+ move,
77
+ ...(clickWhich === undefined ? {} : { clickWhich }),
78
+ ...(setValueWhich === undefined ? {} : { setValueWhich }),
79
+ ...(confidence === undefined ? {} : { confidence }),
80
+ ...(goalMet === undefined ? {} : { goalMet })
81
+ };
82
+ }
83
+ export function liveEvaluator(apiKey) {
84
+ return async (input) => {
85
+ const clickable = criteria(input.moves);
86
+ const payload = JSON.stringify({
87
+ model: JEV_MODEL,
88
+ state: {
89
+ goal: input.goal,
90
+ ...(input.app === undefined ? {} : { app: input.app }),
91
+ clickable
92
+ },
93
+ questions: {
94
+ move: {
95
+ type: 'choice',
96
+ instructions: 'What should we do next for the goal?',
97
+ criteria: {
98
+ click: 'Press one clickable control',
99
+ setValue: 'Pick a field for the caller to fill',
100
+ wait: 'The window is still loading',
101
+ done: 'The goal is already met',
102
+ blocked: 'Stop'
103
+ }
104
+ },
105
+ click_which: {
106
+ type: 'choice',
107
+ instructions: 'If the move is click, which control?',
108
+ criteria: clickable
109
+ },
110
+ setvalue_which: {
111
+ type: 'choice',
112
+ instructions: 'If the move is setValue, which field?',
113
+ criteria: clickable
114
+ },
115
+ goal_met: {
116
+ type: 'noul',
117
+ instructions: 'Is the goal already met?'
118
+ }
119
+ }
120
+ });
121
+ const requestBytes = Buffer.byteLength(payload);
122
+ const started = Date.now();
123
+ let status = 0;
124
+ let responseBytes = 0;
125
+ let raw = '';
126
+ try {
127
+ const response = await fetch('https://api.typesafe.ai/v1/systemone', {
128
+ method: 'POST',
129
+ headers: {
130
+ authorization: `Bearer ${apiKey}`,
131
+ 'content-type': 'application/json'
132
+ },
133
+ body: payload
134
+ });
135
+ status = response.status;
136
+ raw = await response.text();
137
+ responseBytes = Buffer.byteLength(raw);
138
+ }
139
+ catch (cause) {
140
+ throw new JevEvaluateError(cause instanceof Error ? cause.message : 'TypeSafe HTTP failed', httpStats(started, requestBytes, 0, 0));
141
+ }
142
+ const http = httpStats(started, requestBytes, status, responseBytes);
143
+ if (status < 200 || status >= 300) {
144
+ throw new JevEvaluateError(`TypeSafe HTTP ${status}`, http);
145
+ }
146
+ let parsed;
147
+ try {
148
+ parsed = JSON.parse(raw);
149
+ }
150
+ catch {
151
+ throw new JevEvaluateError('TypeSafe HTTP response was not JSON', http);
152
+ }
153
+ return { answers: answersOf(parsed.answers ?? {}), http };
154
+ };
155
+ }
156
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/intent/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type JevHttpStats = {
2
+ status: number;
3
+ durationMs: number;
4
+ requestBytes: number;
5
+ responseBytes: number;
6
+ };
7
+ export declare function elapsedMs(started: number): number;
8
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/intent/http.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,4 @@
1
+ export function elapsedMs(started) {
2
+ return Math.max(0, Date.now() - started);
3
+ }
4
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/intent/http.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,82 @@
1
+ import type { Suggestion } from '@crosshands/contract';
2
+ import { type JevHttpStats } from './http.js';
3
+ export type JevPhase = 'observe' | 'bind' | 'named';
4
+ type JevShared = {
5
+ callId: string;
6
+ operation: string;
7
+ snapshotId: string;
8
+ phase: JevPhase;
9
+ goal?: string;
10
+ };
11
+ export type JevCallRecord = {
12
+ kind: 'jev.call';
13
+ callId: string;
14
+ operation: string;
15
+ durationMs: number;
16
+ httpMs: number;
17
+ brokerCalls: number;
18
+ ranks: number;
19
+ phase?: JevPhase;
20
+ bound?: boolean;
21
+ error?: string;
22
+ goal?: string;
23
+ };
24
+ export type JevHttpRecord = JevShared & {
25
+ kind: 'jev.http';
26
+ status: number;
27
+ durationMs: number;
28
+ requestBytes: number;
29
+ responseBytes: number;
30
+ candidateCount: number;
31
+ };
32
+ export type JevDecisionRecord = JevShared & {
33
+ kind: 'jev.decision';
34
+ app?: string;
35
+ move: Suggestion['move']['kind'];
36
+ elementIndex?: number;
37
+ reason?: string;
38
+ confidence?: number;
39
+ goalChars: number;
40
+ treeChars: number;
41
+ elementCount: number;
42
+ candidateCount: number;
43
+ parseMs: number;
44
+ evaluateMs?: number;
45
+ };
46
+ export type JevRecord = JevCallRecord | JevHttpRecord | JevDecisionRecord;
47
+ export type JevLogger = {
48
+ emit(record: JevRecord): void;
49
+ close(): Promise<void>;
50
+ };
51
+ export type JevCall = {
52
+ callId: string;
53
+ operation: string;
54
+ goal?: string;
55
+ ranks: number;
56
+ httpMs: number;
57
+ brokerCalls: number;
58
+ phase?: JevPhase;
59
+ };
60
+ export type JevRankStats = {
61
+ snapshotId: string;
62
+ treeChars: number;
63
+ elementCount: number;
64
+ candidateCount: number;
65
+ parseMs: number;
66
+ goalChars: number;
67
+ evaluateMs?: number;
68
+ app?: string;
69
+ http?: JevHttpStats;
70
+ };
71
+ export type RankRecorder = (phase: JevPhase, stats: JevRankStats, suggestion?: Suggestion) => void;
72
+ export declare function hashGoal(goal: string): string;
73
+ export declare function createJevCall(operation: string, goal?: string): JevCall;
74
+ export declare function recordRank(log: JevLogger | undefined, call: JevCall | undefined, phase: JevPhase, stats: JevRankStats, suggestion?: Suggestion): void;
75
+ export declare function emitCall(log: JevLogger | undefined, call: JevCall | undefined, started: number, extra?: {
76
+ error?: string;
77
+ bound?: boolean;
78
+ }): void;
79
+ export declare function createJevLogger(graphicalSessionId: string, env?: NodeJS.ProcessEnv): JevLogger;
80
+ export declare function createCliJevLogger(env?: NodeJS.ProcessEnv): JevLogger | undefined;
81
+ export {};
82
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/intent/log.ts"],"names":[],"mappings":"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"}