@felan-ai/agent-core 0.9.2 → 0.9.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.
Files changed (68) hide show
  1. package/README.md +26 -1
  2. package/dist/classifier/index.d.ts +5 -0
  3. package/dist/classifier/index.d.ts.map +1 -0
  4. package/dist/classifier/index.js +3 -0
  5. package/dist/classifier/index.js.map +1 -0
  6. package/dist/{jev → classifier/jev}/classifier.d.ts +1 -1
  7. package/dist/classifier/jev/classifier.d.ts.map +1 -0
  8. package/dist/{jev → classifier/jev}/classifier.js +3 -0
  9. package/dist/classifier/jev/classifier.js.map +1 -0
  10. package/dist/{jev → classifier/jev}/client.d.ts +2 -0
  11. package/dist/classifier/jev/client.d.ts.map +1 -0
  12. package/dist/{jev → classifier/jev}/client.js +28 -11
  13. package/dist/classifier/jev/client.js.map +1 -0
  14. package/dist/classifier/jev/credentials.d.ts.map +1 -0
  15. package/dist/classifier/jev/credentials.js.map +1 -0
  16. package/dist/classifier/session-evidence.d.ts +25 -0
  17. package/dist/classifier/session-evidence.d.ts.map +1 -0
  18. package/dist/classifier/session-evidence.js +159 -0
  19. package/dist/classifier/session-evidence.js.map +1 -0
  20. package/dist/{classifier.d.ts → classifier/types.d.ts} +2 -1
  21. package/dist/classifier/types.d.ts.map +1 -0
  22. package/dist/classifier/types.js +2 -0
  23. package/dist/classifier/types.js.map +1 -0
  24. package/dist/dynamic-thinking/index.d.ts +2 -0
  25. package/dist/dynamic-thinking/index.d.ts.map +1 -0
  26. package/dist/dynamic-thinking/index.js +2 -0
  27. package/dist/dynamic-thinking/index.js.map +1 -0
  28. package/dist/dynamic-thinking/savings.d.ts +10 -0
  29. package/dist/dynamic-thinking/savings.d.ts.map +1 -0
  30. package/dist/dynamic-thinking/savings.js +56 -0
  31. package/dist/dynamic-thinking/savings.js.map +1 -0
  32. package/dist/dynamic-thinking/selection.d.ts +11 -0
  33. package/dist/dynamic-thinking/selection.d.ts.map +1 -0
  34. package/dist/dynamic-thinking/selection.js +66 -0
  35. package/dist/dynamic-thinking/selection.js.map +1 -0
  36. package/dist/dynamic-thinking/session.d.ts +6 -0
  37. package/dist/dynamic-thinking/session.d.ts.map +1 -0
  38. package/dist/dynamic-thinking/session.js +86 -0
  39. package/dist/dynamic-thinking/session.js.map +1 -0
  40. package/dist/host-agent-runtime.d.ts +1 -1
  41. package/dist/host-agent-runtime.d.ts.map +1 -1
  42. package/dist/host-agent-runtime.js.map +1 -1
  43. package/dist/index.d.ts +4 -2
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +3 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/runtime.d.ts +1 -1
  48. package/dist/runtime.d.ts.map +1 -1
  49. package/dist/session.d.ts +1 -0
  50. package/dist/session.d.ts.map +1 -1
  51. package/dist/session.js +13 -0
  52. package/dist/session.js.map +1 -1
  53. package/dist/transcript-evidence.d.ts +12 -0
  54. package/dist/transcript-evidence.d.ts.map +1 -0
  55. package/dist/transcript-evidence.js +42 -0
  56. package/dist/transcript-evidence.js.map +1 -0
  57. package/package.json +1 -1
  58. package/dist/classifier.d.ts.map +0 -1
  59. package/dist/classifier.js +0 -2
  60. package/dist/classifier.js.map +0 -1
  61. package/dist/jev/classifier.d.ts.map +0 -1
  62. package/dist/jev/classifier.js.map +0 -1
  63. package/dist/jev/client.d.ts.map +0 -1
  64. package/dist/jev/client.js.map +0 -1
  65. package/dist/jev/credentials.d.ts.map +0 -1
  66. package/dist/jev/credentials.js.map +0 -1
  67. /package/dist/{jev → classifier/jev}/credentials.d.ts +0 -0
  68. /package/dist/{jev → classifier/jev}/credentials.js +0 -0
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Portable Felan agent contracts and the Node.js host runtime.
4
4
 
5
- `@felan-ai/agent-core` is the feature-neutral composition layer between a
5
+ `@felan-ai/agent-core` is the portable composition layer between a
6
6
  Felan host and the pinned Pi packages. It is intended for applications and
7
7
  portable extensions, not as a complete end-user CLI.
8
8
 
@@ -62,6 +62,31 @@ judgment and an additive probability-of-yes judgment for independently scoring
62
62
  multiple conditions. Jev implements the latter with its Noul primitive; Agent
63
63
  Core does not expose Jev transport types through this contract.
64
64
 
65
+ `collectClassifierSessionEvidence` converts the active Pi session projection
66
+ into bounded conversation and correlated tool-call metadata for classifiers.
67
+ It handles branch/compaction summaries, omits images, raw thinking and tool
68
+ result bodies, and redacts recognizable credential patterns. It is not a
69
+ guarantee that arbitrary secrets in user text are detected. Feature packages
70
+ choose their own classifier questions and any additional state.
71
+
72
+ Session composition accepts an optional `dynamicThinking` capability. When the
73
+ runtime has a classifier, it selects a supported effort on `before_agent_start`,
74
+ not queued follow-ups or tool continuations, without persisting the user's
75
+ default. Codex requests are classified only when the Codex extension is loaded;
76
+ eligible Anthropic models use Pi's mid-conversation effort support.
77
+ Explicit thinking changes take precedence for the remainder of the session.
78
+ Absent the option or the classifier, composition does not enable this feature.
79
+
80
+ With an optional savings reporter, Agent Core reports a heuristic
81
+ API-equivalent estimate for any supported model's automatic `high` → `low` or
82
+ `high` → `medium` change when the run settles without tool failures and its
83
+ first assistant response includes reasoning-token usage. It estimates 5%
84
+ extra reasoning output at `high`, keeps observed input, cache and visible-output
85
+ usage unchanged, and subtracts reported classifier
86
+ cost. No change, a return to `high`, other models/levels, missing usage, or a
87
+ failed response produces no measurement. The unvalidated cross-model
88
+ assumption and quality caveats are in [the public benchmark notes](../../docs/benchmarks/dynamic-thinking-effort.md).
89
+
65
90
  Host runtimes expose optional persistent process operations for extensions that
66
91
  need incremental output and stdin. `startShell()` keeps process ownership in
67
92
  the runtime adapter and returns a bounded polling handle with write, terminate,
@@ -0,0 +1,5 @@
1
+ export { createJevClassifier } from './jev/classifier.js';
2
+ export { collectClassifierSessionEvidence, sanitizeClassifierText } from './session-evidence.js';
3
+ export type { ClassifierSessionEvidence, ClassifierSessionEvidenceLimits } from './session-evidence.js';
4
+ export type { Classifier, ClassifierAnswer, ClassifierAnswers, ClassifierEvaluationMetadata, ClassifierQuestion, ClassifierQuestions, ClassifierProbabilityAnswer, ClassifierProbabilityAnswers, ClassifierProbabilityQuestion, ClassifierProbabilityQuestions, ClassifierUsage, } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/classifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACjG,YAAY,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AACxG,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,4BAA4B,EAC5B,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC9B,eAAe,GAChB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createJevClassifier } from './jev/classifier.js';
2
+ export { collectClassifierSessionEvidence, sanitizeClassifierText } from './session-evidence.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/classifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Classifier } from '../classifier.js';
1
+ import type { Classifier } from '../types.js';
2
2
  import { type CreateJevClientOptions } from './client.js';
3
3
  export declare function createJevClassifier(): Classifier | undefined;
4
4
  export declare function createJevClassifierWithOptions(options: CreateJevClientOptions): Classifier | undefined;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../../src/classifier/jev/classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAIX,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,sBAAsB,EAE5B,MAAM,aAAa,CAAC;AAErB,wBAAgB,mBAAmB,IAAI,UAAU,GAAG,SAAS,CAE5D;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,sBAAsB,GAC9B,UAAU,GAAG,SAAS,CA4BxB"}
@@ -7,6 +7,9 @@ export function createJevClassifierWithOptions(options) {
7
7
  if (!client.resolveTransport())
8
8
  return undefined;
9
9
  return {
10
+ canEvaluate(state, questions) {
11
+ return client.canEvaluate(state, questions);
12
+ },
10
13
  async evaluate(state, questions, signal) {
11
14
  const started = Date.now();
12
15
  const result = await client.evaluate(state, questions, signal === undefined ? {} : { signal });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../../src/classifier/jev/classifier.ts"],"names":[],"mappings":"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"}
@@ -49,12 +49,14 @@ export declare class JevClientError extends Error {
49
49
  export interface CreateJevClientOptions extends JevCredentialSources {
50
50
  readonly fetch?: JevFetch;
51
51
  readonly timeoutMs?: number;
52
+ readonly maxQuestionsPerRequest?: number;
52
53
  }
53
54
  export interface JevEvaluateOptions {
54
55
  readonly signal?: AbortSignal;
55
56
  }
56
57
  export declare function createJevClient(options?: CreateJevClientOptions): {
57
58
  resolveTransport(): ReturnType<typeof resolveJevTransport>;
59
+ canEvaluate(state: unknown, questions: JevQuestions): boolean;
58
60
  evaluate(state: unknown, questions: JevQuestions, evaluateOptions?: JevEvaluateOptions): Promise<JevEvaluation>;
59
61
  };
60
62
  //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/classifier/jev/client.ts"],"names":[],"mappings":"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"}
@@ -9,25 +9,40 @@ export class JevClientError extends Error {
9
9
  }
10
10
  const DEFAULT_TIMEOUT_MS = 20_000;
11
11
  const MAX_TIMEOUT_MS = 60_000;
12
- const MAX_STATE_BYTES = 64 * 1_024;
13
- const MAX_REQUEST_BYTES = 128 * 1_024;
12
+ const MAX_COMBINED_INPUT_BYTES = 64_000;
13
+ const MAX_STATE_AND_QUESTION_BYTES = 32_000;
14
14
  const MAX_RESPONSE_BYTES = 256 * 1_024;
15
- const MAX_QUESTIONS = 256;
16
15
  const MAX_INSTRUCTIONS_BYTES = 4_096;
17
16
  const PINNED_HOSTS = new Set(['api.typesafe.ai', 'openrouter.ai']);
18
17
  export function createJevClient(options = {}) {
19
18
  const timeoutMs = normalizeTimeout(options.timeoutMs);
19
+ const maxQuestionsPerRequest = options.maxQuestionsPerRequest;
20
+ if (maxQuestionsPerRequest !== undefined && (!Number.isSafeInteger(maxQuestionsPerRequest) || maxQuestionsPerRequest < 1)) {
21
+ throw new JevClientError('invalid_request', 'Jev max questions per request must be a positive safe integer');
22
+ }
20
23
  const fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);
21
24
  return {
22
25
  resolveTransport() {
23
26
  return resolveTransport(options);
24
27
  },
28
+ canEvaluate(state, questions) {
29
+ try {
30
+ const transport = resolveTransport(options);
31
+ if (!transport)
32
+ return false;
33
+ partitionQuestions(transport.model, state, questionEntries(questions), maxQuestionsPerRequest);
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ },
25
40
  async evaluate(state, questions, evaluateOptions = {}) {
26
41
  const transport = resolveTransport(options);
27
42
  if (!transport)
28
43
  throw new JevClientError('unavailable', 'Jev credentials are unavailable');
29
44
  const entries = questionEntries(questions);
30
- const batches = partitionQuestions(transport.model, state, entries);
45
+ const batches = partitionQuestions(transport.model, state, entries, maxQuestionsPerRequest);
31
46
  const answers = {};
32
47
  let requests = 0;
33
48
  let usage;
@@ -59,7 +74,7 @@ async function requestAnswers(transport, fetcher, timeoutMs, state, questions, s
59
74
  throw new JevClientError('invalid_request', 'Jev endpoint is not pinned');
60
75
  }
61
76
  const body = JSON.stringify({ model: transport.model, state, questions });
62
- if (Buffer.byteLength(body, 'utf8') > MAX_REQUEST_BYTES) {
77
+ if (Buffer.byteLength(body, 'utf8') > MAX_COMBINED_INPUT_BYTES) {
63
78
  throw new JevClientError('invalid_request', 'Jev request exceeds the size budget');
64
79
  }
65
80
  const controller = createTimeout(signal, timeoutMs);
@@ -108,8 +123,6 @@ function questionEntries(questions) {
108
123
  const entries = Object.entries(questions);
109
124
  if (entries.length === 0)
110
125
  throw new JevClientError('invalid_request', 'Jev questions are required');
111
- if (entries.length > MAX_QUESTIONS)
112
- throw new JevClientError('invalid_request', 'Jev question count exceeds the budget');
113
126
  for (const [name, question] of entries) {
114
127
  if (!name.trim() || name.length > 128)
115
128
  throw new JevClientError('invalid_request', 'Jev question id is invalid');
@@ -131,27 +144,31 @@ function validateQuestion(question) {
131
144
  throw new JevClientError('invalid_request', 'Jev score criteria are invalid');
132
145
  }
133
146
  }
134
- function partitionQuestions(model, state, entries) {
147
+ function partitionQuestions(model, state, entries, maxQuestionsPerRequest) {
135
148
  const stateBytes = Buffer.byteLength(JSON.stringify(state), 'utf8');
136
- if (stateBytes === 0 || stateBytes > MAX_STATE_BYTES) {
149
+ if (stateBytes === 0 || stateBytes > MAX_STATE_AND_QUESTION_BYTES) {
137
150
  throw new JevClientError('invalid_request', 'Jev state exceeds the size budget');
138
151
  }
139
152
  const overhead = Buffer.byteLength(JSON.stringify({ model, state, questions: {} }), 'utf8');
140
153
  const batches = [];
141
154
  let current = {};
142
155
  let currentBytes = overhead;
156
+ let currentCount = 0;
143
157
  for (const [name, question] of entries) {
144
158
  const added = Buffer.byteLength(JSON.stringify({ [name]: question }), 'utf8') + 1;
145
- if (overhead + added > MAX_REQUEST_BYTES) {
159
+ if (overhead + added > MAX_STATE_AND_QUESTION_BYTES) {
146
160
  throw new JevClientError('invalid_request', 'Jev question exceeds the size budget');
147
161
  }
148
- if (Object.keys(current).length > 0 && currentBytes + added > MAX_REQUEST_BYTES) {
162
+ if (currentCount > 0 && (currentBytes + added > MAX_COMBINED_INPUT_BYTES
163
+ || (maxQuestionsPerRequest !== undefined && currentCount >= maxQuestionsPerRequest))) {
149
164
  batches.push(current);
150
165
  current = {};
151
166
  currentBytes = overhead;
167
+ currentCount = 0;
152
168
  }
153
169
  current[name] = question;
154
170
  currentBytes += added;
171
+ currentCount += 1;
155
172
  }
156
173
  batches.push(current);
157
174
  return batches;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/classifier/jev/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/classifier/jev/credentials.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,YAAY,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,sBAAsB,yCAAyC,CAAC;AAC7E,eAAO,MAAM,wBAAwB,8CAA8C,CAAC;AACpF,eAAO,MAAM,cAAc,eAAe,CAAC;AAC3C,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAEpD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,oBAAoB,GAAG,SAAS,CAYnG;AAoBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEtF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/classifier/jev/credentials.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAkB5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,sCAAsC,CAAC;AAC7E,MAAM,CAAC,MAAM,wBAAwB,GAAG,2CAA2C,CAAC;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IACvD,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,mBAAmB,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IACrH,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,gBAAgB,CAAC;WAC9D,mBAAmB,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEzD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC5C,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,IAAI,QAAQ,KAAK,YAAY;QAAE,OAAO,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,IAAI,WAAW;QAAE,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACvD,IAAI,aAAa;QAAE,OAAO,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,MAAM;QACN,GAAG,EAAE,IAAI,GAAG,CAAC,sBAAsB,CAAC;QACpC,KAAK,EAAE,cAAc;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,MAAM;QACN,GAAG,EAAE,IAAI,GAAG,CAAC,wBAAwB,CAAC;QACtC,KAAK,EAAE,gBAAgB;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAA8B;IAC5E,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACzE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,oBAAoB,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClG,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { SessionManager } from '@earendil-works/pi-coding-agent';
2
+ export interface ClassifierSessionEvidence {
3
+ readonly conversation: ReadonlyArray<{
4
+ readonly role: 'user' | 'assistant' | 'summary';
5
+ readonly text: string;
6
+ }>;
7
+ readonly tool_activity: ReadonlyArray<{
8
+ readonly tool: string;
9
+ readonly input: string;
10
+ readonly result?: 'ok' | 'failed';
11
+ readonly exit_code?: number;
12
+ readonly task_status?: string;
13
+ }>;
14
+ }
15
+ export interface ClassifierSessionEvidenceLimits {
16
+ readonly maxConversationItems?: number;
17
+ readonly maxToolActivities?: number;
18
+ readonly maxTextBytes?: number;
19
+ readonly maxToolInputBytes?: number;
20
+ readonly maxTotalBytes?: number;
21
+ readonly maxSourceEntries?: number;
22
+ }
23
+ export declare function collectClassifierSessionEvidence(session: Pick<SessionManager, 'buildSessionProjection' | 'buildContextEntries'>, limits?: ClassifierSessionEvidenceLimits): ClassifierSessionEvidence;
24
+ export declare function sanitizeClassifierText(value: unknown, maxBytes: number): string;
25
+ //# sourceMappingURL=session-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-evidence.d.ts","sourceRoot":"","sources":["../../src/classifier/session-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjH,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;QACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC;QAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAoBD,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,wBAAwB,GAAG,qBAAqB,CAAC,EAC/E,MAAM,GAAE,+BAAoC,GAC3C,yBAAyB,CAkF3B;AAiDD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/E"}
@@ -0,0 +1,159 @@
1
+ const encoder = new TextEncoder();
2
+ const defaults = {
3
+ maxConversationItems: 24,
4
+ maxToolActivities: 40,
5
+ maxTextBytes: 1_200,
6
+ maxToolInputBytes: 160,
7
+ maxTotalBytes: 16_384,
8
+ maxSourceEntries: 4_096,
9
+ };
10
+ export function collectClassifierSessionEvidence(session, limits = {}) {
11
+ const bounds = {
12
+ maxConversationItems: bound(limits.maxConversationItems, defaults.maxConversationItems),
13
+ maxToolActivities: bound(limits.maxToolActivities, defaults.maxToolActivities, 4_096),
14
+ maxTextBytes: bound(limits.maxTextBytes, defaults.maxTextBytes),
15
+ maxToolInputBytes: bound(limits.maxToolInputBytes, defaults.maxToolInputBytes),
16
+ maxTotalBytes: bound(limits.maxTotalBytes, defaults.maxTotalBytes, 256 * 1_024),
17
+ maxSourceEntries: bound(limits.maxSourceEntries, defaults.maxSourceEntries),
18
+ };
19
+ const conversation = [];
20
+ const toolActivity = [];
21
+ const calls = new Map();
22
+ const recent = (items) => bounds.maxSourceEntries === 0 ? [] : items.slice(-bounds.maxSourceEntries);
23
+ const projection = typeof session.buildSessionProjection === 'function'
24
+ ? recent(session.buildSessionProjection().entries).flatMap(({ sourceEntry, messages }) => (sourceEntry.type === 'compaction' || sourceEntry.type === 'branch_summary'
25
+ ? [{ role: 'summary', text: sourceEntry.summary }]
26
+ : messages))
27
+ : recent(session.buildContextEntries()).flatMap((entry) => (entry.type === 'compaction' || entry.type === 'branch_summary'
28
+ ? [{ role: 'summary', text: entry.summary }]
29
+ : entry.type === 'message' ? [entry.message] : []));
30
+ for (const message of projection) {
31
+ if (!isRecord(message))
32
+ continue;
33
+ if (message.role === 'summary') {
34
+ const text = safeText(message.text, bounds.maxTextBytes);
35
+ if (text)
36
+ conversation.push({ role: 'summary', text });
37
+ continue;
38
+ }
39
+ if (message.role === 'toolResult' && typeof message.toolCallId === 'string') {
40
+ const call = calls.get(message.toolCallId);
41
+ if (call) {
42
+ const exitCode = resultExitCode(message);
43
+ call.result = message.isError === true || (exitCode !== undefined && exitCode !== 0) ? 'failed' : 'ok';
44
+ if (exitCode !== undefined)
45
+ call.exit_code = exitCode;
46
+ const details = message.details;
47
+ if (isRecord(details) && isRecord(details.task) && typeof details.task.status === 'string') {
48
+ call.task_status = safeText(details.task.status, 48);
49
+ }
50
+ }
51
+ continue;
52
+ }
53
+ if (message.role !== 'user' && message.role !== 'assistant')
54
+ continue;
55
+ const text = safeText(contentText(message.content), bounds.maxTextBytes);
56
+ if (text)
57
+ conversation.push({ role: message.role, text });
58
+ if (message.role !== 'assistant' || !Array.isArray(message.content))
59
+ continue;
60
+ for (const part of message.content) {
61
+ if (!isRecord(part) || part.type !== 'toolCall' || typeof part.name !== 'string')
62
+ continue;
63
+ const call = {
64
+ tool: safeText(part.name, 80), input: toolInput(part.arguments, bounds.maxToolInputBytes),
65
+ };
66
+ if (!call.tool)
67
+ continue;
68
+ toolActivity.push(call);
69
+ if (typeof part.id === 'string')
70
+ calls.set(part.id, call);
71
+ }
72
+ }
73
+ let remaining = Math.max(0, bounds.maxTotalBytes - 44);
74
+ const fit = (values, maxItems) => {
75
+ const kept = [];
76
+ for (let index = values.length - 1; index >= 0 && kept.length < maxItems; index--) {
77
+ const item = values[index];
78
+ const size = encoder.encode(JSON.stringify(item)).byteLength;
79
+ if (size > remaining)
80
+ continue;
81
+ remaining -= size;
82
+ kept.push(item);
83
+ }
84
+ return kept.reverse();
85
+ };
86
+ const evidence = {
87
+ conversation: fit(conversation, bounds.maxConversationItems),
88
+ tool_activity: fit(toolActivity, bounds.maxToolActivities),
89
+ };
90
+ while (encoder.encode(JSON.stringify(evidence)).byteLength > bounds.maxTotalBytes) {
91
+ if (evidence.tool_activity.length > 0)
92
+ evidence.tool_activity.shift();
93
+ else if (evidence.conversation.length > 0)
94
+ evidence.conversation.shift();
95
+ else
96
+ break;
97
+ }
98
+ return evidence;
99
+ }
100
+ function toolInput(value, maxBytes) {
101
+ if (!isRecord(value))
102
+ return '';
103
+ for (const key of ['path', 'file_path', 'command', 'pattern', 'query', 'description', 'title']) {
104
+ if (typeof value[key] === 'string')
105
+ return safeText(value[key], maxBytes);
106
+ }
107
+ return '';
108
+ }
109
+ function resultExitCode(message) {
110
+ const details = message.details;
111
+ if (isRecord(details) && typeof details.exitCode === 'number' && Number.isSafeInteger(details.exitCode))
112
+ return details.exitCode;
113
+ const text = safeText(contentText(message.content), 256);
114
+ const match = /(?:Exit(?: code)?):\s*(\d+)/iu.exec(text);
115
+ return match ? Number(match[1]) : undefined;
116
+ }
117
+ function contentText(value) {
118
+ if (typeof value === 'string')
119
+ return value;
120
+ if (!Array.isArray(value))
121
+ return '';
122
+ return value.flatMap((part) => (isRecord(part) && part.type === 'text' && typeof part.text === 'string' ? [part.text] : [])).join('\n');
123
+ }
124
+ function safeText(value, maxBytes) {
125
+ if (typeof value !== 'string' || maxBytes <= 0)
126
+ return '';
127
+ let text = value.slice(0, Math.max(512, maxBytes * 8))
128
+ .replace(/\r\n?/gu, '\n')
129
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f\u202a-\u202e\u2066-\u2069]/gu, '')
130
+ .replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?(?:-----END [^-]*PRIVATE KEY-----|$)/gu, '[REDACTED_PRIVATE_KEY]')
131
+ .replace(/\b(?:sk-[A-Za-z0-9_-]+|ghp_[A-Za-z0-9]+|github_pat_[A-Za-z0-9_]+|xox[baprs]-[A-Za-z0-9-]+)\b/gu, '[REDACTED_TOKEN]')
132
+ .replace(/(Bearer\s+)[A-Za-z0-9._~+/=-]+/giu, '$1[REDACTED_TOKEN]')
133
+ .replace(/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|password|secret|authorization)["']?\s*[:=]\s*["']?)[^"'\s,}]+/giu, '$1[REDACTED_SECRET]')
134
+ .trim();
135
+ if (encoder.encode(text).byteLength <= maxBytes)
136
+ return text;
137
+ let bytes = 0;
138
+ let end = 0;
139
+ for (const codepoint of text) {
140
+ const size = encoder.encode(codepoint).byteLength;
141
+ if (bytes + size > maxBytes)
142
+ break;
143
+ bytes += size;
144
+ end += codepoint.length;
145
+ }
146
+ text = text.slice(0, end).trimEnd();
147
+ return text;
148
+ }
149
+ export function sanitizeClassifierText(value, maxBytes) {
150
+ return safeText(value, bound(maxBytes, 4_096, 16_384));
151
+ }
152
+ function isRecord(value) {
153
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
154
+ }
155
+ function bound(value, fallback, maximum = fallback * 16) {
156
+ return value !== undefined && Number.isSafeInteger(value) && value >= 0
157
+ ? Math.min(value, maximum) : fallback;
158
+ }
159
+ //# sourceMappingURL=session-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-evidence.js","sourceRoot":"","sources":["../../src/classifier/session-evidence.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,7 @@ export interface ClassifierEvaluationMetadata {
32
32
  readonly elapsedMs?: number;
33
33
  }
34
34
  export interface Classifier {
35
+ canEvaluate?(state: unknown, questions: ClassifierQuestions): boolean;
35
36
  evaluate(state: unknown, questions: ClassifierQuestions, signal?: AbortSignal): Promise<{
36
37
  readonly answers: ClassifierAnswers;
37
38
  readonly metadata?: ClassifierEvaluationMetadata;
@@ -41,4 +42,4 @@ export interface Classifier {
41
42
  readonly metadata?: ClassifierEvaluationMetadata;
42
43
  }>;
43
44
  }
44
- //# sourceMappingURL=classifier.d.ts.map
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/classifier/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE3E,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC,CAAC;AAErG,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC;AAEjG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC;IACtE,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,mBAAmB,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QACT,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;KAClD,CAAC,CAAC;IACH,qBAAqB,CAAC,CACpB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,8BAA8B,EACzC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;QACT,QAAQ,CAAC,OAAO,EAAE,4BAA4B,CAAC;QAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;KAClD,CAAC,CAAC;CACJ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/classifier/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { selectDynamicThinkingLevel, supportsDynamicThinking } from './selection.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dynamic-thinking/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { selectDynamicThinkingLevel, supportsDynamicThinking } from './selection.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dynamic-thinking/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Api, AssistantMessage, Model } from '@earendil-works/pi-ai';
2
+ import type { SavingsReporter } from '../savings.js';
3
+ import type { FelanThinkingLevel } from '../thinking.js';
4
+ export declare const DYNAMIC_THINKING_SAVINGS_METHOD = "high-effort-reasoning-5pct-heuristic-v1";
5
+ export declare function estimateHighEffortOutputTokens(model: Model<Api>, previous: FelanThinkingLevel, selected: FelanThinkingLevel, usage: {
6
+ readonly output: number;
7
+ readonly reasoning?: number;
8
+ }): number | undefined;
9
+ export declare function reportDynamicThinkingSavings(reporter: SavingsReporter | undefined, model: Model<Api>, previous: FelanThinkingLevel, selected: FelanThinkingLevel, message: AssistantMessage, classifierCostUsd?: number): Promise<void>;
10
+ //# sourceMappingURL=savings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"savings.d.ts","sourceRoot":"","sources":["../../src/dynamic-thinking/savings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,eAAe,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAKzD,eAAO,MAAM,+BAA+B,4CAA4C,CAAC;AAEzF,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -0,0 +1,56 @@
1
+ import { supportsDynamicThinking } from './selection.js';
2
+ const HIGH_EFFORT_REASONING_UPLIFT_DENOMINATOR = 20;
3
+ export const DYNAMIC_THINKING_SAVINGS_METHOD = 'high-effort-reasoning-5pct-heuristic-v1';
4
+ export function estimateHighEffortOutputTokens(model, previous, selected, usage) {
5
+ if (!supportsDynamicThinking(model) || previous !== 'high' || (selected !== 'low' && selected !== 'medium')) {
6
+ return undefined;
7
+ }
8
+ const { output, reasoning } = usage;
9
+ if (!Number.isSafeInteger(output) || output <= 0 || reasoning === undefined
10
+ || !Number.isSafeInteger(reasoning) || reasoning <= 0 || reasoning > output)
11
+ return undefined;
12
+ const extra = Math.floor(reasoning / HIGH_EFFORT_REASONING_UPLIFT_DENOMINATOR);
13
+ const estimated = output + extra;
14
+ return extra > 0 && Number.isSafeInteger(estimated) ? estimated : undefined;
15
+ }
16
+ export async function reportDynamicThinkingSavings(reporter, model, previous, selected, message, classifierCostUsd) {
17
+ if (!reporter || (message.stopReason !== 'stop' && message.stopReason !== 'toolUse'))
18
+ return;
19
+ const { usage } = message;
20
+ const highOutput = estimateHighEffortOutputTokens(model, previous, selected, usage);
21
+ if (highOutput === undefined || ![usage.input, usage.output, usage.cacheRead, usage.cacheWrite]
22
+ .every((value) => Number.isSafeInteger(value) && value >= 0)
23
+ || (usage.cacheWrite1h !== undefined && (!Number.isSafeInteger(usage.cacheWrite1h)
24
+ || usage.cacheWrite1h < 0 || usage.cacheWrite1h > usage.cacheWrite))
25
+ || !Number.isFinite(usage.cost.total) || usage.cost.total < 0
26
+ || !Number.isFinite(usage.cost.output) || usage.cost.output <= 0
27
+ || (classifierCostUsd !== undefined && (!Number.isFinite(classifierCostUsd) || classifierCostUsd < 0)))
28
+ return;
29
+ const extraCostUsd = (highOutput - usage.output) * usage.cost.output / usage.output;
30
+ if (extraCostUsd <= (classifierCostUsd ?? 0))
31
+ return;
32
+ const modelRef = { provider: model.provider, id: model.id };
33
+ const tokens = {
34
+ input: usage.input,
35
+ output: usage.output,
36
+ cacheRead: usage.cacheRead,
37
+ cacheWrite: usage.cacheWrite,
38
+ ...(usage.cacheWrite1h === undefined ? {} : { cacheWrite1h: usage.cacheWrite1h }),
39
+ };
40
+ try {
41
+ await reporter.report({
42
+ category: 'output-optimization',
43
+ operation: 'dynamic-thinking',
44
+ baseline: {
45
+ model: modelRef, tokens: { ...tokens, output: highOutput },
46
+ costUsd: usage.cost.total + extraCostUsd,
47
+ },
48
+ actual: {
49
+ model: modelRef, tokens, costUsd: usage.cost.total + (classifierCostUsd ?? 0),
50
+ },
51
+ basis: { kind: 'estimated-baseline', method: DYNAMIC_THINKING_SAVINGS_METHOD },
52
+ });
53
+ }
54
+ catch { }
55
+ }
56
+ //# sourceMappingURL=savings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"savings.js","sourceRoot":"","sources":["../../src/dynamic-thinking/savings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type Api, type Model } from '@earendil-works/pi-ai';
2
+ import { type Classifier, type ClassifierSessionEvidence } from '../classifier/index.js';
3
+ import type { FelanThinkingLevel } from '../thinking.js';
4
+ export declare function supportsDynamicThinking(model: Model<Api> | undefined): model is Model<Api>;
5
+ export declare function selectDynamicThinkingLevel(classifier: Classifier, model: Model<Api>, request: string, session: ClassifierSessionEvidence, current: FelanThinkingLevel, signal?: AbortSignal): Promise<FelanThinkingLevel | undefined>;
6
+ export interface DynamicThinkingDecision {
7
+ readonly level: FelanThinkingLevel;
8
+ readonly classifierCostUsd?: number;
9
+ }
10
+ export declare function evaluateDynamicThinkingLevel(classifier: Classifier, model: Model<Api>, request: string, session: ClassifierSessionEvidence, current: FelanThinkingLevel, signal?: AbortSignal): Promise<DynamicThinkingDecision | undefined>;
11
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/dynamic-thinking/selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAGL,KAAK,UAAU,EAEf,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAKzD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,CAQ1F;AAED,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAEzC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAyC9C"}