@batonfx/foldkit 0.1.0 → 0.2.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.
@@ -1,5 +1,5 @@
1
1
  $ bun build ./src/index.ts --outdir dist --target bun --format esm
2
- Bundled 270 modules in 269ms
2
+ Bundled 221 modules in 233ms
3
3
 
4
- index.js 1.31 MB (entry point)
4
+ index.js 1.32 MB (entry point)
5
5
 
package/dist/index.js CHANGED
@@ -18,12 +18,21 @@ var __export = (target, all) => {
18
18
  var exports_chat = {};
19
19
  __export(exports_chat, {
20
20
  update: () => update3,
21
+ toolStatusOf: () => toolStatusOf,
21
22
  subscriptions: () => subscriptions,
23
+ promptInputStatusOf: () => promptInputStatusOf,
22
24
  initialModel: () => initialModel,
25
+ conversationItems: () => conversationItems,
26
+ WaitingConversationItem: () => WaitingConversationItem,
23
27
  UserEntry: () => UserEntry,
28
+ UserConversationItem: () => UserConversationItem,
29
+ ToolStatus: () => ToolStatus,
30
+ ToolPendingPhase: () => ToolPendingPhase,
24
31
  ToolOutcome: () => ToolOutcome,
25
32
  ToolEntry: () => ToolEntry,
33
+ ToolConversationItem: () => ToolConversationItem,
26
34
  SubmittedMessage: () => SubmittedMessage,
35
+ StreamingConversationItem: () => StreamingConversationItem,
27
36
  SentUserMessage: () => SentUserMessage,
28
37
  SendUserMessage: () => SendUserMessage,
29
38
  Running: () => Running,
@@ -33,12 +42,17 @@ __export(exports_chat, {
33
42
  ResolvedApproval: () => ResolvedApproval,
34
43
  ResolveApproval: () => ResolveApproval,
35
44
  ReceivedAgent: () => ReceivedAgent,
45
+ PromptInputStatus: () => PromptInputStatus,
36
46
  OutMessage: () => OutMessage,
47
+ OpenedSession: () => OpenedSession,
37
48
  Model: () => Model,
49
+ MessageAlign: () => MessageAlign,
38
50
  Message: () => Message2,
39
51
  Idle: () => Idle,
52
+ FailureConversationItem: () => FailureConversationItem,
40
53
  FailedAgentCommand: () => FailedAgentCommand,
41
54
  Failed: () => Failed,
55
+ ConversationItem: () => ConversationItem,
42
56
  ClickedDeny: () => ClickedDeny,
43
57
  ClickedCancel: () => ClickedCancel,
44
58
  ClickedApprove: () => ClickedApprove,
@@ -48,7 +62,9 @@ __export(exports_chat, {
48
62
  CancelRun: () => CancelRun,
49
63
  AwaitingApproval: () => AwaitingApproval,
50
64
  AssistantEntry: () => AssistantEntry,
51
- ApprovalRequired: () => ApprovalRequired
65
+ AssistantConversationItem: () => AssistantConversationItem,
66
+ ApprovalRequired: () => ApprovalRequired,
67
+ ApprovalConversationItem: () => ApprovalConversationItem
52
68
  });
53
69
  // ../../node_modules/.bun/effect@4.0.0-beta.93/node_modules/effect/dist/Array.js
54
70
  var exports_Array = {};
@@ -11990,6 +12006,7 @@ function resolveAt(key) {
11990
12006
  }
11991
12007
  var resolveIdentifier = /* @__PURE__ */ resolveAt("identifier");
11992
12008
  var resolveTitle = /* @__PURE__ */ resolveAt("title");
12009
+ var resolveDescription = /* @__PURE__ */ resolveAt("description");
11993
12010
  var resolveBrands = /* @__PURE__ */ resolveAt("brands");
11994
12011
  var getExpected = /* @__PURE__ */ memoize((ast) => {
11995
12012
  const identifier2 = resolveIdentifier(ast);
@@ -14563,6 +14580,7 @@ function runChecks(checks, s) {
14563
14580
  var ClassTypeId = "~effect/Schema/Class";
14564
14581
  var STRUCTURAL_ANNOTATION_KEY = "~structural";
14565
14582
  var resolveIdentifier2 = resolveIdentifier;
14583
+ var resolveDescription2 = resolveDescription;
14566
14584
  function isJson(u) {
14567
14585
  const onPath = new Set;
14568
14586
  const validated = new Set;
@@ -38588,6 +38606,275 @@ var merge7 = (...toolkits) => {
38588
38606
  }
38589
38607
  return makeProto2(tools);
38590
38608
  };
38609
+ // ../../node_modules/.bun/effect@4.0.0-beta.93/node_modules/effect/dist/unstable/ai/Tool.js
38610
+ var exports_Tool = {};
38611
+ __export(exports_Tool, {
38612
+ unsafeSecureJsonParse: () => unsafeSecureJsonParse,
38613
+ providerDefined: () => providerDefined,
38614
+ make: () => make45,
38615
+ isUserDefined: () => isUserDefined,
38616
+ isProviderDefined: () => isProviderDefined,
38617
+ isEmptyParamsRecord: () => isEmptyParamsRecord,
38618
+ isDynamic: () => isDynamic,
38619
+ getStrictMode: () => getStrictMode,
38620
+ getJsonSchemaFromSchema: () => getJsonSchemaFromSchema,
38621
+ getJsonSchema: () => getJsonSchema,
38622
+ getDescription: () => getDescription,
38623
+ dynamic: () => dynamic,
38624
+ TypeId: () => TypeId49,
38625
+ Title: () => Title,
38626
+ Strict: () => Strict,
38627
+ Readonly: () => Readonly,
38628
+ ProviderDefinedTypeId: () => ProviderDefinedTypeId,
38629
+ OpenWorld: () => OpenWorld,
38630
+ NameMapper: () => NameMapper,
38631
+ Meta: () => Meta,
38632
+ Idempotent: () => Idempotent,
38633
+ EmptyParams: () => EmptyParams,
38634
+ DynamicTypeId: () => DynamicTypeId,
38635
+ Destructive: () => Destructive
38636
+ });
38637
+ var TypeId49 = "~effect/ai/Tool";
38638
+ var ProviderDefinedTypeId = "~effect/ai/Tool/ProviderDefined";
38639
+ var DynamicTypeId = "~effect/ai/Tool/Dynamic";
38640
+ var isUserDefined = (u) => hasProperty(u, TypeId49) && !isProviderDefined(u) && !isDynamic(u);
38641
+ var isProviderDefined = (u) => hasProperty(u, ProviderDefinedTypeId);
38642
+ var isDynamic = (u) => hasProperty(u, DynamicTypeId);
38643
+ var Proto14 = {
38644
+ [TypeId49]: {
38645
+ _Requirements: identity
38646
+ },
38647
+ pipe() {
38648
+ return pipeArguments(this, arguments);
38649
+ },
38650
+ addDependency() {
38651
+ return userDefinedProto({
38652
+ ...this
38653
+ });
38654
+ },
38655
+ setParameters(parametersSchema) {
38656
+ return userDefinedProto({
38657
+ ...this,
38658
+ parametersSchema
38659
+ });
38660
+ },
38661
+ setSuccess(successSchema) {
38662
+ return userDefinedProto({
38663
+ ...this,
38664
+ successSchema
38665
+ });
38666
+ },
38667
+ setFailure(failureSchema) {
38668
+ return userDefinedProto({
38669
+ ...this,
38670
+ failureSchema
38671
+ });
38672
+ },
38673
+ annotate(tag2, value3) {
38674
+ return userDefinedProto({
38675
+ ...this,
38676
+ annotations: add(this.annotations, tag2, value3)
38677
+ });
38678
+ },
38679
+ annotateMerge(context4) {
38680
+ return userDefinedProto({
38681
+ ...this,
38682
+ annotations: merge2(this.annotations, context4)
38683
+ });
38684
+ }
38685
+ };
38686
+ var ProviderDefinedProto = {
38687
+ ...Proto14,
38688
+ [ProviderDefinedTypeId]: ProviderDefinedTypeId
38689
+ };
38690
+ var DynamicProto = {
38691
+ ...Proto14,
38692
+ [DynamicTypeId]: DynamicTypeId
38693
+ };
38694
+ var userDefinedProto = (options2) => {
38695
+ const self = Object.assign(Object.create(Proto14), options2);
38696
+ self.id = `effect/ai/Tool/${options2.name}`;
38697
+ return self;
38698
+ };
38699
+ var providerDefinedProto = (options2) => Object.assign(Object.create(ProviderDefinedProto), {
38700
+ ...options2
38701
+ });
38702
+ var dynamicProto = (options2) => {
38703
+ const self = Object.assign(Object.create(DynamicProto), options2);
38704
+ self.id = `effect/ai/Tool/${options2.name}`;
38705
+ return self;
38706
+ };
38707
+ var make45 = (name, options2) => {
38708
+ const successSchema = options2?.success ?? Void2;
38709
+ const failureSchema = options2?.failure ?? Never2;
38710
+ return userDefinedProto({
38711
+ name,
38712
+ description: options2?.description,
38713
+ parametersSchema: options2?.parameters ?? EmptyParams,
38714
+ successSchema,
38715
+ failureSchema,
38716
+ failureMode: options2?.failureMode ?? "error",
38717
+ annotations: empty4(),
38718
+ needsApproval: options2?.needsApproval
38719
+ });
38720
+ };
38721
+ var dynamic = (name, options2) => {
38722
+ const successSchema = options2?.success ?? Unknown2;
38723
+ const failureSchema = options2?.failure ?? Never2;
38724
+ const rawParameters = options2?.parameters ?? Unknown2;
38725
+ const isEffectSchema = isSchema(rawParameters);
38726
+ const parametersSchema = isEffectSchema ? rawParameters : Unknown2;
38727
+ const jsonSchema2 = isEffectSchema ? undefined : rawParameters;
38728
+ return dynamicProto({
38729
+ name,
38730
+ description: options2?.description,
38731
+ parametersSchema,
38732
+ successSchema,
38733
+ failureSchema,
38734
+ failureMode: options2?.failureMode ?? "error",
38735
+ annotations: empty4(),
38736
+ needsApproval: options2?.needsApproval,
38737
+ jsonSchema: jsonSchema2
38738
+ });
38739
+ };
38740
+ var providerDefined = (options2) => (args2) => {
38741
+ const failureMode = isNotUndefined(args2) && "failureMode" in args2 ? args2.failureMode : undefined;
38742
+ const successSchema = options2?.success ?? Void2;
38743
+ const failureSchema = options2?.failure ?? Never2;
38744
+ return providerDefinedProto({
38745
+ id: options2.id,
38746
+ name: options2.customName,
38747
+ providerName: options2.providerName,
38748
+ args: args2,
38749
+ argsSchema: options2?.args ?? Void2,
38750
+ requiresHandler: options2.requiresHandler ?? false,
38751
+ parametersSchema: options2?.parameters ?? Void2,
38752
+ successSchema,
38753
+ failureSchema,
38754
+ failureMode: failureMode ?? "error"
38755
+ });
38756
+ };
38757
+
38758
+ class NameMapper {
38759
+ #customToProvider = /* @__PURE__ */ new Map;
38760
+ #providerToCustom = /* @__PURE__ */ new Map;
38761
+ constructor(tools) {
38762
+ for (const tool of tools) {
38763
+ if (isProviderDefined(tool)) {
38764
+ this.#customToProvider.set(tool.name, tool.providerName);
38765
+ this.#providerToCustom.set(tool.providerName, tool.name);
38766
+ }
38767
+ }
38768
+ }
38769
+ get customNames() {
38770
+ return Array.from(this.#customToProvider.keys());
38771
+ }
38772
+ get providerNames() {
38773
+ return Array.from(this.#providerToCustom.keys());
38774
+ }
38775
+ getCustomName(providerName) {
38776
+ return this.#providerToCustom.get(providerName) ?? providerName;
38777
+ }
38778
+ getProviderName(customName) {
38779
+ return this.#customToProvider.get(customName) ?? customName;
38780
+ }
38781
+ }
38782
+ var getDescription = (tool) => {
38783
+ if (tool.description !== undefined) {
38784
+ return tool.description;
38785
+ }
38786
+ if (isSchema(tool.parametersSchema)) {
38787
+ return resolveDescription2(tool.parametersSchema.ast);
38788
+ }
38789
+ return;
38790
+ };
38791
+ var getJsonSchema = (tool, options2) => {
38792
+ if (isDynamic(tool) && tool.jsonSchema !== undefined) {
38793
+ return tool.jsonSchema;
38794
+ }
38795
+ return getJsonSchemaFromSchema(tool.parametersSchema, options2);
38796
+ };
38797
+ var getJsonSchemaFromSchema = (schema, options2) => {
38798
+ if (isNotUndefined(options2?.transformer)) {
38799
+ return options2.transformer(schema).jsonSchema;
38800
+ }
38801
+ const document = toJsonSchemaDocument2(schema);
38802
+ if (Object.keys(document.definitions).length > 0) {
38803
+ document.schema.$defs = document.definitions;
38804
+ }
38805
+ return document.schema;
38806
+ };
38807
+
38808
+ class Title extends (/* @__PURE__ */ Service()("effect/ai/Tool/Title")) {
38809
+ }
38810
+
38811
+ class Meta extends (/* @__PURE__ */ Service()("effect/ai/Tool/Meta")) {
38812
+ }
38813
+ var Readonly = /* @__PURE__ */ Reference("effect/ai/Tool/Readonly", {
38814
+ defaultValue: constFalse
38815
+ });
38816
+ var Destructive = /* @__PURE__ */ Reference("effect/ai/Tool/Destructive", {
38817
+ defaultValue: constTrue
38818
+ });
38819
+ var Idempotent = /* @__PURE__ */ Reference("effect/ai/Tool/Idempotent", {
38820
+ defaultValue: constFalse
38821
+ });
38822
+ var OpenWorld = /* @__PURE__ */ Reference("effect/ai/Tool/OpenWorld", {
38823
+ defaultValue: constTrue
38824
+ });
38825
+ var Strict = /* @__PURE__ */ Reference("effect/ai/Tool/Strict", {
38826
+ defaultValue: () => {
38827
+ return;
38828
+ }
38829
+ });
38830
+ var getStrictMode = (tool) => get2(tool.annotations, Strict);
38831
+ var suspectProtoRx = /"__proto__"\s*:/;
38832
+ var suspectConstructorRx = /"constructor"\s*:/;
38833
+ function _parse(text2) {
38834
+ const obj = JSON.parse(text2);
38835
+ if (obj === null || typeof obj !== "object") {
38836
+ return obj;
38837
+ }
38838
+ if (suspectProtoRx.test(text2) === false && suspectConstructorRx.test(text2) === false) {
38839
+ return obj;
38840
+ }
38841
+ return filter13(obj);
38842
+ }
38843
+ function filter13(obj) {
38844
+ let next2 = [obj];
38845
+ while (next2.length) {
38846
+ const nodes = next2;
38847
+ next2 = [];
38848
+ for (const node of nodes) {
38849
+ if (Object.prototype.hasOwnProperty.call(node, "__proto__")) {
38850
+ throw new SyntaxError("Object contains forbidden prototype property");
38851
+ }
38852
+ if (Object.prototype.hasOwnProperty.call(node, "constructor") && Object.prototype.hasOwnProperty.call(node.constructor, "prototype")) {
38853
+ throw new SyntaxError("Object contains forbidden prototype property");
38854
+ }
38855
+ for (const key in node) {
38856
+ const value3 = node[key];
38857
+ if (value3 && typeof value3 === "object") {
38858
+ next2.push(value3);
38859
+ }
38860
+ }
38861
+ }
38862
+ }
38863
+ return obj;
38864
+ }
38865
+ var unsafeSecureJsonParse = (text2) => {
38866
+ const prevLimit = getStackTraceLimit();
38867
+ setStackTraceLimit(0);
38868
+ try {
38869
+ return _parse(text2);
38870
+ } finally {
38871
+ setStackTraceLimit(prevLimit);
38872
+ }
38873
+ };
38874
+ var EmptyParams = /* @__PURE__ */ Record2(String6, Never2);
38875
+ function isEmptyParamsRecord(indexSignature) {
38876
+ return indexSignature.parameter === string2 && isNever2(indexSignature.type);
38877
+ }
38591
38878
  // ../core/src/agent-event.ts
38592
38879
  var exports_agent_event = {};
38593
38880
  __export(exports_agent_event, {
@@ -38812,6 +39099,25 @@ var allowAll = exports_Layer.succeed(Permissions, Permissions.of({
38812
39099
  await: () => exports_Effect.succeed(exports_Option.none())
38813
39100
  }));
38814
39101
 
39102
+ // ../core/src/skill-source.ts
39103
+ class SkillSourceError extends exports_Schema.TaggedErrorClass()("@batonfx/core/SkillSourceError", {
39104
+ source: exports_Schema.String,
39105
+ message: exports_Schema.String,
39106
+ cause: exports_Schema.optionalKey(exports_Schema.Defect())
39107
+ }) {
39108
+ }
39109
+ class SkillSource extends exports_Context.Service()("@batonfx/core/SkillSource") {
39110
+ }
39111
+ var fromSkills = (skills) => {
39112
+ const all5 = [...skills];
39113
+ const byName = new Map(all5.map((skill) => [skill.frontmatter.name, skill]));
39114
+ return exports_Layer.succeed(SkillSource, SkillSource.of({
39115
+ all: exports_Effect.succeed(all5),
39116
+ get: (name) => exports_Effect.succeed(byName.get(name))
39117
+ }));
39118
+ };
39119
+ var empty20 = fromSkills([]);
39120
+
38815
39121
  // ../core/src/steering.ts
38816
39122
  class Steering extends exports_Context.Service()("@batonfx/core/Steering") {
38817
39123
  }
@@ -38837,9 +39143,22 @@ var decision = {
38837
39143
  }),
38838
39144
  stop: { _tag: "Stop" }
38839
39145
  };
38840
- var make45 = (decide) => ({ decide });
38841
- var recurs2 = (n) => make45((info) => exports_Effect.succeed(info.turn < n + 1 ? decision.continue() : decision.stop));
39146
+ var make46 = (decide) => ({ decide });
39147
+ var recurs2 = (n) => make46((info) => exports_Effect.succeed(info.turn < n + 1 ? decision.continue() : decision.stop));
38842
39148
  var defaultPolicy = recurs2(8);
39149
+
39150
+ // ../core/src/agent.ts
39151
+ var activateSkillToolName = "activate_skill";
39152
+ var activateSkillParameters = exports_Schema.Struct({ name: exports_Schema.String });
39153
+ var activateSkillTool = exports_Tool.make(activateSkillToolName, {
39154
+ description: "Load the full body for one listed Baton skill by name before applying that skill.",
39155
+ parameters: activateSkillParameters,
39156
+ success: exports_Schema.Struct({
39157
+ name: exports_Schema.String,
39158
+ body: exports_Schema.String,
39159
+ allowedTools: exports_Schema.Array(exports_Schema.String)
39160
+ })
39161
+ });
38843
39162
  // ../core/src/agent-tool.ts
38844
39163
  var defaultParameters = exports_Schema.Struct({ prompt: exports_Schema.String });
38845
39164
  // ../core/src/handoff.ts
@@ -38862,24 +39181,6 @@ var registrations = exports_Effect.fn("ModelRegistry.registrations.call")(functi
38862
39181
  const service4 = yield* Service2;
38863
39182
  return yield* service4.registrations;
38864
39183
  });
38865
- // ../core/src/skill-source.ts
38866
- class SkillSourceError extends exports_Schema.TaggedErrorClass()("@batonfx/core/SkillSourceError", {
38867
- source: exports_Schema.String,
38868
- message: exports_Schema.String,
38869
- cause: exports_Schema.optionalKey(exports_Schema.Defect())
38870
- }) {
38871
- }
38872
- class SkillSource extends exports_Context.Service()("@batonfx/core/SkillSource") {
38873
- }
38874
- var fromSkills = (skills) => {
38875
- const all5 = [...skills];
38876
- const byName = new Map(all5.map((skill) => [skill.frontmatter.name, skill]));
38877
- return exports_Layer.succeed(SkillSource, SkillSource.of({
38878
- all: exports_Effect.succeed(all5),
38879
- get: (name) => exports_Effect.succeed(byName.get(name))
38880
- }));
38881
- };
38882
- var empty20 = fromSkills([]);
38883
39184
  // ../transport/src/wire.ts
38884
39185
  var RunFailure = exports_Schema.Union([
38885
39186
  exports_agent_event.AgentError,
@@ -39169,10 +39470,13 @@ var UserEntryFields = { text: exports_Schema.String };
39169
39470
  var AssistantEntryFields = { text: exports_Schema.String, reasoning: exports_Schema.NullOr(exports_Schema.String) };
39170
39471
  var RunCompletedFields = { text: exports_Schema.String };
39171
39472
  var StringReasonFields = { reason: exports_Schema.String };
39473
+ var OpenedSessionFields = { sessionId: exports_Schema.String };
39474
+ var ToolPendingPhase = exports_Schema.Literals(["called", "executing"]);
39172
39475
  var ToolEntryFields = {
39173
39476
  callId: exports_Schema.String,
39174
39477
  name: exports_Schema.String,
39175
39478
  params: exports_Schema.Unknown,
39479
+ phase: ToolPendingPhase,
39176
39480
  outcome: exports_Schema.suspend(() => ToolOutcome),
39177
39481
  progress: exports_Schema.Array(exports_Schema.String)
39178
39482
  };
@@ -39214,6 +39518,7 @@ var Model = exports_Schema.Struct({
39214
39518
  draft: exports_Schema.String
39215
39519
  });
39216
39520
  var ReceivedAgent = m("ReceivedAgent", ReceivedAgentFields);
39521
+ var OpenedSession = m("OpenedSession", OpenedSessionFields);
39217
39522
  var ChangedDraft = m("ChangedDraft", UserEntryFields);
39218
39523
  var SubmittedMessage = m("SubmittedMessage");
39219
39524
  var ClickedCancel = m("ClickedCancel");
@@ -39225,6 +39530,7 @@ var CancelledRun = m("CancelledRun");
39225
39530
  var FailedAgentCommand = m("FailedAgentCommand", StringReasonFields);
39226
39531
  var Message2 = exports_Schema.Union([
39227
39532
  ReceivedAgent,
39533
+ OpenedSession,
39228
39534
  ChangedDraft,
39229
39535
  SubmittedMessage,
39230
39536
  ClickedCancel,
@@ -39241,6 +39547,43 @@ var RunFailed = m("RunFailed", {
39241
39547
  message: exports_Schema.String
39242
39548
  });
39243
39549
  var OutMessage = exports_Schema.Union([RunCompleted, ApprovalRequired, RunFailed]);
39550
+ var MessageAlign = exports_Schema.Literals(["start", "end"]);
39551
+ var PromptInputStatus = exports_Schema.Literals(["idle", "submitted", "streaming", "error"]);
39552
+ var ToolStatus = exports_Schema.Literals(["input-streaming", "input-available", "output-available", "output-error"]);
39553
+ var UserConversationItem = m("UserConversationItem", { key: exports_Schema.String, align: MessageAlign, entry: UserEntry });
39554
+ var AssistantConversationItem = m("AssistantConversationItem", { key: exports_Schema.String, align: MessageAlign, entry: AssistantEntry });
39555
+ var ToolConversationItem = m("ToolConversationItem", {
39556
+ key: exports_Schema.String,
39557
+ align: MessageAlign,
39558
+ entry: ToolEntry,
39559
+ status: ToolStatus,
39560
+ input: exports_Schema.String
39561
+ });
39562
+ var StreamingConversationItem = m("StreamingConversationItem", {
39563
+ key: exports_Schema.String,
39564
+ align: MessageAlign,
39565
+ text: exports_Schema.String,
39566
+ reasoning: exports_Schema.String,
39567
+ isStreaming: exports_Schema.Boolean
39568
+ });
39569
+ var WaitingConversationItem = m("WaitingConversationItem", { key: exports_Schema.String, align: MessageAlign });
39570
+ var ApprovalConversationItem = m("ApprovalConversationItem", {
39571
+ key: exports_Schema.String,
39572
+ align: MessageAlign,
39573
+ token: exports_Schema.String,
39574
+ toolName: exports_Schema.String,
39575
+ params: exports_Schema.Unknown
39576
+ });
39577
+ var FailureConversationItem = m("FailureConversationItem", { key: exports_Schema.String, align: MessageAlign, message: exports_Schema.String });
39578
+ var ConversationItem = exports_Schema.Union([
39579
+ UserConversationItem,
39580
+ AssistantConversationItem,
39581
+ ToolConversationItem,
39582
+ StreamingConversationItem,
39583
+ WaitingConversationItem,
39584
+ ApprovalConversationItem,
39585
+ FailureConversationItem
39586
+ ]);
39244
39587
  var initialModel = (sessionId = null) => ({
39245
39588
  sessionId,
39246
39589
  connection: "disconnected",
@@ -39278,15 +39621,18 @@ var flushStreaming = (model) => {
39278
39621
  const entry = text2.length === 0 && reasoning.length === 0 ? [] : [AssistantEntry({ text: text2, reasoning: reasoning || null })];
39279
39622
  return { ...model, entries: [...model.entries, ...entry], streaming: null };
39280
39623
  };
39281
- var upsertToolCall = (entries3, call) => {
39624
+ var upsertToolCall = (entries3, call, phase = "called") => {
39282
39625
  const index2 = entries3.findIndex((entry) => entry._tag === "ToolEntry" && entry.callId === call.id);
39283
39626
  const previous = index2 >= 0 ? entries3[index2] : undefined;
39627
+ const previousToolEntry = previous?._tag === "ToolEntry" ? previous : undefined;
39628
+ const nextPhase = previousToolEntry?.phase === "executing" || phase === "executing" ? "executing" : "called";
39284
39629
  const next2 = ToolEntry({
39285
39630
  callId: call.id,
39286
39631
  name: call.name,
39287
- params: call.params,
39288
- outcome: previous?._tag === "ToolEntry" ? previous.outcome : Pending(),
39289
- progress: previous?._tag === "ToolEntry" ? previous.progress : []
39632
+ params: call.params === undefined ? previousToolEntry?.params : call.params,
39633
+ phase: nextPhase,
39634
+ outcome: previousToolEntry?.outcome ?? Pending(),
39635
+ progress: previousToolEntry?.progress ?? []
39290
39636
  });
39291
39637
  if (index2 < 0)
39292
39638
  return [...entries3, next2];
@@ -39298,6 +39644,7 @@ var resolveTool = (entries3, result4) => {
39298
39644
  callId: entry.callId,
39299
39645
  name: entry.name,
39300
39646
  params: entry.params,
39647
+ phase: entry.phase,
39301
39648
  outcome: Completed({ isFailure: result4.isFailure, result: result4.result }),
39302
39649
  progress: entry.progress
39303
39650
  }) : entry);
@@ -39306,6 +39653,7 @@ var addProgress = (entries3, callId, message) => entries3.map((entry) => entry._
39306
39653
  callId: entry.callId,
39307
39654
  name: entry.name,
39308
39655
  params: entry.params,
39656
+ phase: entry.phase,
39309
39657
  outcome: entry.outcome,
39310
39658
  progress: entry.progress.concat(message)
39311
39659
  }) : entry);
@@ -39376,13 +39724,14 @@ var applyEvent = (model, event) => {
39376
39724
  case "ModelPart":
39377
39725
  return [applyPart(model, event.turn, event.part), exports_Option.none()];
39378
39726
  case "ToolExecutionStarted":
39727
+ return [{ ...model, entries: upsertToolCall(model.entries, event.call, "executing") }, exports_Option.none()];
39379
39728
  case "ApprovalRequested":
39380
39729
  return [{ ...model, entries: upsertToolCall(model.entries, event.call) }, exports_Option.none()];
39381
39730
  case "ToolProgress":
39382
39731
  return event.message === undefined ? [model, exports_Option.none()] : [{ ...model, entries: addProgress(model.entries, event.toolCallId, event.message) }, exports_Option.none()];
39383
39732
  case "ToolExecutionCompleted":
39384
39733
  return [
39385
- { ...model, entries: resolveTool(upsertToolCall(model.entries, event.call), event.result) },
39734
+ { ...model, entries: resolveTool(upsertToolCall(model.entries, event.call, "executing"), event.result) },
39386
39735
  exports_Option.none()
39387
39736
  ];
39388
39737
  case "TurnCompleted":
@@ -39448,6 +39797,73 @@ var applyFrame = (model, frame) => {
39448
39797
  return applyStatus(withSeq, frame.status);
39449
39798
  }
39450
39799
  };
39800
+ var jsonText = (value3) => {
39801
+ try {
39802
+ return JSON.stringify(value3, null, 2) ?? "undefined";
39803
+ } catch {
39804
+ return String(value3);
39805
+ }
39806
+ };
39807
+ var promptInputStatusOf = (run4) => {
39808
+ switch (run4._tag) {
39809
+ case "Idle":
39810
+ return "idle";
39811
+ case "Running":
39812
+ return "streaming";
39813
+ case "AwaitingApproval":
39814
+ return "submitted";
39815
+ case "Failed":
39816
+ return "error";
39817
+ }
39818
+ };
39819
+ var toolStatusOf = (entry) => {
39820
+ switch (entry.outcome._tag) {
39821
+ case "Pending":
39822
+ return entry.phase === "executing" ? "input-available" : "input-streaming";
39823
+ case "Completed":
39824
+ return entry.outcome.isFailure ? "output-error" : "output-available";
39825
+ }
39826
+ };
39827
+ var conversationItemFor = (entry, index2) => {
39828
+ switch (entry._tag) {
39829
+ case "UserEntry":
39830
+ return UserConversationItem({ key: `entry-${index2}-user`, align: "end", entry });
39831
+ case "AssistantEntry":
39832
+ return AssistantConversationItem({ key: `entry-${index2}-assistant`, align: "start", entry });
39833
+ case "ToolEntry":
39834
+ return ToolConversationItem({
39835
+ key: `tool-${entry.callId}`,
39836
+ align: "start",
39837
+ entry,
39838
+ status: toolStatusOf(entry),
39839
+ input: jsonText(entry.params)
39840
+ });
39841
+ }
39842
+ };
39843
+ var conversationItems = (model) => {
39844
+ const entries3 = model.entries.map(conversationItemFor);
39845
+ const streaming = model.streaming === null ? [] : [
39846
+ StreamingConversationItem({
39847
+ key: "streaming-assistant",
39848
+ align: "start",
39849
+ text: model.streaming.text,
39850
+ reasoning: model.streaming.reasoning,
39851
+ isStreaming: true
39852
+ })
39853
+ ];
39854
+ const waiting = model.run._tag === "Running" && model.streaming === null ? [WaitingConversationItem({ key: "waiting-assistant", align: "start" })] : [];
39855
+ const approval = model.run._tag === "AwaitingApproval" ? [
39856
+ ApprovalConversationItem({
39857
+ key: `approval-${model.run.token}`,
39858
+ align: "start",
39859
+ token: model.run.token,
39860
+ toolName: model.run.toolName,
39861
+ params: model.run.params
39862
+ })
39863
+ ] : [];
39864
+ const failure2 = model.run._tag === "Failed" ? [FailureConversationItem({ key: "run-failure", align: "start", message: model.run.message })] : [];
39865
+ return [...entries3, ...streaming, ...waiting, ...approval, ...failure2];
39866
+ };
39451
39867
  var isServerFrame = (incoming) => incoming._tag === "Event" || incoming._tag === "Suspended" || incoming._tag === "Failed" || incoming._tag === "Ended" || incoming._tag === "Snapshot" || incoming._tag === "SessionStatus";
39452
39868
  var update3 = (model, message) => {
39453
39869
  switch (message._tag) {
@@ -39472,6 +39888,20 @@ var update3 = (model, message) => {
39472
39888
  exports_Option.some(RunFailed({ message: message.incoming.reason }))
39473
39889
  ];
39474
39890
  }
39891
+ case "OpenedSession":
39892
+ return [
39893
+ {
39894
+ ...model,
39895
+ sessionId: message.sessionId,
39896
+ connection: "connecting",
39897
+ lastSeq: -1,
39898
+ run: Idle(),
39899
+ entries: [],
39900
+ streaming: null
39901
+ },
39902
+ [],
39903
+ exports_Option.none()
39904
+ ];
39475
39905
  case "ChangedDraft":
39476
39906
  return [{ ...model, draft: message.text }, [], exports_Option.none()];
39477
39907
  case "SubmittedMessage": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@batonfx/foldkit",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
5
  "private": false,
6
6
  "type": "module",
7
7
  "exports": {
@@ -14,7 +14,7 @@
14
14
  "typecheck": "bun tsc --noEmit"
15
15
  },
16
16
  "dependencies": {
17
- "@batonfx/transport": "0.1.0"
17
+ "@batonfx/transport": "0.2.0"
18
18
  },
19
19
  "peerDependencies": {
20
20
  "effect": ">=4.0.0-beta.88 <4.0.1",