@namzu/sdk 0.4.5 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +148 -0
- package/dist/advisory/executor.d.ts.map +1 -1
- package/dist/advisory/executor.js +3 -2
- package/dist/advisory/executor.js.map +1 -1
- package/dist/advisory/executor.test.js +36 -14
- package/dist/advisory/executor.test.js.map +1 -1
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +1 -0
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +3 -2
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +2 -0
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +23 -9
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/a2a/mapper.test.js +35 -9
- package/dist/bridge/a2a/mapper.test.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +60 -8
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/bridge/sse/mapper.test.js +123 -16
- package/dist/bridge/sse/mapper.test.js.map +1 -1
- package/dist/compaction/verifier.d.ts.map +1 -1
- package/dist/compaction/verifier.js +3 -2
- package/dist/compaction/verifier.js.map +1 -1
- package/dist/config/runtime.js +1 -1
- package/dist/config/runtime.js.map +1 -1
- package/dist/contracts/api.d.ts +1 -1
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/contracts/schemas.js +1 -1
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/gateway/local.d.ts +1 -1
- package/dist/gateway/local.d.ts.map +1 -1
- package/dist/gateway/local.js +1 -0
- package/dist/gateway/local.js.map +1 -1
- package/dist/manager/agent/__tests__/lifecycle.test.js +2 -2
- package/dist/provider/collect.d.ts +25 -0
- package/dist/provider/collect.d.ts.map +1 -0
- package/dist/provider/collect.js +82 -0
- package/dist/provider/collect.js.map +1 -0
- package/dist/provider/collect.test.d.ts +22 -0
- package/dist/provider/collect.test.d.ts.map +1 -0
- package/dist/provider/collect.test.js +123 -0
- package/dist/provider/collect.test.js.map +1 -0
- package/dist/provider/instrumentation.d.ts.map +1 -1
- package/dist/provider/instrumentation.js +10 -43
- package/dist/provider/instrumentation.js.map +1 -1
- package/dist/provider/instrumentation.test.d.ts +15 -0
- package/dist/provider/instrumentation.test.d.ts.map +1 -1
- package/dist/provider/instrumentation.test.js +73 -87
- package/dist/provider/instrumentation.test.js.map +1 -1
- package/dist/provider/mock.d.ts +1 -2
- package/dist/provider/mock.d.ts.map +1 -1
- package/dist/provider/mock.js +2 -5
- package/dist/provider/mock.js.map +1 -1
- package/dist/public-runtime.d.ts +1 -0
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +1 -0
- package/dist/public-runtime.js.map +1 -1
- package/dist/run/LimitChecker.test.d.ts +2 -0
- package/dist/run/LimitChecker.test.d.ts.map +1 -0
- package/dist/run/LimitChecker.test.js +26 -0
- package/dist/run/LimitChecker.test.js.map +1 -0
- package/dist/run/reporter.d.ts.map +1 -1
- package/dist/run/reporter.js +10 -6
- package/dist/run/reporter.js.map +1 -1
- package/dist/runtime/query/__tests__/prompt.test.d.ts +2 -0
- package/dist/runtime/query/__tests__/prompt.test.d.ts.map +1 -0
- package/dist/runtime/query/__tests__/prompt.test.js +35 -0
- package/dist/runtime/query/__tests__/prompt.test.js.map +1 -0
- package/dist/runtime/query/context-cache.d.ts +2 -0
- package/dist/runtime/query/context-cache.d.ts.map +1 -1
- package/dist/runtime/query/context-cache.js +3 -0
- package/dist/runtime/query/context-cache.js.map +1 -1
- package/dist/runtime/query/events.d.ts +2 -0
- package/dist/runtime/query/events.d.ts.map +1 -1
- package/dist/runtime/query/events.js +48 -1
- package/dist/runtime/query/events.js.map +1 -1
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +55 -5
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/index.d.ts +2 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +2 -0
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +245 -13
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +2 -0
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/prompt.d.ts +2 -0
- package/dist/runtime/query/prompt.d.ts.map +1 -1
- package/dist/runtime/query/prompt.js +35 -13
- package/dist/runtime/query/prompt.js.map +1 -1
- package/dist/session/__tests__/integration/e2e-spawn.test.js +2 -2
- package/dist/session/__tests__/integration/event-stream-ordering.test.d.ts +1 -1
- package/dist/session/__tests__/integration/event-stream-ordering.test.js +7 -7
- package/dist/streaming/coalesce.d.ts +28 -0
- package/dist/streaming/coalesce.d.ts.map +1 -0
- package/dist/streaming/coalesce.js +75 -0
- package/dist/streaming/coalesce.js.map +1 -0
- package/dist/streaming/coalesce.test.d.ts +19 -0
- package/dist/streaming/coalesce.test.d.ts.map +1 -0
- package/dist/streaming/coalesce.test.js +120 -0
- package/dist/streaming/coalesce.test.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +2 -0
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +1 -0
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/types/agent/base.d.ts +7 -0
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/gateway.d.ts +2 -1
- package/dist/types/agent/gateway.d.ts.map +1 -1
- package/dist/types/ids/index.d.ts +10 -0
- package/dist/types/ids/index.d.ts.map +1 -1
- package/dist/types/ids/index.js.map +1 -1
- package/dist/types/provider/interface.d.ts +16 -2
- package/dist/types/provider/interface.d.ts.map +1 -1
- package/dist/types/provider/stream.d.ts +18 -0
- package/dist/types/provider/stream.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +58 -8
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js +23 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/run/schema-version.d.ts +7 -1
- package/dist/types/run/schema-version.d.ts.map +1 -1
- package/dist/types/run/schema-version.js +7 -1
- package/dist/types/run/schema-version.js.map +1 -1
- package/dist/types/run/stop-reason.d.ts +9 -0
- package/dist/types/run/stop-reason.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/advisory/executor.test.ts +37 -15
- package/src/advisory/executor.ts +10 -7
- package/src/agents/ReactiveAgent.ts +1 -0
- package/src/agents/RouterAgent.ts +9 -6
- package/src/agents/SupervisorAgent.ts +2 -0
- package/src/bridge/a2a/mapper.test.ts +35 -9
- package/src/bridge/a2a/mapper.ts +23 -9
- package/src/bridge/sse/mapper.test.ts +152 -24
- package/src/bridge/sse/mapper.ts +66 -9
- package/src/compaction/verifier.ts +9 -6
- package/src/config/runtime.ts +1 -1
- package/src/contracts/api.ts +7 -0
- package/src/contracts/schemas.ts +1 -1
- package/src/gateway/local.ts +3 -2
- package/src/manager/agent/__tests__/lifecycle.test.ts +2 -2
- package/src/provider/collect.test.ts +142 -0
- package/src/provider/collect.ts +85 -0
- package/src/provider/instrumentation.test.ts +81 -100
- package/src/provider/instrumentation.ts +11 -53
- package/src/provider/mock.ts +2 -6
- package/src/public-runtime.ts +1 -0
- package/src/run/LimitChecker.test.ts +32 -0
- package/src/run/reporter.ts +10 -7
- package/src/runtime/query/__tests__/prompt.test.ts +38 -0
- package/src/runtime/query/context-cache.ts +5 -0
- package/src/runtime/query/events.ts +52 -1
- package/src/runtime/query/executor.ts +54 -5
- package/src/runtime/query/index.ts +5 -1
- package/src/runtime/query/iteration/index.ts +301 -26
- package/src/runtime/query/iteration/phases/compaction.ts +2 -0
- package/src/runtime/query/prompt.ts +45 -17
- package/src/session/__tests__/integration/e2e-spawn.test.ts +2 -2
- package/src/session/__tests__/integration/event-stream-ordering.test.ts +7 -7
- package/src/streaming/coalesce.test.ts +132 -0
- package/src/streaming/coalesce.ts +89 -0
- package/src/tools/coordinator/index.ts +3 -0
- package/src/types/agent/base.ts +9 -0
- package/src/types/agent/gateway.ts +3 -1
- package/src/types/ids/index.ts +10 -0
- package/src/types/provider/interface.ts +16 -3
- package/src/types/provider/stream.ts +18 -0
- package/src/types/run/events.ts +105 -9
- package/src/types/run/schema-version.ts +7 -1
- package/src/types/run/stop-reason.ts +17 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/gateway/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAI9D,qBAAa,gBAAiB,YAAW,WAAW;IACnD,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,cAAc,CAAyB;IAE/C,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/gateway/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAI9D,qBAAa,gBAAiB,YAAW,WAAW;IACnD,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,cAAc,CAAyB;IAE/C,OAAO,CAAC,WAAW,CAAC,CAA2E;IAE/F,OAAO,CAAC,mBAAmB,CAA+C;gBAGzE,YAAY,EAAE,oBAAoB,EAClC,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,CAAC,EAAE,gBAAgB,EAC3B,WAAW,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,sBAAsB,GAAG,gBAAgB,CAAC;IAQlF,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IA+C3D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAShD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAK/C,SAAS,IAAI,UAAU,EAAE;IASzB,eAAe,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI;CAMnE"}
|
package/dist/gateway/local.js
CHANGED
|
@@ -22,6 +22,7 @@ export class LocalTaskGateway {
|
|
|
22
22
|
workingDirectory: options.workingDirectory,
|
|
23
23
|
taskStore: this.parentInput?.taskStore,
|
|
24
24
|
runtimeToolOverrides: this.parentInput?.runtimeToolOverrides,
|
|
25
|
+
runtimeContext: options.runtimeContext ?? this.parentInput?.runtimeContext,
|
|
25
26
|
},
|
|
26
27
|
// Phase 6: spawn scope propagates from the gateway's task context.
|
|
27
28
|
// The caller built it at SupervisorAgent boundary (§12.1).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/gateway/local.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,OAAO,gBAAgB;IACpB,YAAY,CAAsB;IAClC,WAAW,CAAkB;IAC7B,QAAQ,CAA8B;IACtC,cAAc,GAAgB,IAAI,GAAG,EAAE,CAAA;IAEvC,WAAW,
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/gateway/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -174,13 +174,13 @@ describe('AgentManager.sendMessage — Phase 6 SubSession spawn', () => {
|
|
|
174
174
|
expect(spawned.lineage.parentSessionId).toBe(harness.parentSession.id);
|
|
175
175
|
expect(spawned.lineage.rootSessionId).toBe(harness.parentSession.id);
|
|
176
176
|
expect(spawned.lineage.depth).toBe(1);
|
|
177
|
-
expect(spawned.schemaVersion).toBe(
|
|
177
|
+
expect(spawned.schemaVersion).toBe(3);
|
|
178
178
|
}
|
|
179
179
|
const idled = events.find((e) => e.type === 'subsession_idled');
|
|
180
180
|
expect(idled).toBeDefined();
|
|
181
181
|
if (idled && 'lineage' in idled) {
|
|
182
182
|
expect(idled.lineage.depth).toBe(1);
|
|
183
|
-
expect(idled.schemaVersion).toBe(
|
|
183
|
+
expect(idled.schemaVersion).toBe(3);
|
|
184
184
|
}
|
|
185
185
|
});
|
|
186
186
|
it('width: exceeding maxDelegationWidth (8) rejects with DelegationCapacityExceeded', async () => {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ChatCompletionResponse } from '../types/provider/chat.js';
|
|
2
|
+
import type { StreamChunk } from '../types/provider/stream.js';
|
|
3
|
+
/**
|
|
4
|
+
* Drains a {@link StreamChunk} async iterable into the equivalent
|
|
5
|
+
* non-streaming {@link ChatCompletionResponse}.
|
|
6
|
+
*
|
|
7
|
+
* Phase 2 of ses_001-tool-stream-events removes `LLMProvider.chat()`; the
|
|
8
|
+
* four internal callers that genuinely need the aggregated view (advisory
|
|
9
|
+
* executor, RouterAgent's deterministic routing decision, compaction's
|
|
10
|
+
* verifier, the instrumentation wrapper) replace `provider.chat(p)` with
|
|
11
|
+
* `collect(provider.chatStream(p))`.
|
|
12
|
+
*
|
|
13
|
+
* Behaviour matches the pre-removal `chat()` contract:
|
|
14
|
+
* - text content is concatenated in delta order;
|
|
15
|
+
* - tool calls are bucketed by `index` into the existing
|
|
16
|
+
* `Array<{ id, function: { name, arguments } }>` shape;
|
|
17
|
+
* - usage and finishReason fall back to safe defaults when the provider
|
|
18
|
+
* omits them (defensive — see anthropics/anthropic-sdk-typescript#842
|
|
19
|
+
* where `message_stop` is occasionally dropped on connection close).
|
|
20
|
+
*
|
|
21
|
+
* The orchestrator does NOT call this helper — it consumes the stream
|
|
22
|
+
* directly so it can emit per-delta `RunEvent`s.
|
|
23
|
+
*/
|
|
24
|
+
export declare function collect(stream: AsyncIterable<StreamChunk>): Promise<ChatCompletionResponse>;
|
|
25
|
+
//# sourceMappingURL=collect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/provider/collect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAE9D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA4DjG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drains a {@link StreamChunk} async iterable into the equivalent
|
|
3
|
+
* non-streaming {@link ChatCompletionResponse}.
|
|
4
|
+
*
|
|
5
|
+
* Phase 2 of ses_001-tool-stream-events removes `LLMProvider.chat()`; the
|
|
6
|
+
* four internal callers that genuinely need the aggregated view (advisory
|
|
7
|
+
* executor, RouterAgent's deterministic routing decision, compaction's
|
|
8
|
+
* verifier, the instrumentation wrapper) replace `provider.chat(p)` with
|
|
9
|
+
* `collect(provider.chatStream(p))`.
|
|
10
|
+
*
|
|
11
|
+
* Behaviour matches the pre-removal `chat()` contract:
|
|
12
|
+
* - text content is concatenated in delta order;
|
|
13
|
+
* - tool calls are bucketed by `index` into the existing
|
|
14
|
+
* `Array<{ id, function: { name, arguments } }>` shape;
|
|
15
|
+
* - usage and finishReason fall back to safe defaults when the provider
|
|
16
|
+
* omits them (defensive — see anthropics/anthropic-sdk-typescript#842
|
|
17
|
+
* where `message_stop` is occasionally dropped on connection close).
|
|
18
|
+
*
|
|
19
|
+
* The orchestrator does NOT call this helper — it consumes the stream
|
|
20
|
+
* directly so it can emit per-delta `RunEvent`s.
|
|
21
|
+
*/
|
|
22
|
+
export async function collect(stream) {
|
|
23
|
+
let id = '';
|
|
24
|
+
const model = '';
|
|
25
|
+
let content = '';
|
|
26
|
+
let finishReason = 'stop';
|
|
27
|
+
let usage = {
|
|
28
|
+
promptTokens: 0,
|
|
29
|
+
completionTokens: 0,
|
|
30
|
+
totalTokens: 0,
|
|
31
|
+
cachedTokens: 0,
|
|
32
|
+
cacheWriteTokens: 0,
|
|
33
|
+
};
|
|
34
|
+
const toolBuckets = new Map();
|
|
35
|
+
for await (const chunk of stream) {
|
|
36
|
+
if (chunk.error) {
|
|
37
|
+
throw new Error(chunk.error);
|
|
38
|
+
}
|
|
39
|
+
if (!id && chunk.id)
|
|
40
|
+
id = chunk.id;
|
|
41
|
+
if (chunk.delta.content) {
|
|
42
|
+
content += chunk.delta.content;
|
|
43
|
+
}
|
|
44
|
+
for (const tc of chunk.delta.toolCalls ?? []) {
|
|
45
|
+
const bucket = toolBuckets.get(tc.index) ?? {
|
|
46
|
+
id: '',
|
|
47
|
+
name: '',
|
|
48
|
+
argsBuf: '',
|
|
49
|
+
};
|
|
50
|
+
if (tc.id)
|
|
51
|
+
bucket.id = tc.id;
|
|
52
|
+
if (tc.function?.name)
|
|
53
|
+
bucket.name = tc.function.name;
|
|
54
|
+
if (tc.function?.arguments)
|
|
55
|
+
bucket.argsBuf += tc.function.arguments;
|
|
56
|
+
toolBuckets.set(tc.index, bucket);
|
|
57
|
+
}
|
|
58
|
+
if (chunk.finishReason)
|
|
59
|
+
finishReason = chunk.finishReason;
|
|
60
|
+
if (chunk.usage)
|
|
61
|
+
usage = chunk.usage;
|
|
62
|
+
}
|
|
63
|
+
const toolCalls = [...toolBuckets.entries()]
|
|
64
|
+
.sort(([a], [b]) => a - b)
|
|
65
|
+
.map(([, b]) => ({
|
|
66
|
+
id: b.id,
|
|
67
|
+
type: 'function',
|
|
68
|
+
function: { name: b.name, arguments: b.argsBuf },
|
|
69
|
+
}));
|
|
70
|
+
return {
|
|
71
|
+
id,
|
|
72
|
+
model,
|
|
73
|
+
message: {
|
|
74
|
+
role: 'assistant',
|
|
75
|
+
content: content.length > 0 ? content : null,
|
|
76
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
77
|
+
},
|
|
78
|
+
finishReason,
|
|
79
|
+
usage,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/provider/collect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behavioural contract for `collect()` (ses_001-tool-stream-events phase 1A):
|
|
3
|
+
*
|
|
4
|
+
* - Drains a `StreamChunk` async iterable into a single
|
|
5
|
+
* `ChatCompletionResponse` matching the legacy `provider.chat()` shape.
|
|
6
|
+
* - Concatenates `delta.content` in arrival order; null when no text
|
|
7
|
+
* chunks ever arrive.
|
|
8
|
+
* - Buckets tool-call argument fragments by `index`; emits `toolCalls`
|
|
9
|
+
* sorted by index. `id` and `function.name` come from the first chunk
|
|
10
|
+
* that supplies them; `function.arguments` is the concatenation of all
|
|
11
|
+
* `arguments` fragments for that index.
|
|
12
|
+
* - Latest-wins for `finishReason` and `usage`; defaults
|
|
13
|
+
* `finishReason: 'stop'` and zero usage if the provider omits them
|
|
14
|
+
* (defensive — see anthropics/anthropic-sdk-typescript#842).
|
|
15
|
+
* - Throws if any chunk surfaces a `chunk.error`.
|
|
16
|
+
*
|
|
17
|
+
* Phase 2 swaps every internal `provider.chat()` call site for
|
|
18
|
+
* `collect(provider.chatStream())`; the response shape parity guarded
|
|
19
|
+
* here is what makes that swap safe.
|
|
20
|
+
*/
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=collect.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.test.d.ts","sourceRoot":"","sources":["../../src/provider/collect.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behavioural contract for `collect()` (ses_001-tool-stream-events phase 1A):
|
|
3
|
+
*
|
|
4
|
+
* - Drains a `StreamChunk` async iterable into a single
|
|
5
|
+
* `ChatCompletionResponse` matching the legacy `provider.chat()` shape.
|
|
6
|
+
* - Concatenates `delta.content` in arrival order; null when no text
|
|
7
|
+
* chunks ever arrive.
|
|
8
|
+
* - Buckets tool-call argument fragments by `index`; emits `toolCalls`
|
|
9
|
+
* sorted by index. `id` and `function.name` come from the first chunk
|
|
10
|
+
* that supplies them; `function.arguments` is the concatenation of all
|
|
11
|
+
* `arguments` fragments for that index.
|
|
12
|
+
* - Latest-wins for `finishReason` and `usage`; defaults
|
|
13
|
+
* `finishReason: 'stop'` and zero usage if the provider omits them
|
|
14
|
+
* (defensive — see anthropics/anthropic-sdk-typescript#842).
|
|
15
|
+
* - Throws if any chunk surfaces a `chunk.error`.
|
|
16
|
+
*
|
|
17
|
+
* Phase 2 swaps every internal `provider.chat()` call site for
|
|
18
|
+
* `collect(provider.chatStream())`; the response shape parity guarded
|
|
19
|
+
* here is what makes that swap safe.
|
|
20
|
+
*/
|
|
21
|
+
import { describe, expect, it } from 'vitest';
|
|
22
|
+
import { collect } from './collect.js';
|
|
23
|
+
async function* fromArray(chunks) {
|
|
24
|
+
for (const chunk of chunks)
|
|
25
|
+
yield chunk;
|
|
26
|
+
}
|
|
27
|
+
describe('collect()', () => {
|
|
28
|
+
it('aggregates text-only stream into single content string', async () => {
|
|
29
|
+
const result = await collect(fromArray([
|
|
30
|
+
{ id: 'm1', delta: { content: 'hel' } },
|
|
31
|
+
{ id: 'm1', delta: { content: 'lo' } },
|
|
32
|
+
{ id: 'm1', delta: { content: ' world' } },
|
|
33
|
+
{ id: 'm1', delta: {}, finishReason: 'stop' },
|
|
34
|
+
]));
|
|
35
|
+
expect(result.message.content).toBe('hello world');
|
|
36
|
+
expect(result.message.toolCalls).toBeUndefined();
|
|
37
|
+
expect(result.finishReason).toBe('stop');
|
|
38
|
+
expect(result.id).toBe('m1');
|
|
39
|
+
});
|
|
40
|
+
it('returns content: null when no text chunks arrive', async () => {
|
|
41
|
+
const result = await collect(fromArray([{ id: 'm', delta: {}, finishReason: 'stop' }]));
|
|
42
|
+
expect(result.message.content).toBeNull();
|
|
43
|
+
});
|
|
44
|
+
it('buckets parallel tool calls by index, preserves order', async () => {
|
|
45
|
+
const result = await collect(fromArray([
|
|
46
|
+
{
|
|
47
|
+
id: 'm',
|
|
48
|
+
delta: {
|
|
49
|
+
toolCalls: [
|
|
50
|
+
{ index: 0, id: 'toolu_a', function: { name: 'Read' } },
|
|
51
|
+
{ index: 1, id: 'toolu_b', function: { name: 'WebSearch' } },
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'm',
|
|
57
|
+
delta: {
|
|
58
|
+
toolCalls: [{ index: 1, function: { arguments: '{"query":"x"}' } }],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'm',
|
|
63
|
+
delta: {
|
|
64
|
+
toolCalls: [
|
|
65
|
+
{ index: 0, function: { arguments: '{"file_path":' } },
|
|
66
|
+
{ index: 0, function: { arguments: '"/a"}' } },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{ id: 'm', delta: {}, finishReason: 'tool_calls' },
|
|
71
|
+
]));
|
|
72
|
+
expect(result.message.toolCalls).toEqual([
|
|
73
|
+
{
|
|
74
|
+
id: 'toolu_a',
|
|
75
|
+
type: 'function',
|
|
76
|
+
function: { name: 'Read', arguments: '{"file_path":"/a"}' },
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: 'toolu_b',
|
|
80
|
+
type: 'function',
|
|
81
|
+
function: { name: 'WebSearch', arguments: '{"query":"x"}' },
|
|
82
|
+
},
|
|
83
|
+
]);
|
|
84
|
+
expect(result.finishReason).toBe('tool_calls');
|
|
85
|
+
});
|
|
86
|
+
it('latest finishReason and usage win', async () => {
|
|
87
|
+
const result = await collect(fromArray([
|
|
88
|
+
{ id: 'm', delta: {}, finishReason: 'stop' },
|
|
89
|
+
{
|
|
90
|
+
id: 'm',
|
|
91
|
+
delta: {},
|
|
92
|
+
finishReason: 'length',
|
|
93
|
+
usage: {
|
|
94
|
+
promptTokens: 100,
|
|
95
|
+
completionTokens: 50,
|
|
96
|
+
totalTokens: 150,
|
|
97
|
+
cachedTokens: 0,
|
|
98
|
+
cacheWriteTokens: 0,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
]));
|
|
102
|
+
expect(result.finishReason).toBe('length');
|
|
103
|
+
expect(result.usage.totalTokens).toBe(150);
|
|
104
|
+
});
|
|
105
|
+
it('defaults finishReason to stop and usage to zero when provider omits them', async () => {
|
|
106
|
+
const result = await collect(fromArray([{ id: 'm', delta: { content: 'hi' } }]));
|
|
107
|
+
expect(result.finishReason).toBe('stop');
|
|
108
|
+
expect(result.usage).toEqual({
|
|
109
|
+
promptTokens: 0,
|
|
110
|
+
completionTokens: 0,
|
|
111
|
+
totalTokens: 0,
|
|
112
|
+
cachedTokens: 0,
|
|
113
|
+
cacheWriteTokens: 0,
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
it('throws on chunk.error', async () => {
|
|
117
|
+
await expect(collect(fromArray([
|
|
118
|
+
{ id: 'm', delta: { content: 'hi' } },
|
|
119
|
+
{ id: 'm', delta: {}, error: 'rate limited' },
|
|
120
|
+
]))).rejects.toThrow('rate limited');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=collect.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.test.js","sourceRoot":"","sources":["../../src/provider/collect.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/provider/instrumentation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAiC,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/provider/instrumentation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAiC,MAAM,sBAAsB,CAAA;AAGxF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAGjE,MAAM,WAAW,8BAA8B;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAA;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CACtB;AAoBD,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,WAAW,EACrB,IAAI,GAAE,8BAAmC,GACvC,WAAW,CA6Db"}
|
|
@@ -5,15 +5,15 @@ function nextCallId() {
|
|
|
5
5
|
providerCallCounter += 1;
|
|
6
6
|
return `pcall_${Date.now().toString(36)}${providerCallCounter.toString(36)}`;
|
|
7
7
|
}
|
|
8
|
-
function
|
|
9
|
-
const usage = response.usage;
|
|
8
|
+
function extractStreamUsage(usage) {
|
|
10
9
|
if (!usage)
|
|
11
10
|
return undefined;
|
|
11
|
+
const u = usage;
|
|
12
12
|
return {
|
|
13
|
-
inputTokens:
|
|
14
|
-
outputTokens:
|
|
15
|
-
totalTokens:
|
|
16
|
-
costUsd:
|
|
13
|
+
inputTokens: u.inputTokens ?? u.promptTokens,
|
|
14
|
+
outputTokens: u.outputTokens ?? u.completionTokens,
|
|
15
|
+
totalTokens: u.totalTokens,
|
|
16
|
+
costUsd: u.costUsd,
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
export function wrapProviderWithProbes(provider, opts = {}) {
|
|
@@ -24,43 +24,6 @@ export function wrapProviderWithProbes(provider, opts = {}) {
|
|
|
24
24
|
name: provider.name,
|
|
25
25
|
listModels: provider.listModels?.bind(provider),
|
|
26
26
|
healthCheck: provider.healthCheck?.bind(provider),
|
|
27
|
-
async chat(params) {
|
|
28
|
-
const callId = nextCallId();
|
|
29
|
-
const ctx = buildProbeContext({ runId });
|
|
30
|
-
const startedAt = Date.now();
|
|
31
|
-
probes.dispatch({
|
|
32
|
-
type: 'provider_call_start',
|
|
33
|
-
providerId: provider.id,
|
|
34
|
-
model: params.model,
|
|
35
|
-
callId,
|
|
36
|
-
runId,
|
|
37
|
-
}, ctx);
|
|
38
|
-
try {
|
|
39
|
-
const response = await provider.chat(params);
|
|
40
|
-
probes.dispatch({
|
|
41
|
-
type: 'provider_call_completed',
|
|
42
|
-
providerId: provider.id,
|
|
43
|
-
model: params.model,
|
|
44
|
-
callId,
|
|
45
|
-
runId,
|
|
46
|
-
durationMs: Date.now() - startedAt,
|
|
47
|
-
usage: extractUsage(response),
|
|
48
|
-
}, ctx);
|
|
49
|
-
return response;
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
probes.dispatch({
|
|
53
|
-
type: 'provider_call_failed',
|
|
54
|
-
providerId: provider.id,
|
|
55
|
-
model: params.model,
|
|
56
|
-
callId,
|
|
57
|
-
runId,
|
|
58
|
-
durationMs: Date.now() - startedAt,
|
|
59
|
-
error: error instanceof Error ? error.message : String(error),
|
|
60
|
-
}, ctx);
|
|
61
|
-
throw error;
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
27
|
async *chatStream(params) {
|
|
65
28
|
const callId = nextCallId();
|
|
66
29
|
const ctx = buildProbeContext({ runId });
|
|
@@ -73,7 +36,10 @@ export function wrapProviderWithProbes(provider, opts = {}) {
|
|
|
73
36
|
runId,
|
|
74
37
|
}, ctx);
|
|
75
38
|
try {
|
|
39
|
+
let lastUsage;
|
|
76
40
|
for await (const chunk of provider.chatStream(params)) {
|
|
41
|
+
if (chunk.usage)
|
|
42
|
+
lastUsage = chunk.usage;
|
|
77
43
|
yield chunk;
|
|
78
44
|
}
|
|
79
45
|
probes.dispatch({
|
|
@@ -83,6 +49,7 @@ export function wrapProviderWithProbes(provider, opts = {}) {
|
|
|
83
49
|
callId,
|
|
84
50
|
runId,
|
|
85
51
|
durationMs: Date.now() - startedAt,
|
|
52
|
+
usage: extractStreamUsage(lastUsage),
|
|
86
53
|
}, ctx);
|
|
87
54
|
}
|
|
88
55
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/provider/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAsB,KAAK,IAAI,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/provider/instrumentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2 of ses_001-tool-stream-events removed `chat()` from
|
|
3
|
+
* `LLMProvider`; this suite now exercises the streaming-only wrapper.
|
|
4
|
+
*
|
|
5
|
+
* Invariants under test:
|
|
6
|
+
* - `wrapProviderWithProbes(provider)` returns an object that
|
|
7
|
+
* forwards `chatStream` to the inner provider while emitting
|
|
8
|
+
* `provider_call_start` before iteration and either
|
|
9
|
+
* `provider_call_completed` (after the iterator drains cleanly,
|
|
10
|
+
* carrying any aggregated `usage` from the last chunk that
|
|
11
|
+
* supplied one) or `provider_call_failed` (on a thrown error).
|
|
12
|
+
* - `callId` is unique per call and correlates start/completed/failed.
|
|
13
|
+
* - Optional methods (`listModels`, `healthCheck`, `doctorCheck`)
|
|
14
|
+
* are forwarded when present on the inner provider.
|
|
15
|
+
*/
|
|
1
16
|
export {};
|
|
2
17
|
//# sourceMappingURL=instrumentation.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.test.d.ts","sourceRoot":"","sources":["../../src/provider/instrumentation.test.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"instrumentation.test.d.ts","sourceRoot":"","sources":["../../src/provider/instrumentation.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|