orcareplay 0.2.2 → 0.2.4
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.
- package/dist/args.d.ts +33 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +41 -5
- package/dist/args.js.map +1 -1
- package/dist/commands/attach.js +15 -4
- package/dist/commands/attach.js.map +1 -1
- package/dist/commands/inspect.d.ts +11 -0
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +43 -0
- package/dist/commands/inspect.js.map +1 -1
- package/dist/commands/quickstart.d.ts +48 -0
- package/dist/commands/quickstart.d.ts.map +1 -0
- package/dist/commands/quickstart.js +373 -0
- package/dist/commands/quickstart.js.map +1 -0
- package/dist/commands/record.d.ts +13 -0
- package/dist/commands/record.d.ts.map +1 -1
- package/dist/commands/record.js +119 -8
- package/dist/commands/record.js.map +1 -1
- package/dist/commands/replay.d.ts.map +1 -1
- package/dist/commands/replay.js +439 -283
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/scrub.d.ts.map +1 -1
- package/dist/commands/scrub.js +182 -47
- package/dist/commands/scrub.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +67 -4
- package/dist/commands/setup.js.map +1 -1
- package/dist/exchange-events.d.ts.map +1 -1
- package/dist/exchange-events.js +23 -0
- package/dist/exchange-events.js.map +1 -1
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +68 -2
- package/dist/flags.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +32 -0
- package/dist/main.js.map +1 -1
- package/dist/tls-capture.d.ts +10 -2
- package/dist/tls-capture.d.ts.map +1 -1
- package/dist/tls-capture.js +41 -3
- package/dist/tls-capture.js.map +1 -1
- package/dist/upstream.d.ts.map +1 -1
- package/dist/upstream.js +17 -0
- package/dist/upstream.js.map +1 -1
- package/package.json +13 -12
- package/quickstart/project/agent.mjs +128 -0
- package/quickstart/project/package.json +8 -0
- package/quickstart/project/src/schedule.js +41 -0
- package/quickstart/project/test/schedule.test.js +25 -0
- package/quickstart/trace/blobs/f7/f7c1592306093f65f441d2afd5f496b7635b7e18f5c15f55b11f71f0b552a118 +1 -0
- package/quickstart/trace/events.jsonl +19 -0
- package/quickstart/trace/fs/HEAD +1 -0
- package/quickstart/trace/fs/config +11 -0
- package/quickstart/trace/fs/description +1 -0
- package/quickstart/trace/fs/index +0 -0
- package/quickstart/trace/fs/info/exclude +11 -0
- package/quickstart/trace/fs/objects/1b/1f956f306fe2c66611dd9e280e7fd2dce1ecda +0 -0
- package/quickstart/trace/fs/objects/1c/c77eaef0608e088283cb62876b80be9473edce +0 -0
- package/quickstart/trace/fs/objects/20/0c1f7a4be93b037ff27cea57853a738fcbf744 +0 -0
- package/quickstart/trace/fs/objects/20/28a902b70fff80fe02a8aaaf30005fd91bafb7 +0 -0
- package/quickstart/trace/fs/objects/34/522daa46d0e3f8db09ec7d874fa6f05cbcdabf +0 -0
- package/quickstart/trace/fs/objects/48/a7bdafdaae1c53a354c7bd06c740719e1cb255 +0 -0
- package/quickstart/trace/fs/objects/80/13b71377c59b728861dd8eec39a919387a4b81 +0 -0
- package/quickstart/trace/fs/objects/9f/db6ace4a4410e535a2aef50e653e46a4c3694a +0 -0
- package/quickstart/trace/fs/objects/a4/371e26fb48bece62891a54e4374895fba69f0d +0 -0
- package/quickstart/trace/fs/objects/d3/3088476a7db5aef2dfd6c839d16d2b2ccaca40 +0 -0
- package/quickstart/trace/manifest.json +43 -0
- package/quickstart/trace/redactions.json +4 -0
- package/quickstart/trace/shell-frames.jsonl +0 -0
package/dist/commands/setup.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createInterface } from 'node:readline/promises';
|
|
2
|
+
import { unusableOrigin, recordableOrigin, withoutCredentials } from '@orcareplay/proxy';
|
|
2
3
|
import { modelInfoFor } from '@orcareplay/providers';
|
|
3
4
|
import { configPath, gatewayHeaders, ORCAROUTER_CONSOLE, ORCAROUTER_URL, readConfig, writeConfig, } from '../config.js';
|
|
4
5
|
/** OpenAI-compatible model listing, which every gateway worth pointing orca at implements. */
|
|
@@ -40,6 +41,17 @@ export async function setupCommand(args, out, deps = {}) {
|
|
|
40
41
|
url = await ask(`Gateway URL (serves the model APIs) [${ORCAROUTER_URL}]: `);
|
|
41
42
|
if (!url)
|
|
42
43
|
url = ORCAROUTER_URL;
|
|
44
|
+
// Refused here, before it is stored or echoed. Sanitising on the way out is not enough on its
|
|
45
|
+
// own: `new URL` parses a scheme-less URL with the username as the protocol, so the sanitiser
|
|
46
|
+
// returns a value that still carries the password and every `?? url` guard downstream sees a
|
|
47
|
+
// success. Nothing refused here could have worked anyway — undici rejects a URL carrying
|
|
48
|
+
// credentials, and a scheme-less one has no host to reach.
|
|
49
|
+
const problem = unusableOrigin(url);
|
|
50
|
+
if (problem !== undefined) {
|
|
51
|
+
throw new Error(`--gateway is not an origin orca can use: ${problem}` +
|
|
52
|
+
'\n a gateway is scheme, host and path: --gateway https://gateway.example/v1' +
|
|
53
|
+
'\n the key goes separately: --key <key>, or --key-env NAME');
|
|
54
|
+
}
|
|
43
55
|
if (!key && !keyEnv && ask) {
|
|
44
56
|
if (sameOrigin(url, ORCAROUTER_URL)) {
|
|
45
57
|
out.plain(` get a key at ${ORCAROUTER_CONSOLE} — OrcaRouter keys start sk-orca-`);
|
|
@@ -61,7 +73,24 @@ export async function setupCommand(args, out, deps = {}) {
|
|
|
61
73
|
// `auth:`, not `key:` — the terminal guard redacts any field named `key`, which is right in
|
|
62
74
|
// general and would hide the one thing this line exists to tell you: whether a key was stored at
|
|
63
75
|
// all, and where it came from. The value is a description, never the credential.
|
|
64
|
-
|
|
76
|
+
// The URL, minus anything a credential rides in. `--gateway` takes whatever it is handed, and a
|
|
77
|
+
// gateway that authenticates by URL rather than by header is configured as
|
|
78
|
+
// `https://user:pw@gw.example` or `https://gw.example?key=…`. Printing it verbatim broke the
|
|
79
|
+
// promise made where this file is described — "nothing ever prints it back" — and the terminal
|
|
80
|
+
// guard did not catch it: it matches known key *shapes* (`sk-`, `ghp_`, …) and field *names*,
|
|
81
|
+
// and an arbitrary password in a URL under a field called `gateway` is neither.
|
|
82
|
+
out.info('config.saved', {
|
|
83
|
+
path,
|
|
84
|
+
mode: '0600',
|
|
85
|
+
gateway: recordableOrigin(url) ?? '(unprintable)',
|
|
86
|
+
auth: describeKey(gateway),
|
|
87
|
+
});
|
|
88
|
+
// Said rather than silently dropped: someone who typed a long URL and sees a short one back is
|
|
89
|
+
// owed the reason, and the reason is the useful half — it is also what will and will not appear
|
|
90
|
+
// in every trace recorded through this gateway.
|
|
91
|
+
if (carriesMoreThanOrigin(url)) {
|
|
92
|
+
out.plain(' the rest of that URL is saved and sent, but never printed or written to a trace');
|
|
93
|
+
}
|
|
65
94
|
let available = [];
|
|
66
95
|
try {
|
|
67
96
|
available = await probe(url, gatewayHeaders(config, env));
|
|
@@ -93,7 +122,8 @@ export async function setupCommand(args, out, deps = {}) {
|
|
|
93
122
|
}
|
|
94
123
|
catch (err) {
|
|
95
124
|
out.warn('gateway.unreachable', {
|
|
96
|
-
|
|
125
|
+
// A failed fetch names the URL it was given, credential and all.
|
|
126
|
+
why: withoutCredentials(String(err instanceof Error ? err.message : err)),
|
|
97
127
|
note: 'the config was saved; fix the URL or key and run orca setup again',
|
|
98
128
|
});
|
|
99
129
|
}
|
|
@@ -132,6 +162,21 @@ export async function modelsCommand(args, out, deps = {}) {
|
|
|
132
162
|
out.plain(` a key for the default gateway: ${ORCAROUTER_CONSOLE}`);
|
|
133
163
|
return [];
|
|
134
164
|
}
|
|
165
|
+
// The same standard, applied where a config arrives rather than only where one is typed.
|
|
166
|
+
// `readConfig` deliberately accepts a hand-edited file, so this is the one path on which a
|
|
167
|
+
// gateway carrying its key in the URL can still turn up — and it is the path whose whole job is
|
|
168
|
+
// to report that the gateway cannot be reached. Refusing before the probe means neither the
|
|
169
|
+
// message nor the fetch error it would have quoted can carry the value.
|
|
170
|
+
const configured = unusableOrigin(config.gateway.url);
|
|
171
|
+
if (configured !== undefined) {
|
|
172
|
+
out.failure({
|
|
173
|
+
event: 'gateway.unusable',
|
|
174
|
+
what: `the gateway in ${configPath(env)} is not an origin orca can use`,
|
|
175
|
+
why: configured,
|
|
176
|
+
next: 'orca setup --gateway <url> --key-env NAME',
|
|
177
|
+
});
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
135
180
|
let models;
|
|
136
181
|
try {
|
|
137
182
|
models = await probe(config.gateway.url, gatewayHeaders(config, env));
|
|
@@ -139,8 +184,11 @@ export async function modelsCommand(args, out, deps = {}) {
|
|
|
139
184
|
catch (err) {
|
|
140
185
|
out.failure({
|
|
141
186
|
event: 'gateway.unreachable',
|
|
142
|
-
|
|
143
|
-
|
|
187
|
+
// Never the raw value: this path exists to diagnose a gateway that cannot be reached,
|
|
188
|
+
// and a hand-edited config carrying its key in the URL is one of the reasons it cannot
|
|
189
|
+
// be. Naming the file says as much without printing what is in it.
|
|
190
|
+
what: `could not reach ${recordableOrigin(config.gateway.url) ?? `the gateway configured in ${configPath(env)}`}`,
|
|
191
|
+
why: withoutCredentials(String(err instanceof Error ? err.message : err)),
|
|
144
192
|
next: `check the URL and key in ${configPath(env)}, or run orca setup again`,
|
|
145
193
|
});
|
|
146
194
|
return [];
|
|
@@ -174,4 +222,19 @@ function describeKey(gateway) {
|
|
|
174
222
|
return `from $${gateway.api_key_env}`;
|
|
175
223
|
return 'none';
|
|
176
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* Whether a URL carries anything beyond the origin and path orca is willing to show.
|
|
227
|
+
*
|
|
228
|
+
* Used only to decide whether to explain the shortening. The shortening itself is
|
|
229
|
+
* `recordableOrigin`, and it happens whether or not this returns true.
|
|
230
|
+
*/
|
|
231
|
+
function carriesMoreThanOrigin(url) {
|
|
232
|
+
try {
|
|
233
|
+
const parsed = new URL(url);
|
|
234
|
+
return (parsed.username !== '' || parsed.password !== '' || parsed.search !== '' || parsed.hash !== '');
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
177
240
|
//# sourceMappingURL=setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,EACL,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,WAAW,GAEZ,MAAM,cAAc,CAAC;AAqBtB,8FAA8F;AAC9F,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,OAA+B;IACzE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACjF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAkC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChB,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC;SACpD,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,kFAAkF;AAClF,SAAS,WAAW;IAClB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,KAAK,EAAE,QAAgB,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,GAAW,EACX,OAAkB,EAAE;IAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC;IAEtC,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEnC,iGAAiG;IACjG,gGAAgG;IAChG,4FAA4F;IAC5F,IAAI,CAAC,GAAG,IAAI,GAAG;QAAE,GAAG,GAAG,MAAM,GAAG,CAAC,wCAAwC,cAAc,KAAK,CAAC,CAAC;IAC9F,IAAI,CAAC,GAAG;QAAE,GAAG,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exchange-events.d.ts","sourceRoot":"","sources":["../src/exchange-events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,eAAe,GAAG,gBAAgB,GAAG,WAAW,GAAG,aAAa,CAAC;IACvE,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,oBAAoB;;IAS/B,oEAAoE;IACpE,UAAU,IAAI,eAAe,EAAE;IAO/B;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"exchange-events.d.ts","sourceRoot":"","sources":["../src/exchange-events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,eAAe,GAAG,gBAAgB,GAAG,WAAW,GAAG,aAAa,CAAC;IACvE,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,oBAAoB;;IAS/B,oEAAoE;IACpE,UAAU,IAAI,eAAe,EAAE;IAO/B;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE;IAsGhE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjD,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAI7C;AAyBD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM;AACZ;;;;;;GAMG;AACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,GAC1C,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
|
package/dist/exchange-events.js
CHANGED
|
@@ -58,14 +58,24 @@ export class ExchangeEventDeriver {
|
|
|
58
58
|
path: exchange.path,
|
|
59
59
|
messages: exchange.canonicalRequest.messages.length,
|
|
60
60
|
tools: exchange.canonicalRequest.tools?.length ?? 0,
|
|
61
|
+
// Only where orca established the connection and therefore knows. Absent reads as "not
|
|
62
|
+
// recorded" rather than as HTTP/1.1, which is why it is left off instead of defaulted.
|
|
63
|
+
...(exchange.alpn === undefined ? {} : { alpn: exchange.alpn }),
|
|
61
64
|
},
|
|
62
65
|
payload: exchange.rawRequest,
|
|
63
66
|
// Absent rather than empty when nothing came back: an edge list naming nothing is noise a
|
|
64
67
|
// reader has to interpret, and `causes` is optional precisely so it can be left off.
|
|
65
68
|
...(resultsAt.length > 0 ? { causesIndex: resultsAt } : {}),
|
|
66
69
|
});
|
|
70
|
+
const requestAt = events.length - 1;
|
|
67
71
|
const response = exchange.canonicalResponse;
|
|
68
72
|
events.push({
|
|
73
|
+
// The edge every other request/response pair already had. Without it `orca graph --to` on a
|
|
74
|
+
// model.response walks backwards, finds no incoming edge, and reports that the run has no
|
|
75
|
+
// causal edges at all -- on a run whose graph is otherwise full of them. `net.response`,
|
|
76
|
+
// `tool.result` and `shell.result` all name what they answered; this is the same fact about
|
|
77
|
+
// the pair the recorder watched most directly.
|
|
78
|
+
causesIndex: [requestAt],
|
|
69
79
|
type: 'model.response',
|
|
70
80
|
actor: 'model',
|
|
71
81
|
attrs: {
|
|
@@ -76,6 +86,19 @@ export class ExchangeEventDeriver {
|
|
|
76
86
|
status: exchange.status,
|
|
77
87
|
duration_ms: exchange.durationMs ?? 0,
|
|
78
88
|
streamed: exchange.streamed,
|
|
89
|
+
// The payload below is the decoded body, so the encoding it arrived in is recorded here or
|
|
90
|
+
// nowhere: a promoted exchange keeps no response headers.
|
|
91
|
+
...(exchange.responseDecodedFrom === undefined
|
|
92
|
+
? {}
|
|
93
|
+
: { decoded_from: exchange.responseDecodedFrom }),
|
|
94
|
+
// Who answered. The trace said what was sent and what came back and never this, which is
|
|
95
|
+
// the first question asked of a recording that looks wrong — a gateway left behind in
|
|
96
|
+
// `~/.orca/config.json` redirects every run on the machine, and nothing in the run said so.
|
|
97
|
+
// On the response because it is a fact about the answer, and per exchange rather than in
|
|
98
|
+
// the manifest because the origin is chosen per request: a fork that changes provider
|
|
99
|
+
// changes it again mid-run. Absent means an older orca did not record it, never "the
|
|
100
|
+
// vendor's own API".
|
|
101
|
+
...(exchange.upstream === undefined ? {} : { upstream: exchange.upstream }),
|
|
79
102
|
},
|
|
80
103
|
payload: exchange.rawResponse,
|
|
81
104
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exchange-events.js","sourceRoot":"","sources":["../src/exchange-events.ts"],"names":[],"mappings":"AA6CA,MAAM,OAAO,oBAAoB;IACtB,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IACvD;;;;OAIG;IACM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,oEAAoE;IACpE,UAAU;QACR,2FAA2F;QAC3F,+FAA+F;QAC/F,0FAA0F;QAC1F,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,QAA0B,EAAE,IAAY;QAC7C,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,oFAAoF;QACpF,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,MAAM,IAAI,kBAAkB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnE,6FAA6F;YAC7F,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;gBAAE,SAAS;YACnD,wFAAwF;YACxF,oEAAoE;YACpE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE;oBACL,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,SAAS;oBAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;oBAClC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;iBAC7B;gBACD,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,YAAY,EAAE,MAAM,CAAC,WAAW;aACjC,CAAC,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClC,qFAAqF;YACrF,6FAA6F;YAC7F,6FAA6F;YAC7F,uFAAuF;YACvF,4EAA4E;YAC5E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,OAAO;YACd,KAAK,EAAE;gBACL,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,KAAK;gBACtC,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM;gBACnD,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"exchange-events.js","sourceRoot":"","sources":["../src/exchange-events.ts"],"names":[],"mappings":"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"}
|
package/dist/flags.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,qEAAsE,CAAC;AAQ1F,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAgDxD,CAAC;AAeF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAmBvD;AAiCD,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAe,CAAC;AAE/E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAuB/D"}
|
package/dist/flags.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { NUMERIC, VALUELESS } from './args.js';
|
|
1
2
|
/**
|
|
2
3
|
* Which flags each command accepts.
|
|
3
4
|
*
|
|
@@ -16,6 +17,7 @@ const UPSTREAM = ['upstream-anthropic', 'upstream-openai'];
|
|
|
16
17
|
/** Read by `tls-capture.ts`, which record, replay and compare all set up. */
|
|
17
18
|
const TLS = ['tls-intercept', 'tls-hosts'];
|
|
18
19
|
export const BY_COMMAND = {
|
|
20
|
+
quickstart: ['dir', 'full'],
|
|
19
21
|
record: ['fs', 'shell', 'mcp-config', ...TLS, ...UPSTREAM],
|
|
20
22
|
attach: [
|
|
21
23
|
'for',
|
|
@@ -41,6 +43,7 @@ export const BY_COMMAND = {
|
|
|
41
43
|
'mcp-config',
|
|
42
44
|
...TLS,
|
|
43
45
|
...UPSTREAM,
|
|
46
|
+
'quiet',
|
|
44
47
|
],
|
|
45
48
|
compare: ['from', 'models', 'verify', 'share', 'loose', ...TLS, ...UPSTREAM],
|
|
46
49
|
show: [],
|
|
@@ -89,11 +92,14 @@ export function assertKnownFlags(args) {
|
|
|
89
92
|
return;
|
|
90
93
|
const known = [...allowed, ...GLOBAL];
|
|
91
94
|
const unknown = Object.keys(args.flags).filter((name) => !known.includes(name));
|
|
92
|
-
|
|
95
|
+
// Names first: "unknown flag --modle" is a better answer than "--modle needs a value".
|
|
96
|
+
if (unknown.length === 0) {
|
|
97
|
+
assertUsableValues(args, known);
|
|
93
98
|
return;
|
|
99
|
+
}
|
|
94
100
|
const [first] = unknown;
|
|
95
101
|
const suggestion = nearest(first, known);
|
|
96
|
-
throw new Error(`unknown flag
|
|
102
|
+
throw new Error(`unknown flag ${dashed(first)} for "orca ${args.command}"` +
|
|
97
103
|
(suggestion === undefined ? '' : `\n did you mean --${suggestion}?`) +
|
|
98
104
|
`\n flags for this command: ${allowed.length === 0 ? '(none)' : allowed.map((f) => `--${f}`).join(' ')}`);
|
|
99
105
|
}
|
|
@@ -116,6 +122,8 @@ const POSITIONALS = {
|
|
|
116
122
|
export: 1,
|
|
117
123
|
ui: 1,
|
|
118
124
|
scrub: 1,
|
|
125
|
+
// Configured entirely by `--dir`, like `attach` below it.
|
|
126
|
+
quickstart: 0,
|
|
119
127
|
attach: 0,
|
|
120
128
|
list: 0,
|
|
121
129
|
gc: 0,
|
|
@@ -162,4 +170,62 @@ export function assertNoStrayPositionals(args) {
|
|
|
162
170
|
takesLine +
|
|
163
171
|
forAgent);
|
|
164
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* A flag as the person would have typed it.
|
|
175
|
+
*
|
|
176
|
+
* Every short flag here is one character, so the count of dashes follows from the length. Telling
|
|
177
|
+
* someone `--o needs a value` when they typed `-o` sends them looking for a flag that does not
|
|
178
|
+
* exist.
|
|
179
|
+
*/
|
|
180
|
+
function dashed(name) {
|
|
181
|
+
return name.length === 1 ? `-${name}` : `--${name}`;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Reject a flag whose value cannot be honoured.
|
|
185
|
+
*
|
|
186
|
+
* `assertKnownFlags` settled the names; the values were still taken on trust. Every accessor falls
|
|
187
|
+
* back in silence when a value is missing or of the wrong shape, so the instruction vanished and
|
|
188
|
+
* the run reported success having done something else:
|
|
189
|
+
*
|
|
190
|
+
* `--model` with nothing after it turned a fork into a plain replay, and the two models being
|
|
191
|
+
* compared agreed because only one of them ever ran. `--match a --match b` redacted `b` alone and
|
|
192
|
+
* reported its count as though that were the whole job. `--from four` replayed everything instead
|
|
193
|
+
* of forking at a checkpoint. `--json=maybe` turned JSON output off while it was being asked for.
|
|
194
|
+
*
|
|
195
|
+
* Same reasoning as `assertNoStrayPositionals` beside it, third part of the command line: an
|
|
196
|
+
* instruction orca cannot carry out must not be carried past in silence.
|
|
197
|
+
*
|
|
198
|
+
* `orca gc --keep` checked its own by hand and was the only command that did. Doing it here is the
|
|
199
|
+
* same check for all of them, and one place to fix when it is wrong.
|
|
200
|
+
*/
|
|
201
|
+
function assertUsableValues(args, allowed) {
|
|
202
|
+
for (const name of Object.keys(args.flags)) {
|
|
203
|
+
const value = args.flags[name];
|
|
204
|
+
// Repeating a flag is how most CLIs take a list, so people write it. Say which form is one here
|
|
205
|
+
// rather than only saying no.
|
|
206
|
+
if (args.conflicting.has(name)) {
|
|
207
|
+
const listForm = [`${name}s`, `${name}es`].find((f) => allowed.includes(f));
|
|
208
|
+
throw new Error(`${dashed(name)} given more than once, and only the last would have counted` +
|
|
209
|
+
(listForm === undefined
|
|
210
|
+
? '\n give it once'
|
|
211
|
+
: `\n for several, use one --${listForm}: --${listForm} a,b,c`));
|
|
212
|
+
}
|
|
213
|
+
if (NUMERIC.has(name)) {
|
|
214
|
+
if (args.missingValue.has(name) || typeof value === 'string') {
|
|
215
|
+
throw new Error(`${dashed(name)} needs a number, like ${dashed(name)} 4`);
|
|
216
|
+
}
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
// `--flag`, `--flag=true` and `--no-flag` all arrive as a boolean. Anything else is a value on
|
|
220
|
+
// a switch, and the switch would then have read as off.
|
|
221
|
+
if (VALUELESS.has(name)) {
|
|
222
|
+
if (typeof value === 'string') {
|
|
223
|
+
throw new Error(`${dashed(name)} takes no value; it is either given or it is not`);
|
|
224
|
+
}
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (args.missingValue.has(name))
|
|
228
|
+
throw new Error(`${dashed(name)} needs a value`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
165
231
|
//# sourceMappingURL=flags.js.map
|
package/dist/flags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AA4IA,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwH/E"}
|
package/dist/main.js
CHANGED
|
@@ -4,6 +4,7 @@ import { Orca } from './api.js';
|
|
|
4
4
|
import { serveMcp } from './mcp-server.js';
|
|
5
5
|
import { Output } from './out.js';
|
|
6
6
|
import { attachCommand } from './commands/attach.js';
|
|
7
|
+
import { quickstartCommand } from './commands/quickstart.js';
|
|
7
8
|
import { recordCommand } from './commands/record.js';
|
|
8
9
|
import { replayCommand } from './commands/replay.js';
|
|
9
10
|
import { checkpointsCommand, graphCommand, exportCommand, listCommand, showCommand, uiCommand, } from './commands/inspect.js';
|
|
@@ -15,6 +16,10 @@ import { modelsCommand, setupCommand } from './commands/setup.js';
|
|
|
15
16
|
import { ORCA_VERSION } from './version.js';
|
|
16
17
|
const HELP = `orca ${ORCA_VERSION} — record, replay and fork debugger for AI agents
|
|
17
18
|
|
|
19
|
+
orca quickstart a project, a recorded run and an offline replay of it —
|
|
20
|
+
no key, no agent installed, no network
|
|
21
|
+
--dir <path> where to put it (default: ./orca-quickstart)
|
|
22
|
+
--full the whole timeline and the replay as it happened
|
|
18
23
|
orca record <agent> run an agent and capture everything
|
|
19
24
|
orca attach record an agent orca does not launch — one in a sandbox,
|
|
20
25
|
a container, or on another machine
|
|
@@ -25,6 +30,7 @@ const HELP = `orca ${ORCA_VERSION} — record, replay and fork debugger for AI a
|
|
|
25
30
|
--replay <run> serve a recording back to that agent instead of recording,
|
|
26
31
|
for a run whose agent is not on this machine
|
|
27
32
|
orca replay [run] reproduce a run exactly, network off
|
|
33
|
+
--quiet discard the replayed agent's own output, keep the verdict
|
|
28
34
|
--ui open the timeline when it finishes
|
|
29
35
|
orca replay [run] --from N fork from a checkpoint and continue live
|
|
30
36
|
--model <id> continue on a different model
|
|
@@ -113,6 +119,15 @@ For a script, an agent, or CI — every command below also answers as data:
|
|
|
113
119
|
|
|
114
120
|
Docs: https://github.com/Continuum-AI-Corp/OrcaReplay
|
|
115
121
|
`;
|
|
122
|
+
/**
|
|
123
|
+
* The commands `--json` answers and the terminal does not.
|
|
124
|
+
*
|
|
125
|
+
* A set rather than a special case. It holds one name today, and the point of the shape is that
|
|
126
|
+
* adding a second `--json`-only view does not quietly bring back `orca events` telling a reader
|
|
127
|
+
* that a command `--help` had just listed does not exist. `json-only.test.ts` derives the same set
|
|
128
|
+
* from the two switches in this file and fails when this disagrees with them.
|
|
129
|
+
*/
|
|
130
|
+
const JSON_ONLY = new Set(['events']);
|
|
116
131
|
export async function main(argv, cwd = process.cwd()) {
|
|
117
132
|
const args = parseArgs(argv);
|
|
118
133
|
if (args.bool('json'))
|
|
@@ -148,6 +163,10 @@ export async function main(argv, cwd = process.cwd()) {
|
|
|
148
163
|
// instruction that went nowhere, and for `record` it is the agent's own arguments.
|
|
149
164
|
assertNoStrayPositionals(args);
|
|
150
165
|
switch (args.command) {
|
|
166
|
+
case 'quickstart':
|
|
167
|
+
// Non-zero when the demo did not actually happen, so a broken environment is a failure a
|
|
168
|
+
// script can see rather than a wall of green text that says the opposite.
|
|
169
|
+
return (await quickstartCommand(args, out, cwd)).ok ? 0 : 1;
|
|
151
170
|
case 'record':
|
|
152
171
|
return (await recordCommand(args, out, cwd)).exitCode;
|
|
153
172
|
case 'attach':
|
|
@@ -196,6 +215,19 @@ export async function main(argv, cwd = process.cwd()) {
|
|
|
196
215
|
await serveMcp({ orca: new Orca({ cwd }), input: process.stdin, output: process.stdout });
|
|
197
216
|
return 0;
|
|
198
217
|
default:
|
|
218
|
+
// `--json` answers one view that the terminal does not, and `--help` lists it beside seven
|
|
219
|
+
// that it does. A reader scanning that line reasonably types `orca events`, and being told
|
|
220
|
+
// there is no such command — by the same tool that had just named it — reads as the CLI
|
|
221
|
+
// contradicting itself. Name the route instead.
|
|
222
|
+
if (JSON_ONLY.has(args.command)) {
|
|
223
|
+
out.failure({
|
|
224
|
+
event: 'json_only_command',
|
|
225
|
+
what: `${args.command} answers as data, not as a table`,
|
|
226
|
+
why: 'these are the raw trace records; `orca show` is the same events, rendered',
|
|
227
|
+
next: `orca ${args.command} --json`,
|
|
228
|
+
});
|
|
229
|
+
return 2;
|
|
230
|
+
}
|
|
199
231
|
out.failure({
|
|
200
232
|
event: 'unknown_command',
|
|
201
233
|
what: `there is no "${args.command}" command`,
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,IAAI,GAAG,QAAQ,YAAY
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/tls-capture.d.ts
CHANGED
|
@@ -47,9 +47,17 @@ export interface TlsCapture {
|
|
|
47
47
|
* Everything `setupTlsCapture` can refuse, without creating anything.
|
|
48
48
|
*
|
|
49
49
|
* A caller that has a trace directory to lose needs the refusal to happen first: a run abandoned
|
|
50
|
-
* by a throw leaves an unsealed directory behind, and an unsealed directory wins `last`.
|
|
50
|
+
* by a throw leaves an unsealed directory behind, and an unsealed directory wins `last`. An exact
|
|
51
|
+
* replay has more than that to lose — it calls this before `replayWorkspace`, which writes the
|
|
52
|
+
* recording over the operator's checkout.
|
|
53
|
+
*
|
|
54
|
+
* `extraOriginRoots` is here for the second reason and not the first. It reads files, so it was
|
|
55
|
+
* left out of a function whose whole point was to decide from the arguments alone — but that made
|
|
56
|
+
* this only *most* of what `setupTlsCapture` refuses, and an unreadable `ORCA_TLS_UPSTREAM_CA`
|
|
57
|
+
* went on failing late, past the restore. The roots are read again below, microseconds later and
|
|
58
|
+
* on a path the run was going to read anyway.
|
|
51
59
|
*/
|
|
52
|
-
export declare function planTlsCapture(args: ParsedArgs, recordedHosts?: readonly string[]): void
|
|
60
|
+
export declare function planTlsCapture(args: ParsedArgs, recordedHosts?: readonly string[]): Promise<void>;
|
|
53
61
|
export declare function setupTlsCapture(req: TlsCaptureRequest): Promise<TlsCapture>;
|
|
54
62
|
/**
|
|
55
63
|
* The hosts a recorded run decrypted, read back out of its own trace.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tls-capture.d.ts","sourceRoot":"","sources":["../src/tls-capture.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"tls-capture.d.ts","sourceRoot":"","sources":["../src/tls-capture.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAGL,KAAK,EAGL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAEtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,IAAI,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,oFAAoF;IACpF,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,8EAA8E;IAC9E,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAChC,OAAO,CAAC,IAAI,CAAC,CAIf;AAyBD,wBAAsB,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CA4CjF;AAkED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAY7F;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
|
package/dist/tls-capture.js
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { dirname } from 'node:path';
|
|
3
|
-
import { HostPolicy, RunCa, resolveTlsHosts, } from '@orcareplay/proxy';
|
|
3
|
+
import { DEFAULT_MAX_CAPTURED_BYTES, HostPolicy, RunCa, resolveTlsHosts, } from '@orcareplay/proxy';
|
|
4
4
|
/**
|
|
5
5
|
* Everything `setupTlsCapture` can refuse, without creating anything.
|
|
6
6
|
*
|
|
7
7
|
* A caller that has a trace directory to lose needs the refusal to happen first: a run abandoned
|
|
8
|
-
* by a throw leaves an unsealed directory behind, and an unsealed directory wins `last`.
|
|
8
|
+
* by a throw leaves an unsealed directory behind, and an unsealed directory wins `last`. An exact
|
|
9
|
+
* replay has more than that to lose — it calls this before `replayWorkspace`, which writes the
|
|
10
|
+
* recording over the operator's checkout.
|
|
11
|
+
*
|
|
12
|
+
* `extraOriginRoots` is here for the second reason and not the first. It reads files, so it was
|
|
13
|
+
* left out of a function whose whole point was to decide from the arguments alone — but that made
|
|
14
|
+
* this only *most* of what `setupTlsCapture` refuses, and an unreadable `ORCA_TLS_UPSTREAM_CA`
|
|
15
|
+
* went on failing late, past the restore. The roots are read again below, microseconds later and
|
|
16
|
+
* on a path the run was going to read anyway.
|
|
9
17
|
*/
|
|
10
|
-
export function planTlsCapture(args, recordedHosts) {
|
|
18
|
+
export async function planTlsCapture(args, recordedHosts) {
|
|
11
19
|
if (!interceptionRequested(args, recordedHosts))
|
|
12
20
|
return;
|
|
13
21
|
HostPolicy.from([...resolveTlsHosts(args.list('tls-hosts'), recordedHosts)]);
|
|
22
|
+
await extraOriginRoots();
|
|
14
23
|
}
|
|
15
24
|
/**
|
|
16
25
|
* Is this run intercepting?
|
|
@@ -93,6 +102,12 @@ export async function setupTlsCapture(req) {
|
|
|
93
102
|
function warnUnclaimed(out, reported, exchange) {
|
|
94
103
|
if (exchange.method !== 'POST')
|
|
95
104
|
return;
|
|
105
|
+
// No response ever arrived, so this one is not evidence that a path went unrecognised. It is
|
|
106
|
+
// kept as network traffic because an exchange with nothing to replay cannot be a model exchange
|
|
107
|
+
// whatever dialect exists -- and telling the operator to write one would not change that. A
|
|
108
|
+
// harness that opens a call and leaves would otherwise print this on every turn.
|
|
109
|
+
if (exchange.status === 0)
|
|
110
|
+
return;
|
|
96
111
|
const body = exchange.requestBody.trim();
|
|
97
112
|
if (!body.startsWith('{'))
|
|
98
113
|
return;
|
|
@@ -115,6 +130,21 @@ function warnUnclaimed(out, reported, exchange) {
|
|
|
115
130
|
if (reported.has(key))
|
|
116
131
|
return;
|
|
117
132
|
reported.add(key);
|
|
133
|
+
// A body cut mid-JSON at the capture limit is a different fact from a path nobody claims, and
|
|
134
|
+
// the advice differs with it: no dialect can read a truncated body, so writing one changes
|
|
135
|
+
// nothing. Driving a 1.2 MiB request through an intercepted host printed the wrong one of these
|
|
136
|
+
// -- `no wire dialect claims this path`, about a path the openai dialect had claimed all along.
|
|
137
|
+
if (exchange.requestTruncated) {
|
|
138
|
+
out.warn('tls.request_too_large', {
|
|
139
|
+
host: exchange.host,
|
|
140
|
+
path: exchange.path,
|
|
141
|
+
limit_bytes: DEFAULT_MAX_CAPTURED_BYTES,
|
|
142
|
+
detail: 'the request body was cut at the capture limit, so no dialect could read it',
|
|
143
|
+
consequence: 'it replays as opaque network traffic and cannot be forked to another model',
|
|
144
|
+
next: 'orca show <run> reads the prefix that was kept',
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
118
148
|
out.warn('tls.unclaimed_path', {
|
|
119
149
|
host: exchange.host,
|
|
120
150
|
path: exchange.path,
|
|
@@ -239,7 +269,15 @@ export async function persistNetExchange(writer, turn, exchange) {
|
|
|
239
269
|
intercepted: true,
|
|
240
270
|
headers: exchange.responseHeaders,
|
|
241
271
|
bytes: exchange.responseBytes,
|
|
272
|
+
// What orca decompressed, next to the header set that no longer describes it. `bytes` is
|
|
273
|
+
// still the wire count, so the two together say how much the encoding was worth.
|
|
274
|
+
...(exchange.responseDecodedFrom === undefined
|
|
275
|
+
? {}
|
|
276
|
+
: { decoded_from: exchange.responseDecodedFrom }),
|
|
242
277
|
truncated: exchange.responseTruncated,
|
|
278
|
+
// Only when it happened, so a normal exchange carries no field saying it was normal. It
|
|
279
|
+
// reads differently from `truncated`: the agent stopped reading, orca did not stop keeping.
|
|
280
|
+
...(exchange.abandoned ? { abandoned: true } : {}),
|
|
243
281
|
duration_ms: exchange.durationMs,
|
|
244
282
|
},
|
|
245
283
|
payload: exchange.responseBody,
|