@garygentry/system1-core 0.1.0
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/LICENSE +21 -0
- package/README.md +13 -0
- package/dist/config/consent.d.ts +11 -0
- package/dist/config/consent.d.ts.map +1 -0
- package/dist/config/consent.js +33 -0
- package/dist/config/consent.js.map +1 -0
- package/dist/config/load.d.ts +64 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +216 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/session.d.ts +31 -0
- package/dist/config/session.d.ts.map +1 -0
- package/dist/config/session.js +36 -0
- package/dist/config/session.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/decide.d.ts +57 -0
- package/dist/decide.d.ts.map +1 -0
- package/dist/decide.js +87 -0
- package/dist/decide.js.map +1 -0
- package/dist/egress/exclude.d.ts +24 -0
- package/dist/egress/exclude.d.ts.map +1 -0
- package/dist/egress/exclude.js +60 -0
- package/dist/egress/exclude.js.map +1 -0
- package/dist/egress/scrub.d.ts +12 -0
- package/dist/egress/scrub.d.ts.map +1 -0
- package/dist/egress/scrub.js +84 -0
- package/dist/egress/scrub.js.map +1 -0
- package/dist/egress/size.d.ts +16 -0
- package/dist/egress/size.d.ts.map +1 -0
- package/dist/egress/size.js +25 -0
- package/dist/egress/size.js.map +1 -0
- package/dist/errors.d.ts +44 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +23 -0
- package/dist/errors.js.map +1 -0
- package/dist/fixtures/store.d.ts +34 -0
- package/dist/fixtures/store.d.ts.map +1 -0
- package/dist/fixtures/store.js +74 -0
- package/dist/fixtures/store.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/model/answers.d.ts +38 -0
- package/dist/model/answers.d.ts.map +1 -0
- package/dist/model/answers.js +48 -0
- package/dist/model/answers.js.map +1 -0
- package/dist/model/profiles.d.ts +39 -0
- package/dist/model/profiles.d.ts.map +1 -0
- package/dist/model/profiles.js +42 -0
- package/dist/model/profiles.js.map +1 -0
- package/dist/model/types.d.ts +107 -0
- package/dist/model/types.d.ts.map +1 -0
- package/dist/model/types.js +17 -0
- package/dist/model/types.js.map +1 -0
- package/dist/model/validate.d.ts +17 -0
- package/dist/model/validate.d.ts.map +1 -0
- package/dist/model/validate.js +151 -0
- package/dist/model/validate.js.map +1 -0
- package/dist/ping.d.ts +30 -0
- package/dist/ping.d.ts.map +1 -0
- package/dist/ping.js +50 -0
- package/dist/ping.js.map +1 -0
- package/dist/prepare.d.ts +39 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +84 -0
- package/dist/prepare.js.map +1 -0
- package/dist/project/project.d.ts +64 -0
- package/dist/project/project.d.ts.map +1 -0
- package/dist/project/project.js +144 -0
- package/dist/project/project.js.map +1 -0
- package/dist/run/budget.d.ts +20 -0
- package/dist/run/budget.d.ts.map +1 -0
- package/dist/run/budget.js +31 -0
- package/dist/run/budget.js.map +1 -0
- package/dist/run/pool.d.ts +16 -0
- package/dist/run/pool.d.ts.map +1 -0
- package/dist/run/pool.js +35 -0
- package/dist/run/pool.js.map +1 -0
- package/dist/run/spend.d.ts +34 -0
- package/dist/run/spend.d.ts.map +1 -0
- package/dist/run/spend.js +55 -0
- package/dist/run/spend.js.map +1 -0
- package/dist/sources/read.d.ts +40 -0
- package/dist/sources/read.d.ts.map +1 -0
- package/dist/sources/read.js +294 -0
- package/dist/sources/read.js.map +1 -0
- package/dist/sources/types.d.ts +79 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +2 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/spec/expect.d.ts +39 -0
- package/dist/spec/expect.d.ts.map +1 -0
- package/dist/spec/expect.js +95 -0
- package/dist/spec/expect.js.map +1 -0
- package/dist/spec/spec.d.ts +90 -0
- package/dist/spec/spec.d.ts.map +1 -0
- package/dist/spec/spec.js +252 -0
- package/dist/spec/spec.js.map +1 -0
- package/dist/split/split.d.ts +33 -0
- package/dist/split/split.d.ts.map +1 -0
- package/dist/split/split.js +116 -0
- package/dist/split/split.js.map +1 -0
- package/dist/testdata/index.d.ts +5 -0
- package/dist/testdata/index.d.ts.map +1 -0
- package/dist/testdata/index.js +6 -0
- package/dist/testdata/index.js.map +1 -0
- package/dist/testkit/fake-model.d.ts +14 -0
- package/dist/testkit/fake-model.d.ts.map +1 -0
- package/dist/testkit/fake-model.js +57 -0
- package/dist/testkit/fake-model.js.map +1 -0
- package/dist/testkit/tmp.d.ts +6 -0
- package/dist/testkit/tmp.d.ts.map +1 -0
- package/dist/testkit/tmp.js +46 -0
- package/dist/testkit/tmp.js.map +1 -0
- package/dist/tools/ask.d.ts +32 -0
- package/dist/tools/ask.d.ts.map +1 -0
- package/dist/tools/ask.js +59 -0
- package/dist/tools/ask.js.map +1 -0
- package/dist/tools/context.d.ts +52 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +130 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/doctor.d.ts +37 -0
- package/dist/tools/doctor.d.ts.map +1 -0
- package/dist/tools/doctor.js +203 -0
- package/dist/tools/doctor.js.map +1 -0
- package/dist/tools/many.d.ts +74 -0
- package/dist/tools/many.d.ts.map +1 -0
- package/dist/tools/many.js +141 -0
- package/dist/tools/many.js.map +1 -0
- package/dist/tools/schemas.d.ts +293 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +112 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/spec-check.d.ts +48 -0
- package/dist/tools/spec-check.d.ts.map +1 -0
- package/dist/tools/spec-check.js +164 -0
- package/dist/tools/spec-check.js.map +1 -0
- package/dist/tools/usage.d.ts +11 -0
- package/dist/tools/usage.d.ts.map +1 -0
- package/dist/tools/usage.js +27 -0
- package/dist/tools/usage.js.map +1 -0
- package/dist/transport/openrouter.d.ts +38 -0
- package/dist/transport/openrouter.d.ts.map +1 -0
- package/dist/transport/openrouter.js +89 -0
- package/dist/transport/openrouter.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/wiring.d.ts +30 -0
- package/dist/wiring.d.ts.map +1 -0
- package/dist/wiring.js +31 -0
- package/dist/wiring.js.map +1 -0
- package/package.json +63 -0
package/dist/decide.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { assertConsent } from "./config/consent.js";
|
|
2
|
+
import { scrubQuestions, scrubState } from "./egress/scrub.js";
|
|
3
|
+
import { assertStateFits } from "./egress/size.js";
|
|
4
|
+
import { DecisionsError } from "./errors.js";
|
|
5
|
+
import { fixtureKey } from "./fixtures/store.js";
|
|
6
|
+
import { undecidedNames } from "./model/answers.js";
|
|
7
|
+
import { assertQuestionSet } from "./model/validate.js";
|
|
8
|
+
const ZERO = { input_tokens: 0, output_tokens: 0, cost: 0 };
|
|
9
|
+
export function createDecider(options) {
|
|
10
|
+
const { profile, transport, fixtures, ledger, session } = options;
|
|
11
|
+
const now = options.now ?? (() => new Date());
|
|
12
|
+
const mode = (options.mode ?? "auto") === "auto"
|
|
13
|
+
? transport
|
|
14
|
+
? "live"
|
|
15
|
+
: "replay"
|
|
16
|
+
: options.mode;
|
|
17
|
+
if ((mode === "live" || mode === "record") && !transport) {
|
|
18
|
+
throw new DecisionsError("no-key", "A live decision needs OPENROUTER_API_KEY. Without one only replay of recorded fixtures is available.");
|
|
19
|
+
}
|
|
20
|
+
if ((mode === "record" || mode === "replay") && !fixtures) {
|
|
21
|
+
throw new DecisionsError("invalid-request", `Mode "${mode}" needs a fixture store`);
|
|
22
|
+
}
|
|
23
|
+
const log = (source, model, usage) => ledger?.append({
|
|
24
|
+
ts: now().toISOString(),
|
|
25
|
+
...(session ? { session } : {}),
|
|
26
|
+
model,
|
|
27
|
+
source,
|
|
28
|
+
calls: 1,
|
|
29
|
+
...usage,
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
mode,
|
|
33
|
+
async decide({ state, questions, namespace = "adhoc", signal }) {
|
|
34
|
+
assertQuestionSet(questions);
|
|
35
|
+
// The last boundary before the wire. `prepare()` has usually scrubbed
|
|
36
|
+
// and sized the state already; doing it here too means a caller using
|
|
37
|
+
// the library directly still cannot send a secret or an oversized
|
|
38
|
+
// state. Scrubbing is idempotent, so fixture keys are unaffected.
|
|
39
|
+
const safeState = scrubState(state);
|
|
40
|
+
const safeQuestions = scrubQuestions(questions);
|
|
41
|
+
assertStateFits(namespace, safeState, safeQuestions, profile);
|
|
42
|
+
const request = {
|
|
43
|
+
model: profile.id,
|
|
44
|
+
state: safeState,
|
|
45
|
+
questions: safeQuestions,
|
|
46
|
+
};
|
|
47
|
+
const key = fixtureKey(request);
|
|
48
|
+
if (mode === "replay") {
|
|
49
|
+
const started = performance.now();
|
|
50
|
+
const record = fixtures?.lookup(namespace, request);
|
|
51
|
+
if (!record) {
|
|
52
|
+
throw new DecisionsError("replay-miss", `No recorded answer for this request (namespace "${namespace}", key ${key.slice(0, 12)}…). ` +
|
|
53
|
+
"Record it with a live call, or set OPENROUTER_API_KEY.", { namespace, key });
|
|
54
|
+
}
|
|
55
|
+
log("replay", profile.id, ZERO);
|
|
56
|
+
return {
|
|
57
|
+
source: "replay",
|
|
58
|
+
model: profile.id,
|
|
59
|
+
servedBy: record.response.model,
|
|
60
|
+
answers: record.response.answers,
|
|
61
|
+
undecided: undecidedNames(record.response.answers, profile.undecidedFloor),
|
|
62
|
+
usage: ZERO,
|
|
63
|
+
latencyMs: Math.round(performance.now() - started),
|
|
64
|
+
fixtureKey: key,
|
|
65
|
+
recordedAt: record.recordedAt,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// mode is live or record; the constructor guaranteed a transport.
|
|
69
|
+
assertConsent({ granted: options.egressConsent }, options.repoRoot ?? "this repo");
|
|
70
|
+
const { response, latencyMs } = await transport.decide(request, signal);
|
|
71
|
+
const recorded = mode === "record" ? fixtures?.record(namespace, request, response, now()) : undefined;
|
|
72
|
+
log("live", profile.id, response.usage);
|
|
73
|
+
return {
|
|
74
|
+
source: "live",
|
|
75
|
+
model: profile.id,
|
|
76
|
+
servedBy: response.model,
|
|
77
|
+
answers: response.answers,
|
|
78
|
+
undecided: undecidedNames(response.answers, profile.undecidedFloor),
|
|
79
|
+
usage: response.usage,
|
|
80
|
+
latencyMs,
|
|
81
|
+
fixtureKey: key,
|
|
82
|
+
...(recorded ? { recordedAt: recorded.recordedAt } : {}),
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=decide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decide.js","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AA2DvD,MAAM,IAAI,GAAU,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;AAElE,MAAM,UAAU,aAAa,CAAC,OAAuB;IACnD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,IAAI,GACR,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,MAAM;QACjC,CAAC,CAAC,SAAS;YACT,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,QAAQ;QACZ,CAAC,CAAE,OAAO,CAAC,IAAoC,CAAA;IAEnD,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzD,MAAM,IAAI,cAAc,CACtB,QAAQ,EACR,sGAAsG,CACvG,CAAA;IACH,CAAC;IACD,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,cAAc,CAAC,iBAAiB,EAAE,SAAS,IAAI,yBAAyB,CAAC,CAAA;IACrF,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,MAAoB,EAAE,KAAa,EAAE,KAAY,EAAE,EAAE,CAChE,MAAM,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE;QACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,KAAK;QACL,MAAM;QACN,KAAK,EAAE,CAAC;QACR,GAAG,KAAK;KACT,CAAC,CAAA;IAEJ,OAAO;QACL,IAAI;QACJ,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,EAAE,MAAM,EAAE;YAC5D,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAC5B,sEAAsE;YACtE,sEAAsE;YACtE,kEAAkE;YAClE,kEAAkE;YAClE,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;YACnC,MAAM,aAAa,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;YAC/C,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;YAC7D,MAAM,OAAO,GAAoB;gBAC/B,KAAK,EAAE,OAAO,CAAC,EAAE;gBACjB,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,aAAa;aACzB,CAAA;YACD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAE/B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;gBACjC,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;gBACnD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,cAAc,CACtB,aAAa,EACb,mDAAmD,SAAS,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM;wBAC1F,wDAAwD,EAC1D,EAAE,SAAS,EAAE,GAAG,EAAE,CACnB,CAAA;gBACH,CAAC;gBACD,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;gBAC/B,OAAO;oBACL,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,OAAO,CAAC,EAAE;oBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;oBAC/B,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;oBAChC,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC;oBAC1E,KAAK,EAAE,IAAI;oBACX,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;oBAClD,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,MAAM,CAAC,UAAU;iBAC9B,CAAA;YACH,CAAC;YAED,kEAAkE;YAClE,aAAa,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAA;YAClF,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAO,SAAuB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACtF,MAAM,QAAQ,GACZ,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACvF,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;YACvC,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,OAAO,CAAC,EAAE;gBACjB,QAAQ,EAAE,QAAQ,CAAC,KAAK;gBACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,SAAS,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC;gBACnE,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,SAAS;gBACT,UAAU,EAAE,GAAG;gBACf,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzD,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Skipped } from "../sources/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Paths never sent to the provider, whatever the source. Config adds to these
|
|
4
|
+
* (`egress.exclude`); it cannot remove them.
|
|
5
|
+
*/
|
|
6
|
+
export declare const DEFAULT_EXCLUDES: readonly string[];
|
|
7
|
+
export interface ExcludeResult<T> {
|
|
8
|
+
items: T[];
|
|
9
|
+
excluded: Skipped[];
|
|
10
|
+
}
|
|
11
|
+
/** Anything path-labelled: a document before splitting, or an item after it. */
|
|
12
|
+
type PathLabelled = {
|
|
13
|
+
path?: string;
|
|
14
|
+
realPath?: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Drop items whose path matches an exclude pattern. Every drop is reported
|
|
18
|
+
* with the pattern that caused it, so the caller can say what was withheld.
|
|
19
|
+
*/
|
|
20
|
+
export declare function applyExcludes<T extends PathLabelled>(items: readonly T[], extra?: readonly string[]): ExcludeResult<T>;
|
|
21
|
+
/** Whether one path is excluded, for checks before a source is read. */
|
|
22
|
+
export declare function isExcluded(path: string, extra?: readonly string[]): string | undefined;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=exclude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exclude.d.ts","sourceRoot":"","sources":["../../src/egress/exclude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAuB7C,CAAA;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,QAAQ,EAAE,OAAO,EAAE,CAAA;CACpB;AAED,gFAAgF;AAChF,KAAK,YAAY,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAExD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,YAAY,EAClD,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,GAAE,SAAS,MAAM,EAAO,GAC5B,aAAa,CAAC,CAAC,CAAC,CAqBlB;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,GAAG,SAAS,CAE1F"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import picomatch from "picomatch";
|
|
2
|
+
/**
|
|
3
|
+
* Paths never sent to the provider, whatever the source. Config adds to these
|
|
4
|
+
* (`egress.exclude`); it cannot remove them.
|
|
5
|
+
*/
|
|
6
|
+
export const DEFAULT_EXCLUDES = [
|
|
7
|
+
"**/.env",
|
|
8
|
+
"**/.env.*",
|
|
9
|
+
"**/*.pem",
|
|
10
|
+
"**/*.key",
|
|
11
|
+
"**/*.p12",
|
|
12
|
+
"**/*.pfx",
|
|
13
|
+
"**/*.jks",
|
|
14
|
+
"**/*.keystore",
|
|
15
|
+
"**/id_rsa*",
|
|
16
|
+
"**/id_ed25519*",
|
|
17
|
+
"**/id_ecdsa*",
|
|
18
|
+
"**/.npmrc",
|
|
19
|
+
"**/.pypirc",
|
|
20
|
+
"**/.netrc",
|
|
21
|
+
"**/.git-credentials",
|
|
22
|
+
"**/.aws/credentials",
|
|
23
|
+
"**/.ssh/**",
|
|
24
|
+
"**/.docker/config.json",
|
|
25
|
+
"**/*.tfstate",
|
|
26
|
+
"**/*.tfstate.*",
|
|
27
|
+
"**/secrets/**",
|
|
28
|
+
"**/.system1/credentials",
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Drop items whose path matches an exclude pattern. Every drop is reported
|
|
32
|
+
* with the pattern that caused it, so the caller can say what was withheld.
|
|
33
|
+
*/
|
|
34
|
+
export function applyExcludes(items, extra = []) {
|
|
35
|
+
const patterns = [...DEFAULT_EXCLUDES, ...extra];
|
|
36
|
+
const matchers = patterns.map((p) => ({ p, test: picomatch(p, { dot: true }) }));
|
|
37
|
+
const kept = [];
|
|
38
|
+
const excluded = new Map();
|
|
39
|
+
for (const item of items) {
|
|
40
|
+
// Both spellings: a symlink's own name and what it resolves to.
|
|
41
|
+
const paths = [item.path, item.realPath].filter((p) => p !== undefined);
|
|
42
|
+
const hit = paths.length ? matchers.find((m) => paths.some((p) => m.test(p))) : undefined;
|
|
43
|
+
if (hit && item.path) {
|
|
44
|
+
excluded.set(item.path, {
|
|
45
|
+
path: item.path,
|
|
46
|
+
reason: "excluded",
|
|
47
|
+
detail: item.realPath && item.realPath !== item.path ? `${hit.p} (via ${item.realPath})` : hit.p,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
kept.push(item);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { items: kept, excluded: [...excluded.values()] };
|
|
55
|
+
}
|
|
56
|
+
/** Whether one path is excluded, for checks before a source is read. */
|
|
57
|
+
export function isExcluded(path, extra = []) {
|
|
58
|
+
return [...DEFAULT_EXCLUDES, ...extra].find((p) => picomatch(p, { dot: true })(path));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=exclude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exclude.js","sourceRoot":"","sources":["../../src/egress/exclude.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAA;AAGjC;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,SAAS;IACT,WAAW;IACX,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,cAAc;IACd,WAAW;IACX,YAAY;IACZ,WAAW;IACX,qBAAqB;IACrB,qBAAqB;IACrB,YAAY;IACZ,wBAAwB;IACxB,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,yBAAyB;CAC1B,CAAA;AAUD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAmB,EACnB,KAAK,GAAsB,EAAE;IAE7B,MAAM,QAAQ,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,KAAK,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAChF,MAAM,IAAI,GAAQ,EAAE,CAAA;IACpB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,gEAAgE;QAChE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAA;QACpF,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACzF,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;gBACtB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,UAAU;gBAClB,MAAM,EACJ,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aAC3F,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAA;AAC1D,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAK,GAAsB,EAAE;IACpE,OAAO,CAAC,GAAG,gBAAgB,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACvF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { QuestionSet, State } from "../model/types.js";
|
|
2
|
+
export type ScrubCounts = Record<string, number>;
|
|
3
|
+
export declare function scrubText(text: string, counts?: ScrubCounts): string;
|
|
4
|
+
/** Scrub a state: the string itself, or every string leaf of an object. */
|
|
5
|
+
export declare function scrubState(state: State, counts?: ScrubCounts): State;
|
|
6
|
+
/**
|
|
7
|
+
* Redact the question set itself. Instructions and criteria are sent with every
|
|
8
|
+
* request, and an agent can paste content (or a credential) into them, so they
|
|
9
|
+
* get the same treatment as the state.
|
|
10
|
+
*/
|
|
11
|
+
export declare function scrubQuestions(questions: QuestionSet, counts?: ScrubCounts): QuestionSet;
|
|
12
|
+
//# sourceMappingURL=scrub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub.d.ts","sourceRoot":"","sources":["../../src/egress/scrub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AA0D3D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEhD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,WAAgB,GAAG,MAAM,CASxE;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,GAAE,WAAgB,GAAG,KAAK,CAExE;AAwBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,GAAE,WAAgB,GAAG,WAAW,CAW5F"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/** A variable or key name that smells like it holds a credential. */
|
|
2
|
+
const SECRET_NAME = "[A-Za-z0-9_.-]*(?:api[_-]?key|secret|token|passw(?:or)?d|pwd|credential|private[_-]?key|auth)[A-Za-z0-9_.-]*";
|
|
3
|
+
const RULES = [
|
|
4
|
+
{
|
|
5
|
+
kind: "private-key",
|
|
6
|
+
pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,
|
|
7
|
+
},
|
|
8
|
+
{ kind: "aws-access-key", pattern: /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g },
|
|
9
|
+
{
|
|
10
|
+
kind: "github-token",
|
|
11
|
+
pattern: /\b(?:gh[pousr]_[A-Za-z0-9]{36,}|github_pat_[A-Za-z0-9_]{22,})\b/g,
|
|
12
|
+
},
|
|
13
|
+
{ kind: "openrouter-key", pattern: /\bsk-or-(?:v1-)?[A-Za-z0-9]{32,}\b/g },
|
|
14
|
+
{ kind: "anthropic-key", pattern: /\bsk-ant-[A-Za-z0-9_-]{20,}\b/g },
|
|
15
|
+
{ kind: "openai-key", pattern: /\bsk-(?:proj-|svcacct-)?[A-Za-z0-9_-]{32,}\b/g },
|
|
16
|
+
{ kind: "slack-token", pattern: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g },
|
|
17
|
+
{ kind: "stripe-key", pattern: /\b[rs]k_(?:live|test)_[A-Za-z0-9]{16,}\b/g },
|
|
18
|
+
{ kind: "google-api-key", pattern: /\bAIza[0-9A-Za-z_-]{35}\b/g },
|
|
19
|
+
{ kind: "jwt", pattern: /\beyJ[A-Za-z0-9_-]{8,}\.eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g },
|
|
20
|
+
{ kind: "url-credentials", pattern: /(?<=\b[a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:)[^\s@/]{3,}(?=@)/gi },
|
|
21
|
+
// NAME = "literal": a quoted value of 8+ chars assigned to a secret-sounding name.
|
|
22
|
+
{
|
|
23
|
+
kind: "assigned-secret",
|
|
24
|
+
pattern: new RegExp(`(?<=\\b${SECRET_NAME}["']?\\s*[:=]\\s*(["']))(?!\\$\\{|<|\\[REDACTED)[^"'\\s]{8,}(?=\\1)`, "gi"),
|
|
25
|
+
},
|
|
26
|
+
// NAME = value, unquoted: only when the value holds a digit and is not code
|
|
27
|
+
// (no call parens, no property path), so `token = getToken()` and
|
|
28
|
+
// `secret = process.env.SECRET` are left alone.
|
|
29
|
+
{
|
|
30
|
+
kind: "assigned-secret",
|
|
31
|
+
pattern: new RegExp(`(?<=\\b${SECRET_NAME}\\s*[:=]\\s*)(?!\\$\\{|<|\\[REDACTED)(?=[A-Za-z_\\-+/=~]*\\d)[A-Za-z0-9_\\-+/=~]{8,}(?![\\w(.])`, "gi"),
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
export function scrubText(text, counts = {}) {
|
|
35
|
+
let out = text;
|
|
36
|
+
for (const rule of RULES) {
|
|
37
|
+
out = out.replace(rule.pattern, () => {
|
|
38
|
+
counts[rule.kind] = (counts[rule.kind] ?? 0) + 1;
|
|
39
|
+
return `[REDACTED:${rule.kind}]`;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
/** Scrub a state: the string itself, or every string leaf of an object. */
|
|
45
|
+
export function scrubState(state, counts = {}) {
|
|
46
|
+
return walk(state, counts);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A value whose key smells like a credential, e.g. `{"password": "hunter2"}`.
|
|
50
|
+
* Rules that need `name = value` context can't see a structured field on its
|
|
51
|
+
* own, so the name is checked here instead.
|
|
52
|
+
*/
|
|
53
|
+
const SECRET_KEY = new RegExp(`^${SECRET_NAME}$`, "i");
|
|
54
|
+
function walk(value, counts, key) {
|
|
55
|
+
if (typeof value === "string") {
|
|
56
|
+
if (key !== undefined && SECRET_KEY.test(key) && value.trim().length >= 4) {
|
|
57
|
+
counts["assigned-secret"] = (counts["assigned-secret"] ?? 0) + 1;
|
|
58
|
+
return "[REDACTED:assigned-secret]";
|
|
59
|
+
}
|
|
60
|
+
return scrubText(value, counts);
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(value))
|
|
63
|
+
return value.map((v) => walk(v, counts, key));
|
|
64
|
+
if (value !== null && typeof value === "object") {
|
|
65
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, walk(v, counts, k)]));
|
|
66
|
+
}
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Redact the question set itself. Instructions and criteria are sent with every
|
|
71
|
+
* request, and an agent can paste content (or a credential) into them, so they
|
|
72
|
+
* get the same treatment as the state.
|
|
73
|
+
*/
|
|
74
|
+
export function scrubQuestions(questions, counts = {}) {
|
|
75
|
+
return Object.fromEntries(Object.entries(questions).map(([name, q]) => [
|
|
76
|
+
name,
|
|
77
|
+
{
|
|
78
|
+
...q,
|
|
79
|
+
instructions: scrubText(q.instructions, counts),
|
|
80
|
+
...(q.criteria === undefined ? {} : { criteria: scrubState(q.criteria, counts) }),
|
|
81
|
+
},
|
|
82
|
+
]));
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=scrub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub.js","sourceRoot":"","sources":["../../src/egress/scrub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ModelProfile } from "../model/profiles.js";
|
|
2
|
+
import type { QuestionSet, State } from "../model/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* A deliberately conservative token estimate: about 3 characters per token.
|
|
5
|
+
* Real tokenizers average nearer 4 for English and code, so this
|
|
6
|
+
* over-estimates. That is the right direction for a limit check and a cost
|
|
7
|
+
* projection.
|
|
8
|
+
*/
|
|
9
|
+
export declare const CHARS_PER_TOKEN = 3;
|
|
10
|
+
export declare function estimateTokens(value: State | QuestionSet): number;
|
|
11
|
+
/**
|
|
12
|
+
* @throws DecisionsError `state-too-large`. The state is never truncated,
|
|
13
|
+
* because a decision over half an input is a wrong decision.
|
|
14
|
+
*/
|
|
15
|
+
export declare function assertStateFits(id: string, state: State, questions: QuestionSet, profile: ModelProfile): number;
|
|
16
|
+
//# sourceMappingURL=size.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size.d.ts","sourceRoot":"","sources":["../../src/egress/size.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG,MAAM,CAGjE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,YAAY,GACpB,MAAM,CAWR"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DecisionsError } from "../errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* A deliberately conservative token estimate: about 3 characters per token.
|
|
4
|
+
* Real tokenizers average nearer 4 for English and code, so this
|
|
5
|
+
* over-estimates. That is the right direction for a limit check and a cost
|
|
6
|
+
* projection.
|
|
7
|
+
*/
|
|
8
|
+
export const CHARS_PER_TOKEN = 3;
|
|
9
|
+
export function estimateTokens(value) {
|
|
10
|
+
const text = typeof value === "string" ? value : JSON.stringify(value);
|
|
11
|
+
return Math.ceil(text.length / CHARS_PER_TOKEN);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* @throws DecisionsError `state-too-large`. The state is never truncated,
|
|
15
|
+
* because a decision over half an input is a wrong decision.
|
|
16
|
+
*/
|
|
17
|
+
export function assertStateFits(id, state, questions, profile) {
|
|
18
|
+
const tokens = estimateTokens(state) + estimateTokens(questions);
|
|
19
|
+
if (tokens > profile.maxStateTokens) {
|
|
20
|
+
throw new DecisionsError("state-too-large", `${id} is about ${tokens} tokens with its questions; ${profile.id} accepts ${profile.maxStateTokens}. ` +
|
|
21
|
+
"Split it smaller (e.g. --split lines:200 or --split hunk).", { id, estimatedTokens: tokens, maxStateTokens: profile.maxStateTokens });
|
|
22
|
+
}
|
|
23
|
+
return tokens;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=size.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size.js","sourceRoot":"","sources":["../../src/egress/size.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAI7C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAEhC,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAA;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAU,EACV,KAAY,EACZ,SAAsB,EACtB,OAAqB;IAErB,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;IAChE,IAAI,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,cAAc,CACtB,iBAAiB,EACjB,GAAG,EAAE,aAAa,MAAM,+BAA+B,OAAO,CAAC,EAAE,YAAY,OAAO,CAAC,cAAc,IAAI;YACrG,4DAA4D,EAC9D,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CACxE,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every failure the engine reports on purpose carries a stable `code`.
|
|
3
|
+
*
|
|
4
|
+
* The CLI maps codes onto exit codes (`packages/cli/src/exit-codes.ts`), and
|
|
5
|
+
* skills branch on them, so a code is part of the contract: add new ones, but
|
|
6
|
+
* don't rename them.
|
|
7
|
+
*/
|
|
8
|
+
export type ErrorCode =
|
|
9
|
+
/** The endpoint could not be reached, or kept failing after retries. */
|
|
10
|
+
"provider-unreachable"
|
|
11
|
+
/** The endpoint answered with a non-2xx status that is not worth retrying. */
|
|
12
|
+
| "provider-http"
|
|
13
|
+
/** A 2xx whose body is not a valid decision response for the request. */
|
|
14
|
+
| "malformed-response"
|
|
15
|
+
/** A live call was needed but no API key is configured. */
|
|
16
|
+
| "no-key"
|
|
17
|
+
/** Replay mode, and no recorded fixture matches this request. */
|
|
18
|
+
| "replay-miss"
|
|
19
|
+
/** The requested model has no profile. */
|
|
20
|
+
| "unknown-model"
|
|
21
|
+
/** The request itself is invalid (caller bug, not a provider problem). */
|
|
22
|
+
| "invalid-request"
|
|
23
|
+
/** A live call in a repo that has not consented to sending content off the machine. */
|
|
24
|
+
| "egress-refused"
|
|
25
|
+
/** The projected spend is over the budget and the caller did not confirm. */
|
|
26
|
+
| "budget-exceeded"
|
|
27
|
+
/** One state is over the model's limit. Refused, never truncated. */
|
|
28
|
+
| "state-too-large"
|
|
29
|
+
/** A source could not be read (missing file, bad JSONL, git failure). */
|
|
30
|
+
| "source-error"
|
|
31
|
+
/** A config or credentials file is invalid or insecure. */
|
|
32
|
+
| "config-error";
|
|
33
|
+
export declare class DecisionsError extends Error {
|
|
34
|
+
readonly code: ErrorCode;
|
|
35
|
+
readonly details: Record<string, unknown>;
|
|
36
|
+
constructor(code: ErrorCode, message: string, details?: Record<string, unknown>);
|
|
37
|
+
}
|
|
38
|
+
/** A failure on the provider's side, as distinct from a bad question set. */
|
|
39
|
+
export declare class ProviderError extends DecisionsError {
|
|
40
|
+
readonly status?: number | undefined;
|
|
41
|
+
constructor(code: "provider-unreachable" | "provider-http" | "malformed-response", message: string, status?: number | undefined);
|
|
42
|
+
}
|
|
43
|
+
export declare function isDecisionsError(error: unknown): error is DecisionsError;
|
|
44
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,SAAS;AACnB,wEAAwE;AACtE,sBAAsB;AACxB,8EAA8E;GAC5E,eAAe;AACjB,yEAAyE;GACvE,oBAAoB;AACtB,2DAA2D;GACzD,QAAQ;AACV,iEAAiE;GAC/D,aAAa;AACf,0CAA0C;GACxC,eAAe;AACjB,0EAA0E;GACxE,iBAAiB;AACnB,uFAAuF;GACrF,gBAAgB;AAClB,6EAA6E;GAC3E,iBAAiB;AACnB,qEAAqE;GACnE,iBAAiB;AACnB,yEAAyE;GACvE,cAAc;AAChB,2DAA2D;GACzD,cAAc,CAAA;AAElB,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,IAAI,EAAE,SAAS;IAExB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAH3C,YACW,IAAI,EAAE,SAAS,EACxB,OAAO,EAAE,MAAM,EACN,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAI/C;CACF;AAED,6EAA6E;AAC7E,qBAAa,aAAc,SAAQ,cAAc;IAI7C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IAH1B,YACE,IAAI,EAAE,sBAAsB,GAAG,eAAe,GAAG,oBAAoB,EACrE,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,MAAM,YAAA,EAIzB;CACF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class DecisionsError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
details;
|
|
4
|
+
constructor(code, message, details = {}) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.details = details;
|
|
8
|
+
this.name = "DecisionsError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** A failure on the provider's side, as distinct from a bad question set. */
|
|
12
|
+
export class ProviderError extends DecisionsError {
|
|
13
|
+
status;
|
|
14
|
+
constructor(code, message, status) {
|
|
15
|
+
super(code, message, status === undefined ? {} : { status });
|
|
16
|
+
this.status = status;
|
|
17
|
+
this.name = "ProviderError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function isDecisionsError(error) {
|
|
21
|
+
return error instanceof DecisionsError;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAiCA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE5B,IAAI;IAEJ,OAAO;IAHlB,YACW,IAAe,EACxB,OAAe,EACN,OAAO,GAA4B,EAAE;QAE9C,KAAK,CAAC,OAAO,CAAC,CAAA;oBAJL,IAAI;uBAEJ,OAAO;QAGhB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,OAAO,aAAc,SAAQ,cAAc;IAIpC,MAAM;IAHjB,YACE,IAAqE,EACrE,OAAe,EACN,MAAe;QAExB,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;sBAFnD,MAAM;QAGf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,KAAK,YAAY,cAAc,CAAA;AACxC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { DecisionRequest, DecisionResponse } from "../model/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Recorded answers, content-addressed so a fixture can only ever replay for the
|
|
4
|
+
* exact request that produced it.
|
|
5
|
+
*
|
|
6
|
+
* Layout: `<dir>/<namespace>/<sha256>.json`, where namespace is a spec name or
|
|
7
|
+
* `adhoc`. There is deliberately no fallback: a miss is a miss (decision 0010),
|
|
8
|
+
* because an invented answer is indistinguishable from a real one downstream.
|
|
9
|
+
*/
|
|
10
|
+
export declare const FIXTURE_VERSION = 1;
|
|
11
|
+
export interface FixtureRecord {
|
|
12
|
+
v: typeof FIXTURE_VERSION;
|
|
13
|
+
key: string;
|
|
14
|
+
recordedAt: string;
|
|
15
|
+
request: DecisionRequest;
|
|
16
|
+
response: DecisionResponse;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The fixture key: sha256 of the canonical JSON of `{model, state, questions}`.
|
|
20
|
+
*
|
|
21
|
+
* `model` is the *requested* id, so upgrading the model misses the cache instead
|
|
22
|
+
* of silently replaying the previous model's answers.
|
|
23
|
+
*/
|
|
24
|
+
export declare function fixtureKey(request: DecisionRequest): string;
|
|
25
|
+
/** JSON with object keys sorted at every depth, so key order never changes a hash. */
|
|
26
|
+
export declare function canonicalJson(value: unknown): string;
|
|
27
|
+
export declare class FixtureStore {
|
|
28
|
+
readonly dir: string;
|
|
29
|
+
constructor(dir: string);
|
|
30
|
+
path(namespace: string, key: string): string;
|
|
31
|
+
lookup(namespace: string, request: DecisionRequest): FixtureRecord | undefined;
|
|
32
|
+
record(namespace: string, request: DecisionRequest, response: DecisionResponse, now?: Date): FixtureRecord;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/fixtures/store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAE1E;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,OAAO,eAAe,CAAA;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,eAAe,CAAA;IACxB,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAG3D;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAgBD,qBAAa,YAAY;IACX,QAAQ,CAAC,GAAG,EAAE,MAAM;IAAhC,YAAqB,GAAG,EAAE,MAAM,EAAI;IAEpC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3C;IAED,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,GAAG,SAAS,CAK7E;IAED,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,OAAa,GACf,aAAa,CAgBf;CACF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Recorded answers, content-addressed so a fixture can only ever replay for the
|
|
6
|
+
* exact request that produced it.
|
|
7
|
+
*
|
|
8
|
+
* Layout: `<dir>/<namespace>/<sha256>.json`, where namespace is a spec name or
|
|
9
|
+
* `adhoc`. There is deliberately no fallback: a miss is a miss (decision 0010),
|
|
10
|
+
* because an invented answer is indistinguishable from a real one downstream.
|
|
11
|
+
*/
|
|
12
|
+
export const FIXTURE_VERSION = 1;
|
|
13
|
+
/**
|
|
14
|
+
* The fixture key: sha256 of the canonical JSON of `{model, state, questions}`.
|
|
15
|
+
*
|
|
16
|
+
* `model` is the *requested* id, so upgrading the model misses the cache instead
|
|
17
|
+
* of silently replaying the previous model's answers.
|
|
18
|
+
*/
|
|
19
|
+
export function fixtureKey(request) {
|
|
20
|
+
const { model, state, questions } = request;
|
|
21
|
+
return createHash("sha256").update(canonicalJson({ model, state, questions })).digest("hex");
|
|
22
|
+
}
|
|
23
|
+
/** JSON with object keys sorted at every depth, so key order never changes a hash. */
|
|
24
|
+
export function canonicalJson(value) {
|
|
25
|
+
return JSON.stringify(sortKeys(value));
|
|
26
|
+
}
|
|
27
|
+
function sortKeys(value) {
|
|
28
|
+
if (Array.isArray(value))
|
|
29
|
+
return value.map(sortKeys);
|
|
30
|
+
if (value !== null && typeof value === "object") {
|
|
31
|
+
return Object.fromEntries(Object.keys(value)
|
|
32
|
+
.sort()
|
|
33
|
+
.map((k) => [k, sortKeys(value[k])]));
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
const NAMESPACE = /^[a-z0-9][a-z0-9._-]*$/;
|
|
38
|
+
export class FixtureStore {
|
|
39
|
+
dir;
|
|
40
|
+
constructor(dir) {
|
|
41
|
+
this.dir = dir;
|
|
42
|
+
}
|
|
43
|
+
path(namespace, key) {
|
|
44
|
+
if (!NAMESPACE.test(namespace)) {
|
|
45
|
+
throw new Error(`Invalid fixture namespace "${namespace}" (lowercase letters, digits, . _ -)`);
|
|
46
|
+
}
|
|
47
|
+
return join(this.dir, namespace, `${key}.json`);
|
|
48
|
+
}
|
|
49
|
+
lookup(namespace, request) {
|
|
50
|
+
const file = this.path(namespace, fixtureKey(request));
|
|
51
|
+
if (!existsSync(file))
|
|
52
|
+
return undefined;
|
|
53
|
+
const record = JSON.parse(readFileSync(file, "utf8"));
|
|
54
|
+
return record.v === FIXTURE_VERSION ? record : undefined;
|
|
55
|
+
}
|
|
56
|
+
record(namespace, request, response, now = new Date()) {
|
|
57
|
+
const key = fixtureKey(request);
|
|
58
|
+
const record = {
|
|
59
|
+
v: FIXTURE_VERSION,
|
|
60
|
+
key,
|
|
61
|
+
recordedAt: now.toISOString(),
|
|
62
|
+
request,
|
|
63
|
+
response,
|
|
64
|
+
};
|
|
65
|
+
const file = this.path(namespace, key);
|
|
66
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
67
|
+
// Write-then-rename so a crash never leaves a truncated fixture behind.
|
|
68
|
+
const temp = `${file}.${process.pid}.tmp`;
|
|
69
|
+
writeFileSync(temp, `${JSON.stringify(record, null, 2)}\n`);
|
|
70
|
+
renameSync(temp, file);
|
|
71
|
+
return record;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/fixtures/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGzC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAUhC;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,OAAwB;IACjD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC9F,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACpD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aACf,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACpE,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,SAAS,GAAG,wBAAwB,CAAA;AAE1C,MAAM,OAAO,YAAY;IACF,GAAG;IAAxB,YAAqB,GAAW;mBAAX,GAAG;IAAW,CAAC;IAEpC,IAAI,CAAC,SAAiB,EAAE,GAAW;QACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,sCAAsC,CAAC,CAAA;QAChG,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,OAAwB;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;QACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAkB,CAAA;QACtE,OAAO,MAAM,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1D,CAAC;IAED,MAAM,CACJ,SAAiB,EACjB,OAAwB,EACxB,QAA0B,EAC1B,GAAG,GAAG,IAAI,IAAI,EAAE;QAEhB,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,MAAM,GAAkB;YAC5B,CAAC,EAAE,eAAe;YAClB,GAAG;YACH,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE;YAC7B,OAAO;YACP,QAAQ;SACT,CAAA;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QACtC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,wEAAwE;QACxE,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAA;QACzC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QAC3D,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACtB,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export { assertConsent, setConsent } from "./config/consent.js";
|
|
2
|
+
export type { Budget, Consent, DecisionsConfig, LoadOptions, ResolvedConfig, } from "./config/load.js";
|
|
3
|
+
export { allProfiles, DEFAULTS, findRepoRoot, loadConfig, repoConfigPath, userConfigDir, } from "./config/load.js";
|
|
4
|
+
export type { DetectedSession, Harness } from "./config/session.js";
|
|
5
|
+
export { detectHarness, detectSession } from "./config/session.js";
|
|
6
|
+
export type { DecideInput, DecideMode, Decider, DeciderOptions, DecisionResult } from "./decide.js";
|
|
7
|
+
export { createDecider } from "./decide.js";
|
|
8
|
+
export { applyExcludes, DEFAULT_EXCLUDES, isExcluded } from "./egress/exclude.js";
|
|
9
|
+
export type { ScrubCounts } from "./egress/scrub.js";
|
|
10
|
+
export { scrubQuestions, scrubState, scrubText } from "./egress/scrub.js";
|
|
11
|
+
export { assertStateFits, CHARS_PER_TOKEN, estimateTokens } from "./egress/size.js";
|
|
12
|
+
export type { ErrorCode } from "./errors.js";
|
|
13
|
+
export { DecisionsError, isDecisionsError, ProviderError } from "./errors.js";
|
|
14
|
+
export type { FixtureRecord } from "./fixtures/store.js";
|
|
15
|
+
export { canonicalJson, FIXTURE_VERSION, FixtureStore, fixtureKey } from "./fixtures/store.js";
|
|
16
|
+
export { confidenceOf, DEFAULT_UNDECIDED_FLOOR, isChoice, isNoul, isScore, isUndecided, noulConfidence, rankedProbabilities, undecidedNames, } from "./model/answers.js";
|
|
17
|
+
export type { ModelProfile } from "./model/profiles.js";
|
|
18
|
+
export { DEFAULT_MODEL_ID, PROFILES, projectCost, resolveProfile } from "./model/profiles.js";
|
|
19
|
+
export type * from "./model/types.js";
|
|
20
|
+
export { assertQuestionSet, parseDecisionResponse } from "./model/validate.js";
|
|
21
|
+
export type { PingOptions, PingResult } from "./ping.js";
|
|
22
|
+
export { ping, probeUrl } from "./ping.js";
|
|
23
|
+
export type { Prepared, PrepareInput } from "./prepare.js";
|
|
24
|
+
export { prepare } from "./prepare.js";
|
|
25
|
+
export type { Filter, Op, Projected, SortKey } from "./project/project.js";
|
|
26
|
+
export { matches, parseFilter, parseSort, project as projectRows } from "./project/project.js";
|
|
27
|
+
export type { Projection } from "./run/budget.js";
|
|
28
|
+
export { checkBudget, project } from "./run/budget.js";
|
|
29
|
+
export { mapWithConcurrency } from "./run/pool.js";
|
|
30
|
+
export type { AnswerSource, SpendEntry, SpendSummary } from "./run/spend.js";
|
|
31
|
+
export { SpendLedger, sumUsage } from "./run/spend.js";
|
|
32
|
+
export { gitIgnored, parseFileRef, readSources, splitDiffByFile } from "./sources/read.js";
|
|
33
|
+
export type { Document, Item, LineRange, Skipped, SourceSpec } from "./sources/types.js";
|
|
34
|
+
export type { Expectation } from "./spec/expect.js";
|
|
35
|
+
export { describeExpectation, meets, parseExpect } from "./spec/expect.js";
|
|
36
|
+
export type { Spec, SpecDirs, SpecFile, SpecListing } from "./spec/spec.js";
|
|
37
|
+
export { assertExamples, exampleProblems, listSpecs, loadSpec, parseQuestionSet, parseSpec, SpecSchema, specDirs, } from "./spec/spec.js";
|
|
38
|
+
export type { SplitSpec } from "./split/split.js";
|
|
39
|
+
export { parseSplit, split } from "./split/split.js";
|
|
40
|
+
export type { AskResult } from "./tools/ask.js";
|
|
41
|
+
export { runAsk } from "./tools/ask.js";
|
|
42
|
+
export type { ContextOptions, ToolContext } from "./tools/context.js";
|
|
43
|
+
export { createContext, deciderFor } from "./tools/context.js";
|
|
44
|
+
export type { CheckStatus, DoctorCheck, DoctorOptions, DoctorResult } from "./tools/doctor.js";
|
|
45
|
+
export { CODEX_RULE, runDoctor, which } from "./tools/doctor.js";
|
|
46
|
+
export type { ManyResult, ResultRow, SkippedSummary } from "./tools/many.js";
|
|
47
|
+
export { runMany, summariseSkipped } from "./tools/many.js";
|
|
48
|
+
export type { ToolName } from "./tools/schemas.js";
|
|
49
|
+
export { AskInput, ManyInput, SpecCheckInput, TOOL_SCHEMAS, UsageInput } from "./tools/schemas.js";
|
|
50
|
+
export type { ExampleResult, ExampleStatus, SpecCheckResult } from "./tools/spec-check.js";
|
|
51
|
+
export { runSpecCheck } from "./tools/spec-check.js";
|
|
52
|
+
export type { UsageResult } from "./tools/usage.js";
|
|
53
|
+
export { runUsage } from "./tools/usage.js";
|
|
54
|
+
export type { Transport, TransportOptions, TransportResult } from "./transport/openrouter.js";
|
|
55
|
+
export { createOpenRouterTransport, DEFAULT_TIMEOUT_MS, RETRY_STATUSES, } from "./transport/openrouter.js";
|
|
56
|
+
export { CLI_PACKAGE, VERSION } from "./version.js";
|
|
57
|
+
export type { ConnectionConfig, EnvDeciderOptions } from "./wiring.js";
|
|
58
|
+
export { createDeciderFromEnv, DEFAULT_ENDPOINT, DEFAULT_MODEL, resolveConnection, stateDir, } from "./wiring.js";
|
|
59
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|