@maxanstey-meridian/tandem 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -62,6 +62,11 @@ capabilities, interactions, persistence, and complete examples.
62
62
 
63
63
  Licensed under the [MIT License](./LICENSE).
64
64
 
65
+ For a specialised model that requires a plain user message, a raw-output agent
66
+ can set both `instructions` and `output.instructions` to `""`. Tandem then sends
67
+ the authored message without system instructions or a response-format constraint.
68
+ Other agent/output modes still require nonblank instructions.
69
+
65
70
  ## Development and publishing
66
71
 
67
72
  ```sh
@@ -74,3 +79,38 @@ npm pack
74
79
  `npm pack` and `npm publish` build fresh output before packaging. The npm package contains
75
80
  `dist`, including one copy of the vendored bridge in `dist/runtime`. Update `runtime` from
76
81
  a tested Tandem bridge build before releasing runtime changes.
82
+
83
+ ## Runtime-sized collections
84
+
85
+ Use `collection` for a list whose size is known at execution time. Declare its
86
+ item/result schemas and agents, select items from state, and apply the ordered
87
+ results. Native Tandem owns scheduling through `max`; zero and one item need no
88
+ special graph.
89
+
90
+ `taskAgent<Input, Output>` defines a model participant with validated input and
91
+ output. Inside a collection, `context.run(agent, input)` invokes only agents
92
+ declared on that collection. Await each call before the next. Scope use after
93
+ completion and sibling parallel agent calls are rejected. Operational failure
94
+ fails the collection, drains active work, and skips application of results.
95
+
96
+ ```ts
97
+ const canonicalise = collection({
98
+ id: "canonicalise",
99
+ item: Proposition,
100
+ result: Claim,
101
+ agents: [canonicaliser],
102
+ max: 6,
103
+ items: (state: SourceState) => state.propositions,
104
+ execute: (proposition, context) => context.run(canonicaliser, proposition),
105
+ apply: (state, claims) => ({ ...state, claims }),
106
+ });
107
+ ```
108
+
109
+ The executable [collection example](tests/collection-child.ts) includes
110
+ conditional recovery, persistence, cancellation and concurrent source runs.
111
+ Agent visits remain in the source run's native observations and ledger.
112
+
113
+ Agent definitions may be reused across collections. Native Tandem binds each under
114
+ its collection name. Scoped observations and accepted ledger values carry a
115
+ `visitId` so concurrent calls can be correlated without changing their semantic
116
+ `stepId`.
package/dist/index.d.ts CHANGED
@@ -55,7 +55,7 @@ export interface Parallel<TState> extends Participant<TState> {
55
55
  export interface Terminal<TState> extends Participant<TState> {
56
56
  readonly kind: "terminal";
57
57
  }
58
- type Node<TState> = Stage<TState> | Interaction<TState, unknown, unknown> | Agent<TState> | Parallel<TState> | Terminal<TState>;
58
+ type Node<TState> = Collection<TState> | Stage<TState> | Interaction<TState, unknown, unknown> | Agent<TState> | Parallel<TState> | Terminal<TState>;
59
59
  export declare function stage<TState>(definition: {
60
60
  id: string;
61
61
  execute: (state: TState, context: {
@@ -63,6 +63,44 @@ export declare function stage<TState>(definition: {
63
63
  }) => TState | Promise<TState>;
64
64
  persist?: boolean;
65
65
  }): Stage<TState>;
66
+ declare const taskAgentBrand: unique symbol;
67
+ export interface TaskAgentReference {
68
+ readonly id: string;
69
+ readonly [taskAgentBrand]: true;
70
+ }
71
+ export interface TaskAgent<TInput, TOutput> extends TaskAgentReference {
72
+ readonly input: z.ZodType<TInput>;
73
+ readonly result: z.ZodType<TOutput>;
74
+ }
75
+ export interface CollectionContext {
76
+ readonly signal: AbortSignal;
77
+ run<TInput, TOutput>(agent: TaskAgent<TInput, TOutput>, input: NoInfer<TInput>): Promise<TOutput>;
78
+ }
79
+ export interface Collection<TState> extends Participant<TState> {
80
+ readonly kind: "collection";
81
+ }
82
+ export interface TaskAgentDefinition<TInput, TOutput> extends Omit<AgentDefinition<TInput, TOutput>, "output" | "capabilities" | "workspace" | "checkpoint"> {
83
+ input: z.ZodType<TInput>;
84
+ result: z.ZodType<TOutput>;
85
+ output: Omit<Extract<NonNullable<AgentDefinition<TInput, TOutput>["output"]>, {
86
+ schema: unknown;
87
+ }>, "apply"> | Omit<Extract<NonNullable<AgentDefinition<TInput, TOutput>["output"]>, {
88
+ raw: true;
89
+ }>, "apply">;
90
+ }
91
+ export declare function taskAgent<TInput, TOutput>(definition: TaskAgentDefinition<TInput, TOutput>): TaskAgent<TInput, TOutput>;
92
+ interface CollectionDefinition<TState, TItem, TResult> {
93
+ id: string;
94
+ item: z.ZodType<TItem>;
95
+ result: z.ZodType<TResult>;
96
+ items: (state: TState) => readonly TItem[];
97
+ agents: readonly TaskAgentReference[];
98
+ execute: (item: TItem, context: CollectionContext) => Promise<TResult> | TResult;
99
+ apply: (state: TState, results: readonly TResult[]) => TState;
100
+ max: number;
101
+ persist?: boolean;
102
+ }
103
+ export declare function collection<TState, TItem, TResult>(definition: CollectionDefinition<TState, TItem, TResult>): Collection<TState>;
66
104
  export declare function interaction<TState, TRequest, TResponse>(definition: {
67
105
  id: string;
68
106
  requestSchema: z.ZodType<TRequest>;
@@ -221,7 +259,7 @@ export declare function output<TState>(definition: {
221
259
  persist?: boolean;
222
260
  }): Terminal<TState>;
223
261
  export interface OrdinaryRoute<TState> {
224
- readonly from: Stage<TState> | Interaction<TState, unknown, unknown>;
262
+ readonly from: Stage<TState> | Collection<TState> | Interaction<TState, unknown, unknown>;
225
263
  readonly to: Node<TState>;
226
264
  readonly label: string;
227
265
  readonly outcome?: never;
@@ -275,7 +313,8 @@ export interface InspectedRoute {
275
313
  }
276
314
  export interface InspectedNode {
277
315
  readonly id: string;
278
- readonly kind: "stage" | "interaction" | "agent" | "parallel" | "completion" | "failure";
316
+ readonly kind: "stage" | "interaction" | "agent" | "parallel" | "collection" | "completion" | "failure";
317
+ readonly agents?: readonly string[];
279
318
  readonly persist?: boolean;
280
319
  readonly interaction?: {
281
320
  readonly requestSchema: unknown;
@@ -304,6 +343,8 @@ export interface RunResult<TState> {
304
343
  readonly summary: string | null;
305
344
  }
306
345
  export type RunObservation = {
346
+ readonly visitId?: string | null;
347
+ } & ({
307
348
  readonly version: 1;
308
349
  readonly kind: "stepStarted";
309
350
  readonly stepId: string;
@@ -354,7 +395,7 @@ export type RunObservation = {
354
395
  readonly message: string;
355
396
  }[];
356
397
  readonly rawResponse: string;
357
- };
398
+ });
358
399
  export interface TerminalPresentationOptions {
359
400
  readonly truncatedToolNames?: readonly string[];
360
401
  }
@@ -377,6 +418,7 @@ export type AcceptedValue = {
377
418
  readonly version: 1;
378
419
  readonly kind: K;
379
420
  readonly stepId: string;
421
+ readonly visitId?: string | null;
380
422
  readonly valueType: string | null;
381
423
  readonly payload: unknown | null;
382
424
  };
package/dist/index.js CHANGED
@@ -332,6 +332,55 @@ class StageImplementation extends NodeImplementation {
332
332
  export function stage(definition) {
333
333
  return new StageImplementation(definition.id, definition.persist, definition.execute);
334
334
  }
335
+ const taskAgentBrand = Symbol("taskAgent");
336
+ class TaskAgentImplementation {
337
+ id;
338
+ input;
339
+ result;
340
+ [taskAgentBrand] = true;
341
+ state;
342
+ participant;
343
+ constructor(id, input, result, definition) {
344
+ this.id = id;
345
+ this.input = input;
346
+ this.result = result;
347
+ this.state = z.object({ input, output: z.object({ value: result }).nullable() });
348
+ this.participant = agent({
349
+ ...definition,
350
+ message: (state) => definition.message(state.input),
351
+ output: {
352
+ ...definition.output,
353
+ validateFor: definition.output.validateFor
354
+ ? (state, value) => definition.output.validateFor(state.input, value)
355
+ : undefined,
356
+ apply: (state, value) => ({
357
+ ...state,
358
+ output: { value },
359
+ }),
360
+ },
361
+ });
362
+ }
363
+ }
364
+ export function taskAgent(definition) {
365
+ return new TaskAgentImplementation(definition.id, definition.input, definition.result, definition);
366
+ }
367
+ class CollectionImplementation extends NodeImplementation {
368
+ definition;
369
+ kind = "collection";
370
+ constructor(definition) {
371
+ super(definition.id, definition.persist);
372
+ this.definition = definition;
373
+ }
374
+ }
375
+ export function collection(definition) {
376
+ if (!Number.isInteger(definition.max) || definition.max < 1 || definition.max > 2147483647) {
377
+ throw new TandemError("Collection max must be a positive 32-bit integer.");
378
+ }
379
+ if (new Set(definition.agents.map((agent) => agent.id)).size !== definition.agents.length) {
380
+ throw new TandemError("Collection agent IDs must be unique.");
381
+ }
382
+ return new CollectionImplementation(definition);
383
+ }
335
384
  class InteractionImplementation extends NodeImplementation {
336
385
  requestSchema;
337
386
  responseSchema;
@@ -576,7 +625,10 @@ class AgentImplementation extends NodeImplementation {
576
625
  }
577
626
  }
578
627
  export function agent(definition) {
579
- requireInstructions(definition.instructions, `Agent '${definition.id}' instructions`);
628
+ const rawOutput = definition.output && "raw" in definition.output && definition.output.raw === true;
629
+ if (!rawOutput || typeof definition.instructions !== "string") {
630
+ requireInstructions(definition.instructions, `Agent '${definition.id}' instructions`);
631
+ }
580
632
  const reasoningEffort = definition.reasoning?.effort;
581
633
  const reasoningMaxTokens = definition.reasoning?.maxTokens;
582
634
  if (definition.reasoning &&
@@ -595,7 +647,9 @@ export function agent(definition) {
595
647
  }
596
648
  }
597
649
  if (definition.output) {
598
- requireInstructions(definition.output.instructions, `Agent '${definition.id}' output instructions`);
650
+ if (!rawOutput || typeof definition.output.instructions !== "string") {
651
+ requireInstructions(definition.output.instructions, `Agent '${definition.id}' output instructions`);
652
+ }
599
653
  if ("raw" in definition.output) {
600
654
  if (definition.output.raw !== true) {
601
655
  throw new TandemError(`Agent '${definition.id}' output raw must be true.`);
@@ -818,6 +872,15 @@ export function inspectPipeline(graph) {
818
872
  const inspectNode = (node) => {
819
873
  const implementation = node;
820
874
  const persist = implementation.persist;
875
+ if (implementation instanceof CollectionImplementation) {
876
+ return {
877
+ id: node.id,
878
+ kind: "collection",
879
+ persist,
880
+ max: implementation.definition.max,
881
+ agents: implementation.definition.agents.map((agent) => node.id + "/" + agent.id),
882
+ };
883
+ }
821
884
  if (node.kind === "interaction") {
822
885
  const interaction = implementation;
823
886
  return {
@@ -887,19 +950,35 @@ export function inspectPipeline(graph) {
887
950
  }
888
951
  const runObservationSchema = z.discriminatedUnion("kind", [
889
952
  z
890
- .object({ version: z.literal(1), kind: z.literal("stepStarted"), stepId: z.string().min(1) })
953
+ .object({
954
+ version: z.literal(1),
955
+ kind: z.literal("stepStarted"),
956
+ stepId: z.string().min(1),
957
+ visitId: z.string().nullable().optional(),
958
+ })
891
959
  .strict(),
892
960
  z
893
- .object({ version: z.literal(1), kind: z.literal("stepCompleted"), stepId: z.string().min(1) })
961
+ .object({
962
+ version: z.literal(1),
963
+ kind: z.literal("stepCompleted"),
964
+ stepId: z.string().min(1),
965
+ visitId: z.string().nullable().optional(),
966
+ })
894
967
  .strict(),
895
968
  z
896
- .object({ version: z.literal(1), kind: z.literal("stepCancelled"), stepId: z.string().min(1) })
969
+ .object({
970
+ version: z.literal(1),
971
+ kind: z.literal("stepCancelled"),
972
+ stepId: z.string().min(1),
973
+ visitId: z.string().nullable().optional(),
974
+ })
897
975
  .strict(),
898
976
  z
899
977
  .object({
900
978
  version: z.literal(1),
901
979
  kind: z.literal("stepFaulted"),
902
980
  stepId: z.string().min(1),
981
+ visitId: z.string().nullable().optional(),
903
982
  error: z.string(),
904
983
  })
905
984
  .strict(),
@@ -908,6 +987,7 @@ const runObservationSchema = z.discriminatedUnion("kind", [
908
987
  version: z.literal(1),
909
988
  kind: z.literal("agentText"),
910
989
  stepId: z.string().min(1),
990
+ visitId: z.string().nullable().optional(),
911
991
  text: z.string(),
912
992
  })
913
993
  .strict(),
@@ -916,6 +996,7 @@ const runObservationSchema = z.discriminatedUnion("kind", [
916
996
  version: z.literal(1),
917
997
  kind: z.literal("agentModelSelected"),
918
998
  stepId: z.string().min(1),
999
+ visitId: z.string().nullable().optional(),
919
1000
  modelId: z.string().min(1),
920
1001
  })
921
1002
  .strict(),
@@ -924,6 +1005,7 @@ const runObservationSchema = z.discriminatedUnion("kind", [
924
1005
  version: z.literal(1),
925
1006
  kind: z.literal("agentReasoning"),
926
1007
  stepId: z.string().min(1),
1008
+ visitId: z.string().nullable().optional(),
927
1009
  text: z.string(),
928
1010
  })
929
1011
  .strict(),
@@ -932,6 +1014,7 @@ const runObservationSchema = z.discriminatedUnion("kind", [
932
1014
  version: z.literal(1),
933
1015
  kind: z.literal("agentUsage"),
934
1016
  stepId: z.string().min(1),
1017
+ visitId: z.string().nullable().optional(),
935
1018
  inputTokens: z.number().int().nonnegative(),
936
1019
  outputTokens: z.number().int().nonnegative(),
937
1020
  reasoningTokens: z.number().int().nonnegative(),
@@ -944,6 +1027,7 @@ const runObservationSchema = z.discriminatedUnion("kind", [
944
1027
  version: z.literal(1),
945
1028
  kind: z.literal("structuredOutputRejected"),
946
1029
  stepId: z.string().min(1),
1030
+ visitId: z.string().nullable().optional(),
947
1031
  attempt: z.number().int().positive(),
948
1032
  problems: z.array(z.object({ field: z.string(), message: z.string().min(1) }).strict()),
949
1033
  rawResponse: z.string(),
@@ -960,6 +1044,7 @@ const acceptedKinds = [
960
1044
  const acceptedValueSchema = z
961
1045
  .object({
962
1046
  kind: z.enum(acceptedKinds),
1047
+ visitId: z.string().nullable().optional(),
963
1048
  stepId: z.string().min(1),
964
1049
  valueType: z.string().min(1).nullable(),
965
1050
  payload: z.unknown().nullable(),
@@ -984,6 +1069,7 @@ export async function inspectAccepted(options) {
984
1069
  version: 1,
985
1070
  kind: value.kind,
986
1071
  stepId: value.stepId,
1072
+ ...(value.visitId == null ? {} : { visitId: value.visitId }),
987
1073
  valueType: value.valueType,
988
1074
  payload: value.payload,
989
1075
  }));
@@ -1132,6 +1218,64 @@ function interactionHandlerEntries(handlers) {
1132
1218
  function compileNode(node, stateSchema, callbacks) {
1133
1219
  const implementation = node;
1134
1220
  const base = { id: node.id, persist: implementation.persist };
1221
+ if (implementation instanceof CollectionImplementation) {
1222
+ const definition = implementation.definition;
1223
+ const agents = definition.agents.map((value) => {
1224
+ if (!(value instanceof TaskAgentImplementation))
1225
+ throw new TandemError("Use taskAgent to declare collection agents.");
1226
+ return compileNode(value.participant, value.state, callbacks);
1227
+ });
1228
+ const itemsCallback = callbacks.registerSync((state) => serializeBoundary(z.array(definition.item), definition.items(parseJson(stateSchema, state, node.id + " state")), node.id + " items"));
1229
+ const runCallback = callbacks.registerAsync(async (item, scopeId, signal) => {
1230
+ let active = false;
1231
+ let closed = false;
1232
+ const context = {
1233
+ signal,
1234
+ async run(value, input) {
1235
+ if (closed)
1236
+ throw new TandemError("Collection scope has ended.");
1237
+ if (active)
1238
+ throw new TandemError("Collection item agents must be awaited serially.");
1239
+ if (!definition.agents.includes(value) || !(value instanceof TaskAgentImplementation)) {
1240
+ throw new TandemError("Agent is not declared in this collection.");
1241
+ }
1242
+ signal.throwIfAborted();
1243
+ active = true;
1244
+ try {
1245
+ const { runCollectionAgentAsync } = await import("./runtime/loader.mjs");
1246
+ const response = await runCollectionAgentAsync(scopeId, value.id, serializeBoundary(value.state, { input, output: null }, value.id + " input"));
1247
+ const state = parseJson(value.state, response, value.id + " output");
1248
+ if (state.output === null)
1249
+ throw new TandemError("Agent returned no output.");
1250
+ return parse(value.result, state.output.value, value.id + " result");
1251
+ }
1252
+ finally {
1253
+ active = false;
1254
+ }
1255
+ },
1256
+ };
1257
+ try {
1258
+ const result = await definition.execute(parseJson(definition.item, item, node.id + " item"), context);
1259
+ if (active)
1260
+ throw new TandemError("Collection item returned before its agent completed.");
1261
+ signal.throwIfAborted();
1262
+ return serializeBoundary(definition.result, result, node.id + " result");
1263
+ }
1264
+ finally {
1265
+ closed = true;
1266
+ }
1267
+ });
1268
+ const applyCallback = callbacks.registerSync((state, results) => serializeBoundary(stateSchema, definition.apply(parseJson(stateSchema, state, node.id + " state"), parseJson(z.array(definition.result), results, node.id + " results")), node.id + " output"));
1269
+ return {
1270
+ ...base,
1271
+ kind: "collection",
1272
+ agents,
1273
+ max: definition.max,
1274
+ itemsCallback,
1275
+ runCallback,
1276
+ applyCallback,
1277
+ };
1278
+ }
1135
1279
  if (implementation instanceof StageImplementation) {
1136
1280
  const run = callbacks.registerAsync(async (state, _, signal) => serializeBoundary(stateSchema, await implementation.execute(parseJson(stateSchema, state, `${node.id} input`), {
1137
1281
  signal,
@@ -1321,13 +1465,9 @@ function compileAgentOutput(id, output, stateSchema, callbacks) {
1321
1465
  ? callbacks.registerSync((_, input) => issuesParsed(z.unknown(), output.parse(JSON.parse(input))))
1322
1466
  : callbacks.registerSync((_, input) => issues(output.schema, input));
1323
1467
  const validateFor = output.validateFor
1324
- ? callbacks.registerSync((state, input) => validationProblems(output.validateFor(parseJson(stateSchema, state, `${id} state`), raw
1325
- ? JSON.parse(input)
1326
- : parseJson(output.schema, input, `${id} output`)), `${id} output contextual validation`))
1468
+ ? callbacks.registerSync((state, input) => validationProblems(output.validateFor(parseJson(stateSchema, state, `${id} state`), raw ? JSON.parse(input) : parseJson(output.schema, input, `${id} output`)), `${id} output contextual validation`))
1327
1469
  : undefined;
1328
- const apply = callbacks.registerSync((state, input) => serializeBoundary(stateSchema, output.apply(parseJson(stateSchema, state, `${id} state`), raw
1329
- ? JSON.parse(input)
1330
- : parseJson(output.schema, input, `${id} output`)), `${id} applied state`));
1470
+ const apply = callbacks.registerSync((state, input) => serializeBoundary(stateSchema, output.apply(parseJson(stateSchema, state, `${id} state`), raw ? JSON.parse(input) : parseJson(output.schema, input, `${id} output`)), `${id} applied state`));
1331
1471
  return {
1332
1472
  instructions: output.instructions,
1333
1473
  ...(raw
Binary file
Binary file
@@ -1,4 +1,4 @@
1
- // Generated for: Tandem.NodeApiSpike.Bridge 0.1.0.0
1
+ // Generated for: Tandem.NodeApiSpike.Bridge 0.2.1.0
2
2
  // Generated by: Microsoft.JavaScript.NodeApi.Generator 0.9.0.0
3
3
  /* eslint-disable */
4
4
 
@@ -1,4 +1,4 @@
1
- // Generated for: Tandem.NodeApiSpike.Bridge 0.1.0.0
1
+ // Generated for: Tandem.NodeApiSpike.Bridge 0.2.1.0
2
2
  // Generated by: Microsoft.JavaScript.NodeApi.Generator 0.9.0.0
3
3
  /* eslint-disable */
4
4
 
@@ -7,6 +7,13 @@ import './System.Runtime';
7
7
 
8
8
  /** Adapts JavaScript-authored participants to the Tandem runtime. */
9
9
  export namespace NodePipelineBridge {
10
+ /** Executes a declared agent within an active collection item. */
11
+ export function runCollectionAgentAsync(
12
+ scopeId: string,
13
+ agentId: string,
14
+ state: string,
15
+ ): Promise<string>;
16
+
10
17
  /** Reads accepted semantic journal values from a packaged SQLite ledger. */
11
18
  export function inspectAcceptedAsync(
12
19
  ledgerPath: string,
@@ -7,23 +7,23 @@
7
7
  "targets": {
8
8
  ".NETCoreApp,Version=v10.0": {},
9
9
  ".NETCoreApp,Version=v10.0/osx-arm64": {
10
- "Tandem.NodeApiSpike.Bridge/0.1.0": {
10
+ "Tandem.NodeApiSpike.Bridge/0.2.1": {
11
11
  "dependencies": {
12
- "Meridian.Tandem": "0.1.0",
13
- "Meridian.Tandem.Advanced": "0.1.0",
14
- "Meridian.Tandem.Ledger": "0.1.0",
15
- "Meridian.Tandem.OpenAICompatible": "0.1.0",
16
- "Meridian.Tandem.Terminal": "0.1.0",
12
+ "Meridian.Tandem": "0.2.1",
13
+ "Meridian.Tandem.Advanced": "0.2.1",
14
+ "Meridian.Tandem.Ledger": "0.2.1",
15
+ "Meridian.Tandem.OpenAICompatible": "0.2.1",
16
+ "Meridian.Tandem.Terminal": "0.2.1",
17
17
  "Microsoft.Extensions.AI.OpenAI": "10.8.3",
18
18
  "Microsoft.JavaScript.NodeApi": "0.9.26",
19
19
  "Microsoft.JavaScript.NodeApi.Generator": "0.9.26",
20
20
  "OpenAI": "2.12.0",
21
21
  "System.ClientModel": "1.14.0",
22
- "Tandem.Advanced": "0.1.0.0",
23
- "Tandem": "0.1.0.0",
24
- "Tandem.Ledger": "0.1.0.0",
25
- "Tandem.OpenAICompatible": "0.1.0.0",
26
- "Tandem.Terminal": "0.1.0.0"
22
+ "Tandem.Advanced": "0.2.1.0",
23
+ "Tandem": "0.2.1.0",
24
+ "Tandem.Ledger": "0.2.1.0",
25
+ "Tandem.OpenAICompatible": "0.2.1.0",
26
+ "Tandem.Terminal": "0.2.1.0"
27
27
  },
28
28
  "runtime": {
29
29
  "Tandem.NodeApiSpike.Bridge.dll": {}
@@ -643,7 +643,7 @@
643
643
  }
644
644
  }
645
645
  },
646
- "Meridian.Tandem/0.1.0": {
646
+ "Meridian.Tandem/0.2.1": {
647
647
  "dependencies": {
648
648
  "FluentValidation": "12.1.1",
649
649
  "JsonSchema.Net.Generation": "7.3.11",
@@ -653,15 +653,15 @@
653
653
  },
654
654
  "runtime": {
655
655
  "Tandem.dll": {
656
- "assemblyVersion": "0.1.0.0",
657
- "fileVersion": "0.1.0.0"
656
+ "assemblyVersion": "0.2.1.0",
657
+ "fileVersion": "0.2.1.0"
658
658
  }
659
659
  }
660
660
  },
661
- "Meridian.Tandem.Advanced/0.1.0": {
661
+ "Meridian.Tandem.Advanced/0.2.1": {
662
662
  "dependencies": {
663
663
  "FluentValidation": "12.1.1",
664
- "Meridian.Tandem": "0.1.0",
664
+ "Meridian.Tandem": "0.2.1",
665
665
  "Microsoft.Agents.AI.Harness": "1.16.0",
666
666
  "Microsoft.Agents.AI.Tools.Shell": "1.16.0-preview.260730.1",
667
667
  "Microsoft.Extensions.AI": "10.8.3",
@@ -669,25 +669,25 @@
669
669
  },
670
670
  "runtime": {
671
671
  "Tandem.Advanced.dll": {
672
- "assemblyVersion": "0.1.0.0",
673
- "fileVersion": "0.1.0.0"
672
+ "assemblyVersion": "0.2.1.0",
673
+ "fileVersion": "0.2.1.0"
674
674
  }
675
675
  }
676
676
  },
677
- "Meridian.Tandem.Ledger/0.1.0": {
677
+ "Meridian.Tandem.Ledger/0.2.1": {
678
678
  "dependencies": {
679
- "Meridian.Tandem": "0.1.0",
679
+ "Meridian.Tandem": "0.2.1",
680
680
  "Microsoft.Data.Sqlite": "10.0.10",
681
681
  "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12"
682
682
  },
683
683
  "runtime": {
684
684
  "Tandem.Ledger.dll": {
685
- "assemblyVersion": "0.1.0.0",
686
- "fileVersion": "0.1.0.0"
685
+ "assemblyVersion": "0.2.1.0",
686
+ "fileVersion": "0.2.1.0"
687
687
  }
688
688
  }
689
689
  },
690
- "Meridian.Tandem.OpenAICompatible/0.1.0": {
690
+ "Meridian.Tandem.OpenAICompatible/0.2.1": {
691
691
  "dependencies": {
692
692
  "Microsoft.Extensions.AI": "10.8.3",
693
693
  "OpenAI": "2.12.0",
@@ -695,67 +695,67 @@
695
695
  },
696
696
  "runtime": {
697
697
  "Tandem.OpenAICompatible.dll": {
698
- "assemblyVersion": "0.1.0.0",
699
- "fileVersion": "0.1.0.0"
698
+ "assemblyVersion": "0.2.1.0",
699
+ "fileVersion": "0.2.1.0"
700
700
  }
701
701
  }
702
702
  },
703
- "Meridian.Tandem.Terminal/0.1.0": {
703
+ "Meridian.Tandem.Terminal/0.2.1": {
704
704
  "dependencies": {
705
- "Meridian.Tandem": "0.1.0",
705
+ "Meridian.Tandem": "0.2.1",
706
706
  "Spectre.Console": "0.57.2"
707
707
  },
708
708
  "runtime": {
709
709
  "Tandem.Terminal.dll": {
710
- "assemblyVersion": "0.1.0.0",
711
- "fileVersion": "0.1.0.0"
710
+ "assemblyVersion": "0.2.1.0",
711
+ "fileVersion": "0.2.1.0"
712
712
  }
713
713
  }
714
714
  },
715
- "Tandem.Advanced/0.1.0.0": {
715
+ "Tandem.Advanced/0.2.1.0": {
716
716
  "runtime": {
717
717
  "Tandem.Advanced.dll": {
718
- "assemblyVersion": "0.1.0.0",
719
- "fileVersion": "0.1.0.0"
718
+ "assemblyVersion": "0.2.1.0",
719
+ "fileVersion": "0.2.1.0"
720
720
  }
721
721
  }
722
722
  },
723
- "Tandem/0.1.0.0": {
723
+ "Tandem/0.2.1.0": {
724
724
  "runtime": {
725
725
  "Tandem.dll": {
726
- "assemblyVersion": "0.1.0.0",
727
- "fileVersion": "0.1.0.0"
726
+ "assemblyVersion": "0.2.1.0",
727
+ "fileVersion": "0.2.1.0"
728
728
  }
729
729
  }
730
730
  },
731
- "Tandem.Ledger/0.1.0.0": {
731
+ "Tandem.Ledger/0.2.1.0": {
732
732
  "runtime": {
733
733
  "Tandem.Ledger.dll": {
734
- "assemblyVersion": "0.1.0.0",
735
- "fileVersion": "0.1.0.0"
734
+ "assemblyVersion": "0.2.1.0",
735
+ "fileVersion": "0.2.1.0"
736
736
  }
737
737
  }
738
738
  },
739
- "Tandem.OpenAICompatible/0.1.0.0": {
739
+ "Tandem.OpenAICompatible/0.2.1.0": {
740
740
  "runtime": {
741
741
  "Tandem.OpenAICompatible.dll": {
742
- "assemblyVersion": "0.1.0.0",
743
- "fileVersion": "0.1.0.0"
742
+ "assemblyVersion": "0.2.1.0",
743
+ "fileVersion": "0.2.1.0"
744
744
  }
745
745
  }
746
746
  },
747
- "Tandem.Terminal/0.1.0.0": {
747
+ "Tandem.Terminal/0.2.1.0": {
748
748
  "runtime": {
749
749
  "Tandem.Terminal.dll": {
750
- "assemblyVersion": "0.1.0.0",
751
- "fileVersion": "0.1.0.0"
750
+ "assemblyVersion": "0.2.1.0",
751
+ "fileVersion": "0.2.1.0"
752
752
  }
753
753
  }
754
754
  }
755
755
  }
756
756
  },
757
757
  "libraries": {
758
- "Tandem.NodeApiSpike.Bridge/0.1.0": {
758
+ "Tandem.NodeApiSpike.Bridge/0.2.1": {
759
759
  "type": "project",
760
760
  "serviceable": false,
761
761
  "sha512": ""
@@ -1103,52 +1103,52 @@
1103
1103
  "path": "tavily/1.0.1",
1104
1104
  "hashPath": "tavily.1.0.1.nupkg.sha512"
1105
1105
  },
1106
- "Meridian.Tandem/0.1.0": {
1106
+ "Meridian.Tandem/0.2.1": {
1107
1107
  "type": "project",
1108
1108
  "serviceable": false,
1109
1109
  "sha512": ""
1110
1110
  },
1111
- "Meridian.Tandem.Advanced/0.1.0": {
1111
+ "Meridian.Tandem.Advanced/0.2.1": {
1112
1112
  "type": "project",
1113
1113
  "serviceable": false,
1114
1114
  "sha512": ""
1115
1115
  },
1116
- "Meridian.Tandem.Ledger/0.1.0": {
1116
+ "Meridian.Tandem.Ledger/0.2.1": {
1117
1117
  "type": "project",
1118
1118
  "serviceable": false,
1119
1119
  "sha512": ""
1120
1120
  },
1121
- "Meridian.Tandem.OpenAICompatible/0.1.0": {
1121
+ "Meridian.Tandem.OpenAICompatible/0.2.1": {
1122
1122
  "type": "project",
1123
1123
  "serviceable": false,
1124
1124
  "sha512": ""
1125
1125
  },
1126
- "Meridian.Tandem.Terminal/0.1.0": {
1126
+ "Meridian.Tandem.Terminal/0.2.1": {
1127
1127
  "type": "project",
1128
1128
  "serviceable": false,
1129
1129
  "sha512": ""
1130
1130
  },
1131
- "Tandem.Advanced/0.1.0.0": {
1131
+ "Tandem.Advanced/0.2.1.0": {
1132
1132
  "type": "reference",
1133
1133
  "serviceable": false,
1134
1134
  "sha512": ""
1135
1135
  },
1136
- "Tandem/0.1.0.0": {
1136
+ "Tandem/0.2.1.0": {
1137
1137
  "type": "reference",
1138
1138
  "serviceable": false,
1139
1139
  "sha512": ""
1140
1140
  },
1141
- "Tandem.Ledger/0.1.0.0": {
1141
+ "Tandem.Ledger/0.2.1.0": {
1142
1142
  "type": "reference",
1143
1143
  "serviceable": false,
1144
1144
  "sha512": ""
1145
1145
  },
1146
- "Tandem.OpenAICompatible/0.1.0.0": {
1146
+ "Tandem.OpenAICompatible/0.2.1.0": {
1147
1147
  "type": "reference",
1148
1148
  "serviceable": false,
1149
1149
  "sha512": ""
1150
1150
  },
1151
- "Tandem.Terminal/0.1.0.0": {
1151
+ "Tandem.Terminal/0.2.1.0": {
1152
1152
  "type": "reference",
1153
1153
  "serviceable": false,
1154
1154
  "sha512": ""
@@ -1,4 +1,4 @@
1
- // Generated for: Tandem.NodeApiSpike.Bridge 0.1.0.0
1
+ // Generated for: Tandem.NodeApiSpike.Bridge 0.2.1.0
2
2
  // Generated by: Microsoft.JavaScript.NodeApi.Generator 0.9.0.0
3
3
  /* eslint-disable */
4
4
 
Binary file
Binary file
@@ -25,11 +25,11 @@ let runtime;
25
25
  try {
26
26
  runtime = await import(bridgeUrl.href);
27
27
  } catch (error) {
28
- throw new Error(
29
- `Tandem could not load the ${platform} bridge from ${bridgeUrl.pathname}.`,
30
- { cause: error },
31
- );
28
+ throw new Error(`Tandem could not load the ${platform} bridge from ${bridgeUrl.pathname}.`, {
29
+ cause: error,
30
+ });
32
31
  }
33
32
 
34
33
  export const runRegisteredGraphAsync = runtime.NodePipelineBridge.runRegisteredGraphAsync;
35
- export const inspectAcceptedAsync = runtime.NodePipelineBridge.inspectAcceptedAsync;
34
+ export const inspectAcceptedAsync = runtime.NodePipelineBridge.inspectAcceptedAsync;
35
+ export const runCollectionAgentAsync = runtime.NodePipelineBridge.runCollectionAgentAsync;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maxanstey-meridian/tandem",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "TypeScript authoring API for Tandem agentic pipelines",
5
5
  "homepage": "https://github.com/maxanstey-meridian/tandem-ts#readme",
6
6
  "license": "MIT",