@my-life-buddies/buddy-runtime 0.0.3 → 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.
Files changed (80) hide show
  1. package/README.md +209 -45
  2. package/dist/conversation/agent.d.ts +6 -1
  3. package/dist/conversation/agent.d.ts.map +1 -1
  4. package/dist/conversation/agent.js +60 -53
  5. package/dist/conversation/agent.js.map +1 -1
  6. package/dist/conversation/agentMessageLLMMessageConverter.d.ts +8 -0
  7. package/dist/conversation/agentMessageLLMMessageConverter.d.ts.map +1 -0
  8. package/dist/conversation/agentMessageLLMMessageConverter.js +24 -0
  9. package/dist/conversation/agentMessageLLMMessageConverter.js.map +1 -0
  10. package/dist/conversation/history.d.ts +0 -7
  11. package/dist/conversation/history.d.ts.map +1 -1
  12. package/dist/conversation/history.js +3 -16
  13. package/dist/conversation/history.js.map +1 -1
  14. package/dist/conversation/index.d.ts +25 -22
  15. package/dist/conversation/index.d.ts.map +1 -1
  16. package/dist/conversation/index.js +141 -116
  17. package/dist/conversation/index.js.map +1 -1
  18. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts +39 -0
  19. package/dist/conversation/mlbMessageAgentMessageConverter.d.ts.map +1 -0
  20. package/dist/conversation/{convert.js → mlbMessageAgentMessageConverter.js} +95 -113
  21. package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -0
  22. package/dist/conversation/readMLBMessages.d.ts +31 -0
  23. package/dist/conversation/readMLBMessages.d.ts.map +1 -0
  24. package/dist/conversation/readMLBMessages.js +90 -0
  25. package/dist/conversation/readMLBMessages.js.map +1 -0
  26. package/dist/conversation/writeMLBMessage.d.ts +64 -0
  27. package/dist/conversation/writeMLBMessage.d.ts.map +1 -0
  28. package/dist/conversation/writeMLBMessage.js +214 -0
  29. package/dist/conversation/writeMLBMessage.js.map +1 -0
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +2 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/mlbClient.d.ts +1 -126
  35. package/dist/mlbClient.d.ts.map +1 -1
  36. package/dist/mlbClient.js +2 -364
  37. package/dist/mlbClient.js.map +1 -1
  38. package/dist/platform/client.d.ts +29 -0
  39. package/dist/platform/client.d.ts.map +1 -0
  40. package/dist/platform/client.js +22 -0
  41. package/dist/platform/client.js.map +1 -0
  42. package/dist/platform/mlbClient.d.ts +133 -0
  43. package/dist/platform/mlbClient.d.ts.map +1 -0
  44. package/dist/platform/mlbClient.js +420 -0
  45. package/dist/platform/mlbClient.js.map +1 -0
  46. package/dist/platform/widgets.d.ts +74 -0
  47. package/dist/platform/widgets.d.ts.map +1 -0
  48. package/dist/platform/widgets.js +85 -0
  49. package/dist/platform/widgets.js.map +1 -0
  50. package/dist/server.d.ts.map +1 -1
  51. package/dist/server.js +8 -4
  52. package/dist/server.js.map +1 -1
  53. package/dist/tools/dataAccess.d.ts +8 -3
  54. package/dist/tools/dataAccess.d.ts.map +1 -1
  55. package/dist/tools/dataAccess.js +33 -5
  56. package/dist/tools/dataAccess.js.map +1 -1
  57. package/dist/tools/registry.d.ts +6 -0
  58. package/dist/tools/registry.d.ts.map +1 -0
  59. package/dist/tools/registry.js +23 -0
  60. package/dist/tools/registry.js.map +1 -0
  61. package/dist/tools/widgets.d.ts +3 -2
  62. package/dist/tools/widgets.d.ts.map +1 -1
  63. package/dist/tools/widgets.js +22 -53
  64. package/dist/tools/widgets.js.map +1 -1
  65. package/dist/types.d.ts +41 -13
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/types.js +3 -3
  68. package/dist/types.js.map +1 -1
  69. package/package.json +4 -3
  70. package/dist/conversation/convert.d.ts +0 -46
  71. package/dist/conversation/convert.d.ts.map +0 -1
  72. package/dist/conversation/convert.js.map +0 -1
  73. package/dist/conversation/presence.d.ts +0 -24
  74. package/dist/conversation/presence.d.ts.map +0 -1
  75. package/dist/conversation/presence.js +0 -56
  76. package/dist/conversation/presence.js.map +0 -1
  77. package/dist/conversation/writeBack.d.ts +0 -36
  78. package/dist/conversation/writeBack.d.ts.map +0 -1
  79. package/dist/conversation/writeBack.js +0 -114
  80. package/dist/conversation/writeBack.js.map +0 -1
@@ -0,0 +1,24 @@
1
+ // AgentMessage → LLMMessage 的换算:交给 pi 的 convertToLlm,每次请求模型前把整段 Agent 历史换成模型收的消息(pi-ai 的 Message)。
2
+ // MLBMessage 与 AgentMessage 之间的换算不在这里,在 mlbMessageAgentMessageConverter.ts;图片块在那一步就定好了,这里原样交出去。
3
+ /**
4
+ * note 变 user;user / assistant / toolResult 原样。一条对一条、按原来的先后,相邻的 user 不合并。
5
+ * 返回的是新数组,不改传进来的消息。
6
+ */
7
+ export const agentMessagesToLLMMessages = (messages) => messages.flatMap((m) => {
8
+ const next = agentMessageToLLMMessage(m);
9
+ return next === undefined ? [] : [next];
10
+ });
11
+ /** 一条 AgentMessage 到模型那边是什么:note 变 user;pi harness 自己并进来的那几种 role(bashExecution / custom / …)这个运行时不产生,照 pi 默认 convertToLlm 的做法不给模型 */
12
+ function agentMessageToLLMMessage(m) {
13
+ switch (m.role) {
14
+ case "note":
15
+ return { role: "user", content: [{ type: "text", text: m.text }], timestamp: m.timestamp };
16
+ case "user":
17
+ case "assistant":
18
+ case "toolResult":
19
+ return m;
20
+ default:
21
+ return undefined;
22
+ }
23
+ }
24
+ //# sourceMappingURL=agentMessageLLMMessageConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentMessageLLMMessageConverter.js","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,gGAAgG;AAKhG;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAa,EAAE,CACjF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;IACtB,MAAM,IAAI,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEJ,sIAAsI;AACtI,SAAS,wBAAwB,CAAC,CAAe;IAChD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,MAAM;YACV,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QAC5F,KAAK,MAAM,CAAC;QACZ,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY;YAChB,OAAO,CAAC,CAAC;QACV;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC"}
@@ -8,8 +8,6 @@ export declare function splitForRebuild(records: MLBMessage[]): {
8
8
  history: MLBMessage[];
9
9
  pending: MLBMessage[];
10
10
  };
11
- /** 一批记录里最大的 seq;空批回原游标 */
12
- export declare function maxSeq(records: MLBMessage[], from: number): number;
13
11
  /** 对方的记录里要处理的:不是搭子写的,有正文或是转发卡 */
14
12
  export declare function theirsOf(records: MLBMessage[]): MLBMessage[];
15
13
  /**
@@ -17,9 +15,4 @@ export declare function theirsOf(records: MLBMessage[]): MLBMessage[];
17
15
  * 该不该答只看平台下发的 shouldReply(旧平台叫 reply,没有 shouldReply 时照认),运行时不判、不让模型猜
18
16
  */
19
17
  export declare function wantsReply(records: MLBMessage[]): boolean;
20
- /** 一批增量:游标之后的是新的(fresh),其中对方的(theirs)交给回合 */
21
- export declare function incoming(batch: MLBMessage[], pulledSeq: number): {
22
- fresh: MLBMessage[];
23
- theirs: MLBMessage[];
24
- };
25
18
  //# sourceMappingURL=history.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/conversation/history.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG;IAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,CAIvG;AAED,0BAA0B;AAC1B,wBAAgB,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlE;AAED,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAE5D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAEzD;AAED,6CAA6C;AAC7C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAE,CAG9G"}
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/conversation/history.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG;IAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,CAIvG;AAED,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAE5D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAEzD"}
@@ -1,6 +1,6 @@
1
1
  // 拉回来的平台记录怎么分拣:哪些灌进历史、哪些是搭子还没回应过的、哪些是对方的、要不要开口。纯函数,不碰 Agent。
2
- // 管:首次拉取(重建)的切分;每批增量的过滤;「要不要开口」的判定(重建与平时同一条)。
3
- // 不管:记录换成 pi 消息的形状(convert.ts)、分拣之后怎么处理(index.ts)。
2
+ // 管:首次拉取(重建)的切分;挑出对方的记录;「要不要开口」的判定(重建与平时同一条)。
3
+ // 不管:拉取、游标与只交新消息(readMLBMessages.ts)、记录换成 pi 消息的形状(mlbMessageAgentMessageConverter.ts)、分拣之后怎么处理(index.ts)。
4
4
  /**
5
5
  * 首次拉取(重建):以搭子最后一次写的记录为界。之前的整段是历史,照原样灌;之后的是搭子还没回应过的,
6
6
  * 交给回合按平时同一条规矩处理(wantsReply)。不看「最后一条」:拉取时平台追加的 context、
@@ -12,17 +12,9 @@ export function splitForRebuild(records) {
12
12
  last--;
13
13
  return { history: records.slice(0, last + 1), pending: records.slice(last + 1) };
14
14
  }
15
- /** 一批记录里最大的 seq;空批回原游标 */
16
- export function maxSeq(records, from) {
17
- let seq = from;
18
- for (const m of records)
19
- if (m.seq > seq)
20
- seq = m.seq;
21
- return seq;
22
- }
23
15
  /** 对方的记录里要处理的:不是搭子写的,有正文或是转发卡 */
24
16
  export function theirsOf(records) {
25
- return records.filter((m) => m.author !== "buddy" && ((m.text ?? "") !== "" || m.messagesCard !== undefined));
17
+ return records.filter((m) => m.author !== "buddy" && ((m.text ?? "") !== "" || m.messagesCard !== undefined || (m.type === "image" && !!m.image?.mediaId)));
26
18
  }
27
19
  /**
28
20
  * 要不要开口:其中有一条是用户说的、平台标了该答。平台写的(context、system)从不该答;
@@ -31,9 +23,4 @@ export function theirsOf(records) {
31
23
  export function wantsReply(records) {
32
24
  return records.some((m) => m.author === "user" && (m.shouldReply === true || (m.shouldReply === undefined && m.reply === true)));
33
25
  }
34
- /** 一批增量:游标之后的是新的(fresh),其中对方的(theirs)交给回合 */
35
- export function incoming(batch, pulledSeq) {
36
- const fresh = batch.filter((m) => m.seq > pulledSeq);
37
- return { fresh, theirs: theirsOf(fresh) };
38
- }
39
26
  //# sourceMappingURL=history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/conversation/history.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8CAA8C;AAC9C,mDAAmD;AAInD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAqB;IACpD,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;QAAE,IAAI,EAAE,CAAC;IAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,MAAM,CAAC,OAAqB,EAAE,IAAY;IACzD,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG;YAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;IACtD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,QAAQ,CAAC,OAAqB;IAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC;AAC/G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC/C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AAClI,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,QAAQ,CAAC,KAAmB,EAAE,SAAiB;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;IACrD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/conversation/history.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,8CAA8C;AAC9C,2GAA2G;AAI3G;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAqB;IACpD,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;QAAE,IAAI,EAAE,CAAC;IAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,QAAQ,CAAC,OAAqB;IAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC7J,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC/C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AAClI,CAAC"}
@@ -4,6 +4,8 @@ import type { MLBClient, WidgetType } from "../mlbClient.ts";
4
4
  import type { Resource } from "../tools/resource.ts";
5
5
  import type { BuddyFactory, BuddyLogger, DataRequirement } from "../types.ts";
6
6
  export interface ConversationHandleDeps {
7
+ welcome?: string;
8
+ errorReply?: string;
7
9
  /** 平台会话键:p_ 私聊、g_ 群 */
8
10
  key: string;
9
11
  buddyId: string;
@@ -24,23 +26,25 @@ export interface ConversationHandleDeps {
24
26
  onStartFailed: () => void;
25
27
  }
26
28
  export declare class ConversationHandle {
29
+ private readonly lifetime;
30
+ private welcomeRequested;
31
+ private steered;
32
+ private policyStopped;
27
33
  private readonly deps;
28
34
  private readonly identity;
29
- private readonly presence;
30
- private readonly writeBack;
35
+ /** 模型收不收图片:一个进程只用一个模型,换算平台记录时按它决定图片块还是固定文字 */
36
+ private readonly imageInput;
37
+ private readonly reader;
38
+ private readonly writer;
31
39
  /** 懒建:第一次拉到消息时跑 factory 再 new */
32
40
  private agent;
33
41
  private dataAccessUsage;
34
- /** 同会话的拉取串行链:notify 只往链尾排,绝不并发拉 */
35
- private pullChain;
36
- private pullRetry;
37
- private pullRetryDelay;
38
- /** 读方向游标:已经拉到并处理过的最大 seq(含自己写的) */
39
- private pulledSeq;
40
- /** 首次拉取(after=0 全量灌历史)做过没有 */
42
+ /** 首次拉到的整批灌进历史(重建)做过没有 */
41
43
  private rebuilt;
42
44
  /** 忙时听见的、不用开口的旁听消息,回合收尾再进历史 */
43
45
  private heard;
46
+ /** 最近一条该答的对方消息的平台 id:兜底回复的幂等键用它,同一句话只兜一次底 */
47
+ private replyTo;
44
48
  /** 当前回合的 promise,close 要等它 */
45
49
  private turn;
46
50
  /** 本回合有没有一条 assistant 消息带非空正文且正常收尾 */
@@ -51,7 +55,7 @@ export declare class ConversationHandle {
51
55
  private _closed;
52
56
  private _lastActivity;
53
57
  constructor(deps: ConversationHandleDeps);
54
- /** 正在跑回合(含收尾:等出站队列清空) */
58
+ /** 正在跑回合(含收尾:等发平台的队列清空) */
55
59
  get busy(): boolean;
56
60
  /** 最近一次有消息进来或回合收尾的时刻,server 按它做空闲淘汰 */
57
61
  get lastActivity(): number;
@@ -59,27 +63,25 @@ export declare class ConversationHandle {
59
63
  get closed(): boolean;
60
64
  /** 测试探针:Agent 当前的历史;还没建 Agent 时是空数组 */
61
65
  get transcript(): readonly AgentMessage[];
62
- /** SSE message 到了:把一次拉取排进串行链。已退役的直接忽略 */
63
- notify(): void;
66
+ /** SSE message 到了:让 reader 拉一次。已退役的直接忽略 */
67
+ notify(welcome?: boolean): void;
64
68
  /**
65
69
  * SSE delete 到了(或 server 空闲淘汰、stop、会话起不来):先标退役,再打断正在跑的回合,等回合收尾。可以重复调。
66
70
  */
67
71
  close(): Promise<void>;
68
- /** 标退役:写回队列清空并打断重发等待(回合收尾才不会被它拖住)、攒着的 delta 扔掉 */
72
+ /** 标退役:不再拉、取消拉取重试;发平台的队列丢掉没发的字与写回、打断重发等待(回合收尾才不会被它拖住) */
69
73
  private retire;
70
74
  /**
71
- * 一次拉取:从 pulledSeq 往后翻到不满页。第一次走重建,之后走 ingest。网络错误按 1s–30s 指数退避主动重试,新 SSE 会提前唤醒。
72
- * 平台的场合交代(context)是流里的一条记录,跟别的记录一起拉到;会话没了只靠 SSE delete 事件收,拉取这里不判。
75
+ * reader 交来一批:第一次走重建,之后走 ingest
76
+ * 平台的场合交代(context)是流里的一条记录,跟别的记录一起拉到;会话没了只靠 SSE delete 事件收,这里不判。
73
77
  */
74
- private pull;
75
- private schedulePullRetry;
76
- private cancelPullRetry;
78
+ private onMessages;
77
79
  /**
78
- * 首次拉取:建 Agent,以搭子最后一次写的记录为界,之前的整段灌进 state.messages(不经事件,天然不会被写回平台);
80
+ * 首次拉取:建 Agent,以搭子最后一次写的记录为界,之前的整段按消息时间的先后灌进 state.messages(不经事件,天然不会被写回平台);
79
81
  * 之后的是搭子还没回应过的,交给 admit 按平时同一条规矩处理:有该答的就起回合,没有就只进历史。
80
82
  */
81
83
  private rebuild;
82
- /** 一批新记录:游标推到最大 seq(自己写的也算,下次不再拉到),对方的交给 admit */
84
+ /** 一批新记录(reader 只交比上一批晚的,自己写回的也在里面):对方的交给 admit */
83
85
  private ingest;
84
86
  /**
85
87
  * 搭子还没回应过的对方记录(重建时是搭子最后一次说话之后的那段,平时是这批新来的),换成 user 消息分发。
@@ -90,12 +92,13 @@ export declare class ConversationHandle {
90
92
  /**
91
93
  * 跑一个回合。messages 有值就 prompt 它们;没值(收尾时发现队列里还有消息)就直接 continue。
92
94
  * prompt 完把回合中 steer 进来的消化完;一句话没说就 followUp 一条 note 提醒再跑一次。
93
- * 收尾:heard 进历史、delta 发完、replying 关掉、等出站队列清空,才算不忙。
95
+ * 收尾:replying 关掉、等发平台的队列清空(每条写回的消息都拿到了平台定的时间)、heard 进历史、
96
+ * 这一轮进历史的消息按时间排好,才算不忙——排完的顺序跟手机上、跟重建出来的一样。
94
97
  * 收尾期间又有人 steer(busy 还是 true,走不了 prompt),就接着再跑一个回合把它消化掉。
95
98
  */
96
99
  private runTurn;
97
100
  /**
98
- * Agent 事件 → 写回队列 / 在线态。pi 会等这个函数返回再往下走,所以只做同步入队,网络在队列自己的链上;
101
+ * Agent 事件 → 发平台的队列。pi 会等这个函数返回再往下走,所以只做同步入队,网络在队列自己的链上;
99
102
  * 抛错会让 pi 把整个回合判失败,所以整体 try/catch。退役后的事件直接丢。
100
103
  */
101
104
  private onEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAqB,YAAY,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAIxD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAA2B,MAAM,aAAa,CAAC;AAMvG,MAAM,WAAW,sBAAsB;IACtC,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,WAAW,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzC,+DAA+D;IAC/D,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACnD,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,WAAW,CAAC;IACjB,uDAAuD;IACvD,aAAa,EAAE,MAAM,IAAI,CAAC;CAC1B;AAUD,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC,iCAAiC;IACjC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,eAAe,CAAqC;IAC5D,mCAAmC;IACnC,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,cAAc,CAAqB;IAC3C,mCAAmC;IACnC,OAAO,CAAC,SAAS,CAAK;IACtB,8BAA8B;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,+BAA+B;IAC/B,OAAO,CAAC,KAAK,CAAsB;IACnC,8BAA8B;IAC9B,OAAO,CAAC,IAAI,CAA4B;IACxC,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAS;IACtB,iFAAiF;IACjF,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAc;gBAEvB,IAAI,EAAE,sBAAsB;IAcxC,yBAAyB;IACzB,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,uCAAuC;IACvC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,uBAAuB;IACvB,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,uCAAuC;IACvC,IAAI,UAAU,IAAI,SAAS,YAAY,EAAE,CAExC;IAED,yCAAyC;IACzC,MAAM,IAAI,IAAI;IASd;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,kDAAkD;IAClD,OAAO,CAAC,MAAM;IASd;;;OAGG;YACW,IAAI;IAkClB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,eAAe;IAMvB;;;OAGG;YACW,OAAO;IAiBrB,kDAAkD;IAClD,OAAO,CAAC,MAAM;IASd;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAiBb;;;;;OAKG;YACW,OAAO;IA6CrB;;;OAGG;IACH,OAAO,CAAC,OAAO;CAiEf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"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"}