@corenel/harness 0.7.2 → 0.7.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.
@@ -29,6 +29,37 @@ export interface AcpSessionUpdate {
29
29
  */
30
30
  export declare function eventToSessionUpdate(ev: AgentEvent): AcpSessionUpdate | null;
31
31
  /** Map our loop's stop reason onto ACP's. Unknown reasons report `end_turn`
32
- * rather than inventing a value the client would not recognize. */
32
+ * rather than inventing a value the client would not recognize.
33
+ *
34
+ * WHAT ARRIVES HERE IS NORMALIZED. The daemon's ACP prompt reads the reason off
35
+ * a run whose executor already put it through the shared vocabulary
36
+ * (`executor.ts`'s `normalizeRunStatus`), so the raw provider reasons reach
37
+ * this function only from a caller that skipped that edge. Both spellings are
38
+ * kept for that reason.
39
+ *
40
+ * `policy` -> `refusal` is that normalization's consequence, and it is the
41
+ * honest mapping for everything `policy` names: our own policy engine stopping
42
+ * the run, and the provider's two guardrails -- declining to answer
43
+ * ('refusal') and blocking the output it produced ('content_filter'). ACP's
44
+ * `refusal` means the agent would not continue, which is true of all of them;
45
+ * `end_turn` -- what these used to report -- tells the client the turn ended
46
+ * normally, which is true of none.
47
+ *
48
+ * `stuck` -> `max_tokens` is that same argument, applied to the other end of
49
+ * the vocabulary. An ACP stop reason describes the TURN'S OUTCOME, not which
50
+ * component decided it. `stuck` reaches here from TWO causes: the loop's
51
+ * no-progress guard (the model repeating one tool call, `loop.ts`) and a
52
+ * provider cutting the output off at its token ceiling (normalized from
53
+ * 'length'/'max_tokens'). ACP's `max_tokens` is exact for the second and
54
+ * IMPRECISE for the first -- a no-progress stop is reported to the client as a
55
+ * token limit the run did not actually hit, and this mapping accepts that
56
+ * knowingly. It is still the better answer, because both causes are "the turn
57
+ * did not finish" and `end_turn` is wrong for BOTH: trading a precise lie
58
+ * ("it completed") for an imprecise truth ("it stopped at a limit") is the
59
+ * right trade for a client deciding whether to continue the conversation.
60
+ *
61
+ * Note what is NOT here: the local budget gate normalizes to its own `budget`
62
+ * member and still reports `end_turn`, along with `error` and `stalled` --
63
+ * ACP's enum has no value for any of them. */
33
64
  export declare function stopReasonForAcp(reason: string): string;
34
65
  //# sourceMappingURL=agentMap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agentMap.d.ts","sourceRoot":"","sources":["../../acp/agentMap.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAmC3C;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAQ9D;AAED,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI,CA6B5E;AAED;mEACmE;AACnE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAavD"}
1
+ {"version":3,"file":"agentMap.d.ts","sourceRoot":"","sources":["../../acp/agentMap.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAmC3C;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAQ9D;AAED,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI,CA6B5E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8CAgC8C;AAC9C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBvD"}
@@ -92,7 +92,38 @@ export function eventToSessionUpdate(ev) {
92
92
  }
93
93
  }
94
94
  /** Map our loop's stop reason onto ACP's. Unknown reasons report `end_turn`
95
- * rather than inventing a value the client would not recognize. */
95
+ * rather than inventing a value the client would not recognize.
96
+ *
97
+ * WHAT ARRIVES HERE IS NORMALIZED. The daemon's ACP prompt reads the reason off
98
+ * a run whose executor already put it through the shared vocabulary
99
+ * (`executor.ts`'s `normalizeRunStatus`), so the raw provider reasons reach
100
+ * this function only from a caller that skipped that edge. Both spellings are
101
+ * kept for that reason.
102
+ *
103
+ * `policy` -> `refusal` is that normalization's consequence, and it is the
104
+ * honest mapping for everything `policy` names: our own policy engine stopping
105
+ * the run, and the provider's two guardrails -- declining to answer
106
+ * ('refusal') and blocking the output it produced ('content_filter'). ACP's
107
+ * `refusal` means the agent would not continue, which is true of all of them;
108
+ * `end_turn` -- what these used to report -- tells the client the turn ended
109
+ * normally, which is true of none.
110
+ *
111
+ * `stuck` -> `max_tokens` is that same argument, applied to the other end of
112
+ * the vocabulary. An ACP stop reason describes the TURN'S OUTCOME, not which
113
+ * component decided it. `stuck` reaches here from TWO causes: the loop's
114
+ * no-progress guard (the model repeating one tool call, `loop.ts`) and a
115
+ * provider cutting the output off at its token ceiling (normalized from
116
+ * 'length'/'max_tokens'). ACP's `max_tokens` is exact for the second and
117
+ * IMPRECISE for the first -- a no-progress stop is reported to the client as a
118
+ * token limit the run did not actually hit, and this mapping accepts that
119
+ * knowingly. It is still the better answer, because both causes are "the turn
120
+ * did not finish" and `end_turn` is wrong for BOTH: trading a precise lie
121
+ * ("it completed") for an imprecise truth ("it stopped at a limit") is the
122
+ * right trade for a client deciding whether to continue the conversation.
123
+ *
124
+ * Note what is NOT here: the local budget gate normalizes to its own `budget`
125
+ * member and still reports `end_turn`, along with `error` and `stalled` --
126
+ * ACP's enum has no value for any of them. */
96
127
  export function stopReasonForAcp(reason) {
97
128
  switch (reason) {
98
129
  case 'cancelled':
@@ -101,8 +132,11 @@ export function stopReasonForAcp(reason) {
101
132
  case 'max-turns':
102
133
  case 'max_turns':
103
134
  return 'max_turn_requests';
135
+ case 'policy':
104
136
  case 'refusal':
105
137
  return 'refusal';
138
+ case 'stuck':
139
+ return 'max_tokens';
106
140
  default:
107
141
  return 'end_turn';
108
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agentMap.js","sourceRoot":"","sources":["../../acp/agentMap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentMap.js","sourceRoot":"","sources":["../../acp/agentMap.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,18 @@ export interface ModelRates {
5
5
  }
6
6
  export declare const CACHED_INPUT_FRACTION = 0.5;
7
7
  export declare function priceUsageWith(usage: Usage, rates: ModelRates | null): number | null;
8
+ export type PriceTable = Map<string, ModelRates>;
9
+ /** A usd cap can only be enforced against rates that actually cost something.
10
+ * Absent rates (the model never entered the table) and an all-zero rate both
11
+ * mean "spend will always read $0" -- neither can enforce a `maxUsd`. Every
12
+ * surface with a usd ceiling asks THIS question, so they cannot drift: the
13
+ * crew-run guard (executor.ts), the room guard (roomDeps.ts), and `corenel
14
+ * run`. */
15
+ export declare function pricedForUsd(rates: ModelRates | null): boolean;
16
+ /** Hydrate the rate table from the SAME backend the app uses (GET
17
+ * <endpoint>/llm-providers/available, Bearer login token), so prices are the
18
+ * current ones rather than a drifting static copy. An empty table means
19
+ * "cannot price" -- every caller must fail closed on a usd cap rather than
20
+ * treat unknown as free. */
21
+ export declare function hydratePrices(endpoint: string, getToken: () => Promise<string | null>, fetchImpl?: typeof fetch): Promise<PriceTable>;
8
22
  //# sourceMappingURL=pricing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../core/pricing.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,UAAU;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AACjE,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAQpF"}
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../core/pricing.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,UAAU;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AACjE,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAQpF;AAYD,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEjD;;;;;WAKW;AACX,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAG9D;AASD;;;;4BAI4B;AAC5B,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EACtC,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,UAAU,CAAC,CAuBrB"}
@@ -9,4 +9,53 @@ export function priceUsageWith(usage, rates) {
9
9
  + (cached / perM) * rates.inPrice * CACHED_INPUT_FRACTION
10
10
  + (usage.completionTokens / perM) * rates.outPrice;
11
11
  }
12
+ /** A usd cap can only be enforced against rates that actually cost something.
13
+ * Absent rates (the model never entered the table) and an all-zero rate both
14
+ * mean "spend will always read $0" -- neither can enforce a `maxUsd`. Every
15
+ * surface with a usd ceiling asks THIS question, so they cannot drift: the
16
+ * crew-run guard (executor.ts), the room guard (roomDeps.ts), and `corenel
17
+ * run`. */
18
+ export function pricedForUsd(rates) {
19
+ if (!rates)
20
+ return false;
21
+ return rates.inPrice > 0 || rates.outPrice > 0;
22
+ }
23
+ /** Hydrate the rate table from the SAME backend the app uses (GET
24
+ * <endpoint>/llm-providers/available, Bearer login token), so prices are the
25
+ * current ones rather than a drifting static copy. An empty table means
26
+ * "cannot price" -- every caller must fail closed on a usd cap rather than
27
+ * treat unknown as free. */
28
+ export async function hydratePrices(endpoint, getToken, fetchImpl = fetch) {
29
+ const table = new Map();
30
+ let token = null;
31
+ try {
32
+ token = await getToken();
33
+ }
34
+ catch {
35
+ token = null;
36
+ }
37
+ if (!token)
38
+ return table;
39
+ try {
40
+ const res = await fetchImpl(`${endpoint.replace(/\/$/, '')}/llm-providers/available`, {
41
+ headers: { Authorization: `Bearer ${token}` },
42
+ });
43
+ if (!res.ok)
44
+ return table;
45
+ const json = (await res.json());
46
+ for (const p of json.providers ?? []) {
47
+ for (const m of p.models ?? []) {
48
+ // An UNPRICED model must stay ABSENT from the table, never entered at
49
+ // rate 0: a zero entry is truthy, so a fail-closed usd guard would pass
50
+ // and then price every turn at $0, making `maxUsd` unenforceable.
51
+ // Absence is what makes the guard trip.
52
+ if (m.inputPrice == null || m.outputPrice == null)
53
+ continue;
54
+ table.set(m.model, { inPrice: m.inputPrice, outPrice: m.outputPrice });
55
+ }
56
+ }
57
+ }
58
+ catch { /* leave the table empty -> caller fails closed on a usd cap */ }
59
+ return table;
60
+ }
12
61
  //# sourceMappingURL=pricing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../core/pricing.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,KAAwB;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAS,CAAC;IACvB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO;UACjC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,qBAAqB;UACvD,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../core/pricing.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,KAAwB;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAS,CAAC;IACvB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO;UACjC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,qBAAqB;UACvD,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;AACvD,CAAC;AAcD;;;;;WAKW;AACX,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AACjD,CAAC;AASD;;;;4BAI4B;AAC5B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,QAAsC,EACtC,YAA0B,KAAK;IAE/B,MAAM,KAAK,GAAe,IAAI,GAAG,EAAE,CAAC;IACpC,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,CAAC;QAAC,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,KAAK,GAAG,IAAI,CAAC;IAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,0BAA0B,EAAE;YACpF,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwC,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBAC/B,sEAAsE;gBACtE,wEAAwE;gBACxE,kEAAkE;gBAClE,wCAAwC;gBACxC,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI;oBAAE,SAAS;gBAC5D,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,+DAA+D,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -24,7 +24,7 @@ export const READ_ONLY_POLICY = {
24
24
  // Sidecar fs write tool addresses as fs:sidecar_fs_write_file; cover it and any
25
25
  // future fs mutator with the explicit deny (reads address fs:sidecar_fs_read_file,
26
26
  // but mutating fs tools are caught here AND by mutatingDefault below).
27
- 'fs:sidecar_fs_write_file',
27
+ 'fs:sidecar_fs_write_file', 'fs:sidecar_fs_write_bytes',
28
28
  // Shell execution (sidecar_shell_exec, address shell:sidecar_shell_exec) is a
29
29
  // side effect — denied outright under read-only, regardless of its own permission.
30
30
  'shell:*',
@@ -1 +1 @@
1
- {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../guardrail/builtins.ts"],"names":[],"mappings":"AAQA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,6DAA6D;IAC1E,WAAW,EAAE,MAAM;IACnB,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE;QACX,qBAAqB,EAAE,OAAO,EAAE,8DAA8D;QAC9F,UAAU,EAAE,MAAM,EAAE,gDAAgD;KACrE;IACD,+EAA+E;CAChF,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAW;IACtC,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,4DAA4D;IACzE,WAAW,EAAE,MAAM;IACnB,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB;YACrE,gFAAgF;YAChF,mFAAmF;YACnF,uEAAuE;YACvE,0BAA0B;YAC1B,8EAA8E;YAC9E,mFAAmF;YACnF,SAAS;YACT,oBAAoB,EAAE,eAAe,EAAE,sBAAsB;YAC7D,UAAU;SACX;KACF;IACD,WAAW,EAAE;QACX,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;QACrG,oBAAoB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM;QACrF,UAAU,EAAE,MAAM;KACnB;IACD,6EAA6E;IAC7E,uEAAuE;IACvE,2EAA2E;IAC3E,8EAA8E;IAC9E,8EAA8E;IAC9E,eAAe,EAAE,MAAM;CACxB,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAW;IACvC,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,iFAAiF;IAC9F,WAAW,EAAE,MAAM;IACnB,QAAQ,EAAE,EAAE;IACZ,WAAW,EAAE;QACX,UAAU,EAAE,KAAK,EAAE,0DAA0D;KAC9E;IACD,iBAAiB,EAAE,OAAO;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,QAAQ,EAAE,eAAe;IACzB,WAAW,EAAE,gBAAgB;IAC7B,UAAU,EAAE,iBAAiB;CAC9B,CAAC"}
1
+ {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../guardrail/builtins.ts"],"names":[],"mappings":"AAQA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAW;IACrC,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,6DAA6D;IAC1E,WAAW,EAAE,MAAM;IACnB,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE;QACX,qBAAqB,EAAE,OAAO,EAAE,8DAA8D;QAC9F,UAAU,EAAE,MAAM,EAAE,gDAAgD;KACrE;IACD,+EAA+E;CAChF,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAW;IACtC,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,4DAA4D;IACzE,WAAW,EAAE,MAAM;IACnB,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB;YACrE,gFAAgF;YAChF,mFAAmF;YACnF,uEAAuE;YACvE,0BAA0B,EAAE,2BAA2B;YACvD,8EAA8E;YAC9E,mFAAmF;YACnF,SAAS;YACT,oBAAoB,EAAE,eAAe,EAAE,sBAAsB;YAC7D,UAAU;SACX;KACF;IACD,WAAW,EAAE;QACX,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;QACrG,oBAAoB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM;QACrF,UAAU,EAAE,MAAM;KACnB;IACD,6EAA6E;IAC7E,uEAAuE;IACvE,2EAA2E;IAC3E,8EAA8E;IAC9E,8EAA8E;IAC9E,eAAe,EAAE,MAAM;CACxB,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAW;IACvC,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,iFAAiF;IAC9F,WAAW,EAAE,MAAM;IACnB,QAAQ,EAAE,EAAE;IACZ,WAAW,EAAE;QACX,UAAU,EAAE,KAAK,EAAE,0DAA0D;KAC9E;IACD,iBAAiB,EAAE,OAAO;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,QAAQ,EAAE,eAAe;IACzB,WAAW,EAAE,gBAAgB;IAC7B,UAAU,EAAE,iBAAiB;CAC9B,CAAC"}
@@ -44,6 +44,37 @@ export declare function streamCompletion(client: OpenAI, params: StreamCompletio
44
44
  export declare function createChatClient(auth: IAuthTokenProvider, opts?: {
45
45
  origin?: string;
46
46
  }): OpenAI;
47
+ /** A custom OpenAI-compatible provider as the router sees it. Carries the API
48
+ * key: never log a value of this type. */
49
+ export interface CustomProviderRoute {
50
+ baseURL: string;
51
+ apiKey: string;
52
+ models: string[];
53
+ }
54
+ /** Where a run's model calls may go. `gateway: false` means the hosted API is
55
+ * never used for a model call: an unclaimed model is refused locally. */
56
+ export interface ModelRouting {
57
+ gateway: boolean;
58
+ providers: CustomProviderRoute[];
59
+ }
60
+ export type ModelRoute = {
61
+ kind: 'custom';
62
+ provider: CustomProviderRoute;
63
+ } | {
64
+ kind: 'gateway';
65
+ } | {
66
+ kind: 'refused';
67
+ };
68
+ /** A custom provider that lists the model wins, whatever `gateway` says. */
69
+ export declare function routeForModel(model: string, routing: ModelRouting): ModelRoute;
70
+ export declare function modelRouteRefusalMessage(model: string): string;
71
+ /** A client whose every request is routed by the model it names: to the custom
72
+ * provider that serves it, else to the gateway when `routing.gateway` is true,
73
+ * else refused with no request made. Pure data in (no storage reads), so it is
74
+ * Worker-safe. */
75
+ export declare function createRoutedChatClient(auth: IAuthTokenProvider, routing: ModelRouting, opts?: {
76
+ origin?: string;
77
+ }): OpenAI;
47
78
  /** Host-injected model→custom-provider lookup. The kernel transport knows how to
48
79
  * build a custom client but NOT how the host decides which model belongs to one
49
80
  * (that lookup reads app storage) — so the app registers it at boot. Default:
@@ -53,11 +84,13 @@ export type CustomProviderResolver = (model: string) => {
53
84
  apiKey: string;
54
85
  } | null | undefined;
55
86
  export declare function setCustomProviderResolver(fn: CustomProviderResolver): void;
87
+ export declare function setGatewayAllowed(fn: () => boolean): void;
56
88
  /** Route a model to its client: a custom OpenAI-compatible provider's direct
57
- * client when the host's resolver claims the model, else the caller's gateway.
58
- * The single source of truth for model→client routing (workflow runner, test
59
- * runner, …) so custom-provider handling can't drift between features.
60
- * Main-thread only — the resolver reads localStorage. */
89
+ * client when the host's resolver claims the model, else the caller's gateway
90
+ * when the host allows it, else a client that refuses without a request.
91
+ * The single source of truth for main-thread model->client routing (workflow
92
+ * runner, test runner, ...) so custom-provider handling can't drift between
93
+ * features. Main-thread only -- the resolver reads localStorage. */
61
94
  export declare function clientForModel(model: string, gateway: OpenAI): OpenAI;
62
95
  /** Host-injected proxy for custom-provider fetches. Returns a Response (e.g. routed
63
96
  * through a local sidecar so a loopback LLM dodges browser CORS) or null to fall
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../providers/gateway.ts"],"names":[],"mappings":"AAIA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACxG,OAAO,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAMnE,YAAY,EAAE,KAAK,EAAE,CAAC;AAMtB,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEhD;AAUD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B;;gDAE4C;IAC5C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;+EAC2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAEpF,oHAAoH;AACpH,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,KAAK,CAKnJ;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,WAAW,EACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAmF7B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CA6BjG;AAED;;;sEAGsE;AACtE,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,CAAC;AAE/G,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,sBAAsB,GAAG,IAAI,CAE1E;AAED;;;;yDAIyD;AACzD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED;;;+CAG+C;AAC/C,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AAE3F,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAA0B;AAEvF;;;+CAG+C;AAC/C,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAUjF"}
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../providers/gateway.ts"],"names":[],"mappings":"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"}
@@ -75,7 +75,7 @@ export async function streamCompletion(client, params, signal, onText) {
75
75
  * custom BYO endpoint -- rather than trusting each to sanitise its own
76
76
  * relaying. */
77
77
  const detail = redactSecrets(String((typeof raw === 'string' ? raw : raw?.error || raw?.message) || err?.message || String(e)));
78
- const msg = typeof err?.status === 'number' ? `Gateway ${err.status}: ${detail}` : detail;
78
+ const msg = typeof err?.status === 'number' ? `${statusPrefix(err.status, err.code)}: ${detail}` : detail;
79
79
  alog('stream:create-error', msg);
80
80
  throw new Error(msg);
81
81
  }
@@ -117,37 +117,172 @@ export async function streamCompletion(client, params, signal, onText) {
117
117
  alog('stream:end', { chunks: chunkN, contentLen: content.length, toolCalls: toolCalls.length, finishReason, usage });
118
118
  return { content, toolCalls, usage, finishReason };
119
119
  }
120
+ /* Machine-readable codes on the synthetic error bodies this module builds
121
+ * itself (a routing refusal, an unreachable custom provider). The SDK exposes a
122
+ * body's error.code as APIError.code. */
123
+ const LOCAL_FAILURE = {
124
+ refused: 'model_route_refused',
125
+ unreachable: 'custom_provider_unreachable',
126
+ };
127
+ /** How streamCompletion labels an HTTP-status failure. Only a response that
128
+ * really came back from the gateway is "Gateway NNN"; a locally produced one
129
+ * says so. Every label keeps "Status NNN" / "Gateway NNN" so recovery.ts's
130
+ * statusOf still reads the code and classifies it (both locals are fatal). */
131
+ function statusPrefix(status, code) {
132
+ if (code === LOCAL_FAILURE.refused)
133
+ return `Status ${status} (refused locally, nothing was sent)`;
134
+ if (code === LOCAL_FAILURE.unreachable)
135
+ return `Status ${status} (custom provider unreachable)`;
136
+ return `Gateway ${status}`;
137
+ }
138
+ /** One gateway request: the host's bearer token injected per call (so token
139
+ * refresh is automatic and it works from a Worker), plus the informational
140
+ * origin tag. Shared by the plain gateway client and the routed client, so the
141
+ * two cannot drift in how they authenticate. */
142
+ async function gatewayRequest(auth, opts, url, init) {
143
+ const headers = new Headers(init?.headers);
144
+ alog('gateway:token-wait');
145
+ const token = await auth.getToken().catch(() => null);
146
+ if (token)
147
+ headers.set('Authorization', `Bearer ${token}`);
148
+ else
149
+ headers.delete('Authorization');
150
+ // Static origin tag so the gateway can distinguish daemon-originated runs
151
+ // from interactive browser runs for entitlement metering. Enforcement is
152
+ // entirely server-side -- this is only ever an informational tag, never a
153
+ // client-side gate.
154
+ if (opts.origin)
155
+ headers.set('X-Prompd-Origin', opts.origin);
156
+ alog('gateway:fetch', { url, hasToken: !!token });
157
+ try {
158
+ const res = await fetch(url, { ...init, headers });
159
+ alog('gateway:status', res.status, res.statusText);
160
+ return res;
161
+ }
162
+ catch (e) {
163
+ alog('gateway:fetch-error', String(e?.message || e));
164
+ throw e;
165
+ }
166
+ }
120
167
  export function createChatClient(auth, opts = {}) {
121
168
  return new OpenAI({
122
169
  baseURL: gatewayBaseURL(),
123
170
  // Real key lives server-side; this placeholder is replaced per-request by the
124
- // Clerk token in the custom fetch below. The SDK requires a non-empty value.
171
+ // Clerk token in gatewayRequest. The SDK requires a non-empty value.
172
+ apiKey: 'prompd-gateway',
173
+ dangerouslyAllowBrowser: true,
174
+ fetch: (url, init) => gatewayRequest(auth, opts, String(url), init),
175
+ });
176
+ }
177
+ /** A custom provider that lists the model wins, whatever `gateway` says. */
178
+ export function routeForModel(model, routing) {
179
+ const provider = routing.providers.find((p) => p.models.includes(model));
180
+ if (provider)
181
+ return { kind: 'custom', provider };
182
+ return routing.gateway ? { kind: 'gateway' } : { kind: 'refused' };
183
+ }
184
+ export function modelRouteRefusalMessage(model) {
185
+ return `Model "${model}" is not served by any of your custom providers, and routing model calls through the hosted API is turned off. `
186
+ + 'Pick a model from a custom provider, or turn routing back on in Settings > Models.';
187
+ }
188
+ /* A refusal is a synthetic 403, not a thrown fetch error: the SDK wraps a
189
+ * thrown fetch in "Connection error." (losing the reason) and retries it,
190
+ * while a 4xx is surfaced with its body's message and never retried.
191
+ * Its body carries LOCAL_FAILURE.refused, so streamCompletion reports it as
192
+ * "Status 403 (refused locally, nothing was sent): <reason>" -- not as the
193
+ * gateway, which was never contacted. */
194
+ function refusalResponse(model) {
195
+ return new Response(JSON.stringify({ error: { message: modelRouteRefusalMessage(model), code: LOCAL_FAILURE.refused } }), { status: 403, headers: { 'content-type': 'application/json' } });
196
+ }
197
+ /** The request body's `model`, or null when it is not a JSON object naming one. */
198
+ function modelOfBody(body) {
199
+ if (typeof body !== 'string')
200
+ return null;
201
+ try {
202
+ const parsed = JSON.parse(body);
203
+ const model = parsed !== null && typeof parsed === 'object' ? parsed.model : undefined;
204
+ return typeof model === 'string' ? model : null;
205
+ }
206
+ catch {
207
+ return null;
208
+ }
209
+ }
210
+ /** One request to a custom provider with its own key: never the host token,
211
+ * never the origin tag. Loopback URLs may go through the injected local proxy
212
+ * (a sidecar), exactly as createCustomClient does. */
213
+ async function customRequest(provider, url, init) {
214
+ const headers = new Headers(init?.headers);
215
+ headers.set('Authorization', `Bearer ${provider.apiKey || 'no-key'}`);
216
+ headers.delete('X-Prompd-Origin');
217
+ const req = { ...init, headers };
218
+ const proxied = localFetchProxy(url, req);
219
+ try {
220
+ return await (proxied ?? fetch(url, req));
221
+ }
222
+ catch (e) {
223
+ // An abort stays an abort: the SDK reads it (with the aborted signal) as
224
+ // the user's Stop, which must never turn into a provider error.
225
+ if (req.signal?.aborted || isAbortError(e))
226
+ throw e;
227
+ alog('custom:fetch-error', hostOf(url));
228
+ return unreachableResponse(url);
229
+ }
230
+ }
231
+ /** By name, not instanceof: a DOMException is not an Error in every runtime. */
232
+ function isAbortError(e) {
233
+ return e !== null && typeof e === 'object' && e.name === 'AbortError';
234
+ }
235
+ /** The host (and port) of a URL, for a message: never the path or query, and
236
+ * never anything from the headers, so a key cannot ride along. */
237
+ function hostOf(url) {
238
+ try {
239
+ return new URL(url).host;
240
+ }
241
+ catch {
242
+ return '(unparseable URL)';
243
+ }
244
+ }
245
+ function customProviderUnreachableMessage(url) {
246
+ return `Could not reach your custom provider at ${hostOf(url)}: the browser's request failed with no response `
247
+ + "(the server is down, the URL is wrong, or it does not allow this page's origin -- CORS). "
248
+ + "Check the provider URL. For a local server, allow this page's origin (for Ollama, set OLLAMA_ORIGINS).";
249
+ }
250
+ /* A thrown fetch becomes a synthetic 400 for the same reason a refusal is a
251
+ * synthetic 403: the SDK wraps a throw in an opaque "Connection error." and
252
+ * retries it, and the agent loop classifies that as transient and retries it
253
+ * again. 400 is not retried by the SDK (it retries 408, 409, 429 and 5xx), is
254
+ * fatal to classifyStreamError, and -- unlike 404 -- is not read as "wrong
255
+ * model" by the workflow runner's isModelError. */
256
+ function unreachableResponse(url) {
257
+ return new Response(JSON.stringify({ error: { message: customProviderUnreachableMessage(url), code: LOCAL_FAILURE.unreachable } }), { status: 400, headers: { 'content-type': 'application/json' } });
258
+ }
259
+ /** A client whose every request is routed by the model it names: to the custom
260
+ * provider that serves it, else to the gateway when `routing.gateway` is true,
261
+ * else refused with no request made. Pure data in (no storage reads), so it is
262
+ * Worker-safe. */
263
+ export function createRoutedChatClient(auth, routing, opts = {}) {
264
+ const base = gatewayBaseURL();
265
+ return new OpenAI({
266
+ baseURL: base,
125
267
  apiKey: 'prompd-gateway',
126
268
  dangerouslyAllowBrowser: true,
127
269
  fetch: async (url, init) => {
128
- const headers = new Headers(init?.headers);
129
- alog('gateway:token-wait');
130
- const token = await auth.getToken().catch(() => null);
131
- if (token)
132
- headers.set('Authorization', `Bearer ${token}`);
133
- else
134
- headers.delete('Authorization');
135
- // Static origin tag so the gateway can distinguish daemon-originated runs
136
- // from interactive browser runs for entitlement metering. Enforcement is
137
- // entirely server-side — this is only ever an informational tag, never a
138
- // client-side gate.
139
- if (opts.origin)
140
- headers.set('X-Prompd-Origin', opts.origin);
141
- alog('gateway:fetch', { url: String(url), hasToken: !!token });
142
- try {
143
- const res = await fetch(url, { ...init, headers });
144
- alog('gateway:status', res.status, res.statusText);
145
- return res;
146
- }
147
- catch (e) {
148
- alog('gateway:fetch-error', String(e?.message || e));
149
- throw e;
150
- }
270
+ const target = String(url);
271
+ const req = init;
272
+ const model = modelOfBody(req?.body);
273
+ const route = model === null
274
+ ? (routing.gateway ? { kind: 'gateway' } : { kind: 'refused' })
275
+ : routeForModel(model, routing);
276
+ if (route.kind === 'refused')
277
+ return refusalResponse(model ?? '(unnamed)');
278
+ if (route.kind === 'gateway')
279
+ return gatewayRequest(auth, opts, target, req);
280
+ // The SDK only ever builds URLs under its baseURL. Anything else is a
281
+ // programming error, and guessing a destination for a transcript is not
282
+ // an acceptable way to handle one.
283
+ if (!target.startsWith(base))
284
+ throw new Error(`Refusing to route a request outside the chat API base: ${target}`);
285
+ return customRequest(route.provider, `${route.provider.baseURL.replace(/\/+$/, '')}${target.slice(base.length)}`, req);
151
286
  },
152
287
  });
153
288
  }
@@ -155,14 +290,34 @@ let resolveCustomProvider = () => null;
155
290
  export function setCustomProviderResolver(fn) {
156
291
  resolveCustomProvider = fn;
157
292
  }
293
+ /** Host-injected: may a model call use the hosted gateway? Default yes. The app
294
+ * wires its "Route model calls through the API" setting here. */
295
+ let gatewayAllowed = () => true;
296
+ export function setGatewayAllowed(fn) {
297
+ gatewayAllowed = fn;
298
+ }
299
+ /** A client that refuses every request locally -- what an unclaimed model gets
300
+ * when the gateway is disallowed. */
301
+ function createRefusingClient(model) {
302
+ return new OpenAI({
303
+ baseURL: 'http://model-route.invalid/v1',
304
+ apiKey: 'refused',
305
+ dangerouslyAllowBrowser: true,
306
+ maxRetries: 0,
307
+ fetch: async () => refusalResponse(model),
308
+ });
309
+ }
158
310
  /** Route a model to its client: a custom OpenAI-compatible provider's direct
159
- * client when the host's resolver claims the model, else the caller's gateway.
160
- * The single source of truth for model→client routing (workflow runner, test
161
- * runner, …) so custom-provider handling can't drift between features.
162
- * Main-thread only — the resolver reads localStorage. */
311
+ * client when the host's resolver claims the model, else the caller's gateway
312
+ * when the host allows it, else a client that refuses without a request.
313
+ * The single source of truth for main-thread model->client routing (workflow
314
+ * runner, test runner, ...) so custom-provider handling can't drift between
315
+ * features. Main-thread only -- the resolver reads localStorage. */
163
316
  export function clientForModel(model, gateway) {
164
317
  const cp = resolveCustomProvider(model);
165
- return cp ? createCustomClient(cp) : gateway;
318
+ if (cp)
319
+ return createCustomClient(cp);
320
+ return gatewayAllowed() ? gateway : createRefusingClient(model);
166
321
  }
167
322
  let localFetchProxy = () => null;
168
323
  export function setLocalFetchProxy(fn) { localFetchProxy = fn; }
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../providers/gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../providers/gateway.ts"],"names":[],"mappings":"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"}
@@ -81,6 +81,17 @@ export interface SidecarHostOptions {
81
81
  * `SidecarRooms.subscribe` in server.ts). Fires whether or not this client
82
82
  * ever called `roomOpen`/`roomList`/`roomRead`. */
83
83
  onRoomProgress?: (room: RoomSummary) => void;
84
+ /** The daemon asks the host to open a web page (the user is debugging it).
85
+ * Delivered verbatim: the GATING is the host's -- scheme allowlist, then
86
+ * loopback/private accepted silently and any other origin confirmed by the
87
+ * user -- because a policy decision split across two layers is one that ends
88
+ * up wrong in one of them. */
89
+ onOpenUrl?: (push: {
90
+ url: string;
91
+ title?: string;
92
+ note?: string;
93
+ meta?: Record<string, string>;
94
+ }) => void;
84
95
  }
85
96
  /** `mcp-call` resolves `ok: false` for a policy refusal (`mcp-error`) rather
86
97
  * than rejecting -- see the field comment on `mcpCallPending` above for why. A