@tokenfactory/acc-runner 0.44.0 → 0.44.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.
- package/README.md +23 -0
- package/dist/cost-pricing.d.ts +45 -0
- package/dist/cost-pricing.d.ts.map +1 -1
- package/dist/cost-pricing.js +57 -0
- package/dist/cost-pricing.js.map +1 -1
- package/dist/doctor.d.ts +4 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +19 -0
- package/dist/doctor.js.map +1 -1
- package/dist/instance.d.ts +30 -0
- package/dist/instance.d.ts.map +1 -0
- package/dist/instance.js +51 -0
- package/dist/instance.js.map +1 -0
- package/dist/keychain.d.ts +4 -8
- package/dist/keychain.d.ts.map +1 -1
- package/dist/keychain.js +10 -4
- package/dist/keychain.js.map +1 -1
- package/dist/login.d.ts +4 -0
- package/dist/login.d.ts.map +1 -1
- package/dist/login.js +6 -1
- package/dist/login.js.map +1 -1
- package/dist/memory-context.d.ts +106 -0
- package/dist/memory-context.d.ts.map +1 -0
- package/dist/memory-context.js +220 -0
- package/dist/memory-context.js.map +1 -0
- package/dist/memory-curation.d.ts +172 -0
- package/dist/memory-curation.d.ts.map +1 -0
- package/dist/memory-curation.js +277 -0
- package/dist/memory-curation.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +13 -0
- package/dist/program.js.map +1 -1
- package/dist/provider-auth.d.ts +19 -0
- package/dist/provider-auth.d.ts.map +1 -1
- package/dist/provider-auth.js +23 -0
- package/dist/provider-auth.js.map +1 -1
- package/dist/runtime/cache-dir.d.ts.map +1 -1
- package/dist/runtime/cache-dir.js +8 -3
- package/dist/runtime/cache-dir.js.map +1 -1
- package/dist/runtime/decision-provenance.d.ts +63 -0
- package/dist/runtime/decision-provenance.d.ts.map +1 -0
- package/dist/runtime/decision-provenance.js +107 -0
- package/dist/runtime/decision-provenance.js.map +1 -0
- package/dist/runtime/prompt-substitute.d.ts +100 -0
- package/dist/runtime/prompt-substitute.d.ts.map +1 -0
- package/dist/runtime/prompt-substitute.js +124 -0
- package/dist/runtime/prompt-substitute.js.map +1 -0
- package/dist/runtime/review-cost-cap.d.ts +167 -0
- package/dist/runtime/review-cost-cap.d.ts.map +1 -0
- package/dist/runtime/review-cost-cap.js +182 -0
- package/dist/runtime/review-cost-cap.js.map +1 -0
- package/dist/runtime/reviewer-abstain.d.ts +101 -0
- package/dist/runtime/reviewer-abstain.d.ts.map +1 -0
- package/dist/runtime/reviewer-abstain.js +138 -0
- package/dist/runtime/reviewer-abstain.js.map +1 -0
- package/dist/runtime/reviewer.d.ts +75 -0
- package/dist/runtime/reviewer.d.ts.map +1 -1
- package/dist/runtime/reviewer.js +205 -65
- package/dist/runtime/reviewer.js.map +1 -1
- package/dist/runtime/singleton.d.ts.map +1 -1
- package/dist/runtime/singleton.js +9 -1
- package/dist/runtime/singleton.js.map +1 -1
- package/dist/serving-auth/index.d.ts +79 -0
- package/dist/serving-auth/index.d.ts.map +1 -0
- package/dist/serving-auth/index.js +169 -0
- package/dist/serving-auth/index.js.map +1 -0
- package/dist/task-runner.d.ts +8 -0
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +37 -3
- package/dist/task-runner.js.map +1 -1
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +47 -19
- package/dist/watch.js.map +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/runtime/singleton.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/runtime/singleton.ts"],"names":[],"mappings":"AAyDA,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAQ9E;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,MAAM,EAAE,iBAAiB;aACzB,QAAQ,EAAE,MAAM;gBADhB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,MAAM;CAQnC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAG/B,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,MAA4B,GACrC,MAAM,CAIR;AA4CD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAoB,EACzB,QAAQ,GAAE,MAA4B,GACrC,OAAO,CAAC,aAAa,CAAC,CA+CxB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAoB,EAC7B,QAAQ,GAAE,MAA4B,GACrC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAMnC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,MAAoB,GAC5B,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnB"}
|
|
@@ -43,6 +43,7 @@ import fsp from "node:fs/promises";
|
|
|
43
43
|
import path from "node:path";
|
|
44
44
|
import crypto from "node:crypto";
|
|
45
45
|
import { cacheDir } from "./cache-dir.js";
|
|
46
|
+
import { resolveInstance } from "../instance.js";
|
|
46
47
|
import { isProcessAlive } from "./locks.js";
|
|
47
48
|
import { PACKAGE_VERSION } from "../pkg-version.js";
|
|
48
49
|
/**
|
|
@@ -57,7 +58,14 @@ const NO_ID_SINGLETON_KEY = "\0__acc_runner_no_id_shared__";
|
|
|
57
58
|
* when set, else "" (legacy repo-path-only key). Never the minted acc-eph id.
|
|
58
59
|
*/
|
|
59
60
|
export function singletonRunnerId(env = process.env) {
|
|
60
|
-
|
|
61
|
+
const id = env.ACC_RUNNER_ID?.trim();
|
|
62
|
+
if (id)
|
|
63
|
+
return id;
|
|
64
|
+
// NAMED-INSTANCES-1: with no ACC_RUNNER_ID a named instance IS the identity;
|
|
65
|
+
// keying the hash (not just the cache root) isolates two names even under one
|
|
66
|
+
// explicit ACC_RUNNER_CACHE_DIR. A same-name duplicate still collides.
|
|
67
|
+
const instance = resolveInstance(env);
|
|
68
|
+
return instance ? `instance:${instance}` : "";
|
|
61
69
|
}
|
|
62
70
|
export class SingletonLockHeldError extends Error {
|
|
63
71
|
holder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../src/runtime/singleton.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,+BAA+B,CAAC;AAgB5D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACpE,
|
|
1
|
+
{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../src/runtime/singleton.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { ServingAuthKind } from "../provider-auth.js";
|
|
2
|
+
/** The two kinds an operator can actually choose (migration 0323 §1's CHECK). */
|
|
3
|
+
export type ServingAuthChoice = Extract<ServingAuthKind, "subscription" | "api_key">;
|
|
4
|
+
/** What one boot-time resolution decided. */
|
|
5
|
+
export interface ServingAuthResolution {
|
|
6
|
+
kind: ServingAuthChoice;
|
|
7
|
+
/**
|
|
8
|
+
* The sealed BYOK key, present ONLY for `api_key`. Held in memory, handed
|
|
9
|
+
* straight to `cacheServingApiKey`, never written to disk or a log.
|
|
10
|
+
*/
|
|
11
|
+
credential: string | null;
|
|
12
|
+
/** Sealed acc.llm_keys id, for banners/telemetry. Never the key itself. */
|
|
13
|
+
keyId: string | null;
|
|
14
|
+
/** acc.ai_identities id the org chose. Null in subscription mode. */
|
|
15
|
+
identityId: string | null;
|
|
16
|
+
/** Why we ended up on subscription, when it wasn't an explicit choice. */
|
|
17
|
+
fallbackReason: string | null;
|
|
18
|
+
}
|
|
19
|
+
/** The answer every failure folds to. See rule 1 in the module header. */
|
|
20
|
+
export declare function subscriptionResolution(reason?: string | null): ServingAuthResolution;
|
|
21
|
+
/**
|
|
22
|
+
* Fold a raw response body into a resolution. Exported so the whole decision
|
|
23
|
+
* tree is asserted with no network — the fetch wrapper below is a thin shell
|
|
24
|
+
* over this.
|
|
25
|
+
*/
|
|
26
|
+
export declare function toServingAuthResolution(raw: unknown): ServingAuthResolution;
|
|
27
|
+
export interface FetchServingAuthOptions {
|
|
28
|
+
publicUrl: string;
|
|
29
|
+
jwt: string;
|
|
30
|
+
fetchImpl?: typeof fetch;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Ask the control plane how this org wants model serving authenticated.
|
|
34
|
+
* NEVER throws — rule 1. The reason a fold happened is carried on the
|
|
35
|
+
* resolution so the startup banner can say it out loud.
|
|
36
|
+
*/
|
|
37
|
+
export declare function fetchServingAuth(opts: FetchServingAuthOptions): Promise<ServingAuthResolution>;
|
|
38
|
+
/**
|
|
39
|
+
* Apply a resolution to a process env, returning the env the rest of startup
|
|
40
|
+
* should use. Never mutates `base`.
|
|
41
|
+
*
|
|
42
|
+
* Rule 2 lives here: when `base` already carries an explicit
|
|
43
|
+
* ACC_RUNNER_SERVING_AUTH_KIND, `base` is returned UNCHANGED and the
|
|
44
|
+
* credential is not cached — an operator's launch-env override is the more
|
|
45
|
+
* specific instruction, and silently overwriting it would make a documented
|
|
46
|
+
* escape hatch stop working.
|
|
47
|
+
*
|
|
48
|
+
* Side effect (deliberate, and the reason this returns an env rather than just
|
|
49
|
+
* a string): for api_key it seeds ../provider-auth.ts's module cache so
|
|
50
|
+
* `anthropicApiKey()` resolves the sealed key for every later spawn without
|
|
51
|
+
* anyone writing process.env.ANTHROPIC_API_KEY.
|
|
52
|
+
*/
|
|
53
|
+
export declare function applyServingAuth(resolution: ServingAuthResolution, base?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
54
|
+
/**
|
|
55
|
+
* The in-place sibling of {@link applyServingAuth}, for the one caller that
|
|
56
|
+
* genuinely needs the process global: startup writes the kind into
|
|
57
|
+
* `process.env` because every later consumer (`servingAuthKind`,
|
|
58
|
+
* `forwardsAmbientKey`, `withAnthropicAuth`, `doctor`) defaults its `env`
|
|
59
|
+
* argument to `process.env`, and threading a copy through all of them would be
|
|
60
|
+
* a much larger change than this feature earns.
|
|
61
|
+
*
|
|
62
|
+
* Writes exactly ONE variable — the kind — and never touches
|
|
63
|
+
* ANTHROPIC_API_KEY (the credential goes to the module cache instead, via
|
|
64
|
+
* `applyServingAuth`). Returns true when it applied, false when an explicit
|
|
65
|
+
* env value won (rule 2).
|
|
66
|
+
*/
|
|
67
|
+
export declare function installServingAuth(resolution: ServingAuthResolution, env?: NodeJS.ProcessEnv): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* True when `env` already pins the serving kind, i.e. `applyServingAuth` would
|
|
70
|
+
* defer to it. Exposed so startup can say "server said X, your env says Y,
|
|
71
|
+
* your env wins" instead of appearing to ignore the setting.
|
|
72
|
+
*/
|
|
73
|
+
export declare function servingAuthKindIsPinned(env?: NodeJS.ProcessEnv): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* One line for the startup banner. Renders the kind and whether a credential
|
|
76
|
+
* was delivered — never the credential (rule 3).
|
|
77
|
+
*/
|
|
78
|
+
export declare function describeServingAuthResolution(r: ServingAuthResolution): string;
|
|
79
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serving-auth/index.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,iFAAiF;AACjF,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,eAAe,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC;AAErF,6CAA6C;AAC7C,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,iBAAiB,CAAC;IACxB;;;OAGG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,2EAA2E;IAC3E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,qEAAqE;IACrE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,MAAM,GAAG,IAAW,GAAG,qBAAqB,CAQ1F;AAYD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,CAsB3E;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAuBhC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,qBAAqB,EACjC,IAAI,GAAE,MAAM,CAAC,UAAwB,GACpC,MAAM,CAAC,UAAU,CAOnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,qBAAqB,EACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAKT;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAErF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAO9E"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RUNNER-SERVING-AUTH — the runner's half of the operator's
|
|
3
|
+
* subscription-vs-BYOK choice.
|
|
4
|
+
*
|
|
5
|
+
* WHAT THIS ADDS, AND WHAT IT DELIBERATELY DOES NOT
|
|
6
|
+
* ----------------------------------------------------------------------------
|
|
7
|
+
* It adds ONE thing: a per-boot answer to "did an admin choose API-key serving
|
|
8
|
+
* for this org?", fetched from /api/runner/serving-auth under the runner's own
|
|
9
|
+
* JWT. That answer is then expressed through machinery that ALREADY EXISTS:
|
|
10
|
+
*
|
|
11
|
+
* - the kind is written to `ACC_RUNNER_SERVING_AUTH_KIND` (the env var
|
|
12
|
+
* ../provider-auth.ts already folds via `servingAuthKind`), so
|
|
13
|
+
* `withAnthropicAuth` forwards or strips exactly as it does today;
|
|
14
|
+
* - the sealed key is pushed into the SAME module cache the vault path uses
|
|
15
|
+
* (`cacheServingApiKey`), so `anthropicApiKey()` finds it without anybody
|
|
16
|
+
* touching `process.env.ANTHROPIC_API_KEY`.
|
|
17
|
+
*
|
|
18
|
+
* It adds NO new spawn-time branch, NO second credential store, and NO way to
|
|
19
|
+
* reach api_key serving other than the admin-gated, audited setting.
|
|
20
|
+
*
|
|
21
|
+
* THREE RULES THIS MODULE ENFORCES ON ITS CALLERS
|
|
22
|
+
* ----------------------------------------------------------------------------
|
|
23
|
+
* 1. EVERY FAILURE IS SUBSCRIPTION. A network error, a non-200, malformed
|
|
24
|
+
* JSON, an old server with no such route, or an api_key answer with no
|
|
25
|
+
* credential all resolve to `subscription`. Under REVIEW-SUBS
|
|
26
|
+
* (docs/acc/REVIEW_SUBSCRIPTION_ONLY.md) the expensive failure is billing
|
|
27
|
+
* somebody who did not opt in; a runner that falls back to subscription is
|
|
28
|
+
* a runner that behaves exactly as it does today.
|
|
29
|
+
* 2. AN EXPLICIT ENV VALUE WINS. A launch env that already sets
|
|
30
|
+
* ACC_RUNNER_SERVING_AUTH_KIND (container fleets, an operator debugging a
|
|
31
|
+
* 429) is NOT overwritten by the server's answer. The setting exists to
|
|
32
|
+
* replace the hand-edited env var as the normal path, not to take it away.
|
|
33
|
+
* 3. NOTHING HERE LOGS THE KEY. `describeServingAuthResolution` is the only
|
|
34
|
+
* thing that renders a resolution, and it renders the kind and a boolean —
|
|
35
|
+
* never the credential, never a prefix of it.
|
|
36
|
+
*/
|
|
37
|
+
import { SERVING_AUTH_KIND_ENV, cacheServingApiKey } from "../provider-auth.js";
|
|
38
|
+
/** The answer every failure folds to. See rule 1 in the module header. */
|
|
39
|
+
export function subscriptionResolution(reason = null) {
|
|
40
|
+
return {
|
|
41
|
+
kind: "subscription",
|
|
42
|
+
credential: null,
|
|
43
|
+
keyId: null,
|
|
44
|
+
identityId: null,
|
|
45
|
+
fallbackReason: reason,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Fold a raw response body into a resolution. Exported so the whole decision
|
|
50
|
+
* tree is asserted with no network — the fetch wrapper below is a thin shell
|
|
51
|
+
* over this.
|
|
52
|
+
*/
|
|
53
|
+
export function toServingAuthResolution(raw) {
|
|
54
|
+
if (!raw || typeof raw !== "object")
|
|
55
|
+
return subscriptionResolution("malformed response");
|
|
56
|
+
const body = raw;
|
|
57
|
+
if (body.ok === false)
|
|
58
|
+
return subscriptionResolution(body.error ?? "server refused");
|
|
59
|
+
const kind = (body.auth_kind ?? "").trim().toLowerCase();
|
|
60
|
+
if (kind !== "api_key" && kind !== "api-key") {
|
|
61
|
+
return subscriptionResolution(null);
|
|
62
|
+
}
|
|
63
|
+
const credential = (body.credential ?? "").trim();
|
|
64
|
+
if (!credential) {
|
|
65
|
+
// api_key without a key would strip nothing and forward nothing — the
|
|
66
|
+
// spawn would 401 on every task. Subscription is the working answer.
|
|
67
|
+
return subscriptionResolution("api_key selected but no credential was delivered");
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
kind: "api_key",
|
|
71
|
+
credential,
|
|
72
|
+
keyId: body.key_id ?? null,
|
|
73
|
+
identityId: body.identity_id ?? null,
|
|
74
|
+
fallbackReason: null,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Ask the control plane how this org wants model serving authenticated.
|
|
79
|
+
* NEVER throws — rule 1. The reason a fold happened is carried on the
|
|
80
|
+
* resolution so the startup banner can say it out loud.
|
|
81
|
+
*/
|
|
82
|
+
export async function fetchServingAuth(opts) {
|
|
83
|
+
const f = opts.fetchImpl ?? fetch;
|
|
84
|
+
const endpoint = `${opts.publicUrl.replace(/\/$/, "")}/api/runner/serving-auth`;
|
|
85
|
+
try {
|
|
86
|
+
const res = await f(endpoint, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers: {
|
|
89
|
+
Authorization: `Bearer ${opts.jwt}`,
|
|
90
|
+
"Content-Type": "application/json",
|
|
91
|
+
},
|
|
92
|
+
body: JSON.stringify({}),
|
|
93
|
+
});
|
|
94
|
+
if (!res.ok) {
|
|
95
|
+
// 404 on an older control plane is the common case and is not an error:
|
|
96
|
+
// that deployment has no serving-auth setting, so subscription is right.
|
|
97
|
+
return subscriptionResolution(`serving-auth endpoint returned ${res.status}`);
|
|
98
|
+
}
|
|
99
|
+
return toServingAuthResolution(await res.json());
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return subscriptionResolution(`serving-auth unreachable (${err instanceof Error ? err.message : "unknown"})`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Apply a resolution to a process env, returning the env the rest of startup
|
|
107
|
+
* should use. Never mutates `base`.
|
|
108
|
+
*
|
|
109
|
+
* Rule 2 lives here: when `base` already carries an explicit
|
|
110
|
+
* ACC_RUNNER_SERVING_AUTH_KIND, `base` is returned UNCHANGED and the
|
|
111
|
+
* credential is not cached — an operator's launch-env override is the more
|
|
112
|
+
* specific instruction, and silently overwriting it would make a documented
|
|
113
|
+
* escape hatch stop working.
|
|
114
|
+
*
|
|
115
|
+
* Side effect (deliberate, and the reason this returns an env rather than just
|
|
116
|
+
* a string): for api_key it seeds ../provider-auth.ts's module cache so
|
|
117
|
+
* `anthropicApiKey()` resolves the sealed key for every later spawn without
|
|
118
|
+
* anyone writing process.env.ANTHROPIC_API_KEY.
|
|
119
|
+
*/
|
|
120
|
+
export function applyServingAuth(resolution, base = process.env) {
|
|
121
|
+
if ((base[SERVING_AUTH_KIND_ENV] ?? "").trim())
|
|
122
|
+
return base;
|
|
123
|
+
const next = { ...base, [SERVING_AUTH_KIND_ENV]: resolution.kind };
|
|
124
|
+
if (resolution.kind === "api_key" && resolution.credential) {
|
|
125
|
+
cacheServingApiKey(resolution.credential);
|
|
126
|
+
}
|
|
127
|
+
return next;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* The in-place sibling of {@link applyServingAuth}, for the one caller that
|
|
131
|
+
* genuinely needs the process global: startup writes the kind into
|
|
132
|
+
* `process.env` because every later consumer (`servingAuthKind`,
|
|
133
|
+
* `forwardsAmbientKey`, `withAnthropicAuth`, `doctor`) defaults its `env`
|
|
134
|
+
* argument to `process.env`, and threading a copy through all of them would be
|
|
135
|
+
* a much larger change than this feature earns.
|
|
136
|
+
*
|
|
137
|
+
* Writes exactly ONE variable — the kind — and never touches
|
|
138
|
+
* ANTHROPIC_API_KEY (the credential goes to the module cache instead, via
|
|
139
|
+
* `applyServingAuth`). Returns true when it applied, false when an explicit
|
|
140
|
+
* env value won (rule 2).
|
|
141
|
+
*/
|
|
142
|
+
export function installServingAuth(resolution, env = process.env) {
|
|
143
|
+
if (servingAuthKindIsPinned(env))
|
|
144
|
+
return false;
|
|
145
|
+
const next = applyServingAuth(resolution, env);
|
|
146
|
+
env[SERVING_AUTH_KIND_ENV] = next[SERVING_AUTH_KIND_ENV];
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* True when `env` already pins the serving kind, i.e. `applyServingAuth` would
|
|
151
|
+
* defer to it. Exposed so startup can say "server said X, your env says Y,
|
|
152
|
+
* your env wins" instead of appearing to ignore the setting.
|
|
153
|
+
*/
|
|
154
|
+
export function servingAuthKindIsPinned(env = process.env) {
|
|
155
|
+
return Boolean((env[SERVING_AUTH_KIND_ENV] ?? "").trim());
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* One line for the startup banner. Renders the kind and whether a credential
|
|
159
|
+
* was delivered — never the credential (rule 3).
|
|
160
|
+
*/
|
|
161
|
+
export function describeServingAuthResolution(r) {
|
|
162
|
+
if (r.kind === "api_key") {
|
|
163
|
+
return `api_key (org setting) — sealed key delivered for identity ${r.identityId ?? "?"}`;
|
|
164
|
+
}
|
|
165
|
+
return r.fallbackReason
|
|
166
|
+
? `subscription (fell back: ${r.fallbackReason})`
|
|
167
|
+
: "subscription (org setting)";
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serving-auth/index.ts"],"names":[],"mappings":"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"}
|
package/dist/task-runner.d.ts
CHANGED
|
@@ -381,6 +381,14 @@ export declare function parsePrNumber(url: string | null | undefined): number |
|
|
|
381
381
|
* NS MM-2: `engineId` is optional and appended last for the same reason as
|
|
382
382
|
* `extractReportFromOutput` — every pre-existing caller keeps resolving
|
|
383
383
|
* `claude-code` unchanged.
|
|
384
|
+
*
|
|
385
|
+
* COST-ATTR-1: the model is resolved from what the ENGINE actually reported
|
|
386
|
+
* (`model`, else the winning `modelUsage` key — see engineResultModel) before
|
|
387
|
+
* falling back to the task's model pin. It lands on UNRESOLVED_MODEL only when
|
|
388
|
+
* both are empty, and says so on stderr rather than silently writing a token
|
|
389
|
+
* that reads like a real attribution. `acc.record_cost_event` then completes
|
|
390
|
+
* the DEC-P9 chain server-side (task pin -> project -> org), which the runner
|
|
391
|
+
* cannot do: the fetch payload carries the pinned model row and nothing else.
|
|
384
392
|
*/
|
|
385
393
|
export declare function buildCostEvent(taskId: string, stdout: string, fallbackModel: string | null | undefined, runnerId: string | null | undefined, engineId?: string | null): CostEventPayload;
|
|
386
394
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAS,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAwF,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1J,OAAO,
|
|
1
|
+
{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/task-runner.js
CHANGED
|
@@ -21,7 +21,7 @@ import { join } from "node:path";
|
|
|
21
21
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
22
22
|
import { execa } from "execa";
|
|
23
23
|
import { canServeRepo, loadProfile as defaultLoadProfile, localRepoPathFor, resolveBaseBranch } from "./config.js";
|
|
24
|
-
import { normalizeUsage, priceUsdCents, toCliAlias, } from "./cost-pricing.js";
|
|
24
|
+
import { UNRESOLVED_MODEL, engineResultModel, isPlaceholderModel, normalizeUsage, priceUsdCents, toCliAlias, } from "./cost-pricing.js";
|
|
25
25
|
import { extractResetTime, isCapacityExhausted, isGitProvisionContention, } from "./failure-classifier.js";
|
|
26
26
|
import { getEngine } from "./engines/registry.js";
|
|
27
27
|
import { startTaskGithubBudget, endTaskGithubBudget, isRetryableGithubError, } from "./github-client.js";
|
|
@@ -31,6 +31,7 @@ import { composePrBody } from "./pr-body.js";
|
|
|
31
31
|
import { writeMcpConfig as defaultWriteMcpConfig, } from "./mcp-spawn.js";
|
|
32
32
|
import { postRunnerStateMessage as defaultPostRunnerStateMessage, } from "./messaging.js";
|
|
33
33
|
import { branchForTask, prTitleForTask, renderTaskPrompt, } from "./prompt.js";
|
|
34
|
+
import { buildMemoryContext } from "./memory-context.js";
|
|
34
35
|
import { acquireTaskLock as defaultAcquireTaskLock, TaskLockHeldError, } from "./runtime/locks.js";
|
|
35
36
|
import { prepareTaskWorktree as defaultPrepareTaskWorktree, } from "./runtime/worktree.js";
|
|
36
37
|
// v0.21 T-66-1: serialize the per-task worktree-provisioning critical section
|
|
@@ -521,10 +522,25 @@ async function emitFirstCommit(supabase, git, taskId, workdir, baseRef, branch)
|
|
|
521
522
|
* NS MM-2: `engineId` is optional and appended last for the same reason as
|
|
522
523
|
* `extractReportFromOutput` — every pre-existing caller keeps resolving
|
|
523
524
|
* `claude-code` unchanged.
|
|
525
|
+
*
|
|
526
|
+
* COST-ATTR-1: the model is resolved from what the ENGINE actually reported
|
|
527
|
+
* (`model`, else the winning `modelUsage` key — see engineResultModel) before
|
|
528
|
+
* falling back to the task's model pin. It lands on UNRESOLVED_MODEL only when
|
|
529
|
+
* both are empty, and says so on stderr rather than silently writing a token
|
|
530
|
+
* that reads like a real attribution. `acc.record_cost_event` then completes
|
|
531
|
+
* the DEC-P9 chain server-side (task pin -> project -> org), which the runner
|
|
532
|
+
* cannot do: the fetch payload carries the pinned model row and nothing else.
|
|
524
533
|
*/
|
|
525
534
|
export function buildCostEvent(taskId, stdout, fallbackModel, runnerId, engineId) {
|
|
526
535
|
const parsed = getEngine(engineId).parseResult(stdout);
|
|
527
|
-
const
|
|
536
|
+
const reported = engineResultModel(parsed);
|
|
537
|
+
const pinned = isPlaceholderModel(fallbackModel) ? "" : (fallbackModel ?? "").trim();
|
|
538
|
+
const model = reported ?? (pinned || UNRESOLVED_MODEL);
|
|
539
|
+
if (model === UNRESOLVED_MODEL) {
|
|
540
|
+
process.stderr.write(`[acc-runner] cost-event model unresolved for ${taskId}: engine ` +
|
|
541
|
+
`${engineId ?? "claude-code"} reported no model and the task carries no ` +
|
|
542
|
+
`model pin — posting '${UNRESOLVED_MODEL}' for server-side resolution\n`);
|
|
543
|
+
}
|
|
528
544
|
const usage = normalizeUsage(parsed?.usage);
|
|
529
545
|
return {
|
|
530
546
|
task_id: taskId,
|
|
@@ -1239,7 +1255,25 @@ export function runTask(taskId, deps) {
|
|
|
1239
1255
|
});
|
|
1240
1256
|
}
|
|
1241
1257
|
}
|
|
1242
|
-
const
|
|
1258
|
+
const preluded = prelude ? `${prelude}\n\n${renderedPrompt}` : renderedPrompt;
|
|
1259
|
+
// MEMORY-1: the task lane's memory pack. This is the point where task/agent
|
|
1260
|
+
// context is assembled for a run — the counterpart to
|
|
1261
|
+
// api/_lib/memory-pack/build.ts on the chat lane, which had no task-lane
|
|
1262
|
+
// equivalent before now. buildMemoryContext returns "" for a task with no
|
|
1263
|
+
// agent, an agent with no memory, or ANY error, so with an empty store
|
|
1264
|
+
// `prompt` is byte-identical to the pre-MEMORY-1 value. Only
|
|
1265
|
+
// operational-class rows are ever returned, and the section is bounded by a
|
|
1266
|
+
// TOKEN budget (<= 500 tokens, <= 5 rows) — see memory-context.ts.
|
|
1267
|
+
//
|
|
1268
|
+
// MEMORY-2: `taskText` drives the relevance gate. It is the same three
|
|
1269
|
+
// fields the prompt itself is built from — title, description, acceptance
|
|
1270
|
+
// criteria — so "relevant to this task" is judged against exactly what the
|
|
1271
|
+
// agent has been asked to do, and a task whose memory store holds nothing
|
|
1272
|
+
// topical gets no section at all.
|
|
1273
|
+
const memorySection = await buildMemoryContext(deps.supabase, result.agent?.id, {
|
|
1274
|
+
taskText: [task.title, task.description ?? "", ...task.acceptance].join(" \n "),
|
|
1275
|
+
});
|
|
1276
|
+
const prompt = memorySection ? `${preluded}\n\n${memorySection}` : preluded;
|
|
1243
1277
|
// v0.11-F: acquire the per-task PID lock before any worktree
|
|
1244
1278
|
// side-effect. Same-machine parallel runners that picked up the same
|
|
1245
1279
|
// task_id (e.g. two `acc-runner watch` processes seeing the same
|