@xrkseek/harness 0.5.11 → 0.5.13

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 (152) hide show
  1. package/node_modules/@vscode/ripgrep/LICENSE +13 -0
  2. package/node_modules/@vscode/ripgrep/README.md +33 -0
  3. package/node_modules/@vscode/ripgrep/lib/index.d.ts +1 -0
  4. package/node_modules/@vscode/ripgrep/lib/index.js +19 -0
  5. package/node_modules/@vscode/ripgrep/package.json +39 -0
  6. package/node_modules/@vscode/ripgrep-win32-x64/LICENSE +13 -0
  7. package/node_modules/@vscode/ripgrep-win32-x64/README.md +5 -0
  8. package/node_modules/@vscode/ripgrep-win32-x64/bin/rg.exe +0 -0
  9. package/node_modules/@vscode/ripgrep-win32-x64/package.json +19 -0
  10. package/node_modules/@xrkseek/core-agent-loop/dist/index.d.ts.map +1 -1
  11. package/node_modules/@xrkseek/core-agent-loop/dist/index.js +20 -5
  12. package/node_modules/@xrkseek/core-agent-loop/dist/index.js.map +1 -1
  13. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.d.ts.map +1 -1
  14. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js +4 -2
  15. package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js.map +1 -1
  16. package/node_modules/@xrkseek/exec-fs/dist/index.d.ts +7 -9
  17. package/node_modules/@xrkseek/exec-fs/dist/index.d.ts.map +1 -1
  18. package/node_modules/@xrkseek/exec-fs/dist/index.js +60 -19
  19. package/node_modules/@xrkseek/exec-fs/dist/index.js.map +1 -1
  20. package/node_modules/@xrkseek/exec-fs/dist/ripgrep.d.ts +63 -0
  21. package/node_modules/@xrkseek/exec-fs/dist/ripgrep.d.ts.map +1 -0
  22. package/node_modules/@xrkseek/exec-fs/dist/ripgrep.js +363 -0
  23. package/node_modules/@xrkseek/exec-fs/dist/ripgrep.js.map +1 -0
  24. package/node_modules/@xrkseek/exec-fs/dist/search.d.ts +32 -3
  25. package/node_modules/@xrkseek/exec-fs/dist/search.d.ts.map +1 -1
  26. package/node_modules/@xrkseek/exec-fs/dist/search.js +189 -72
  27. package/node_modules/@xrkseek/exec-fs/dist/search.js.map +1 -1
  28. package/node_modules/@xrkseek/exec-fs/package.json +2 -0
  29. package/node_modules/@xrkseek/exec-shell/dist/index.d.ts +14 -1
  30. package/node_modules/@xrkseek/exec-shell/dist/index.d.ts.map +1 -1
  31. package/node_modules/@xrkseek/exec-shell/dist/index.js +37 -5
  32. package/node_modules/@xrkseek/exec-shell/dist/index.js.map +1 -1
  33. package/node_modules/@xrkseek/exec-subprocess/dist/capture.d.ts +73 -0
  34. package/node_modules/@xrkseek/exec-subprocess/dist/capture.d.ts.map +1 -0
  35. package/node_modules/@xrkseek/exec-subprocess/dist/capture.js +240 -0
  36. package/node_modules/@xrkseek/exec-subprocess/dist/capture.js.map +1 -0
  37. package/node_modules/@xrkseek/exec-subprocess/dist/index.d.ts +19 -0
  38. package/node_modules/@xrkseek/exec-subprocess/dist/index.d.ts.map +1 -1
  39. package/node_modules/@xrkseek/exec-subprocess/dist/index.js +58 -21
  40. package/node_modules/@xrkseek/exec-subprocess/dist/index.js.map +1 -1
  41. package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts +6 -7
  42. package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts.map +1 -1
  43. package/node_modules/@xrkseek/preset-harness/dist/preset.js +14 -11
  44. package/node_modules/@xrkseek/preset-harness/dist/preset.js.map +1 -1
  45. package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
  46. package/node_modules/@xrkseek/preset-harness/package.json +1 -0
  47. package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
  48. package/node_modules/@xrkseek/preset-server/dist/preset.d.ts.map +1 -1
  49. package/node_modules/@xrkseek/preset-server/dist/preset.js +4 -1
  50. package/node_modules/@xrkseek/preset-server/dist/preset.js.map +1 -1
  51. package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
  52. package/node_modules/@xrkseek/server-config/dist/home.d.ts +1 -2
  53. package/node_modules/@xrkseek/server-config/dist/home.d.ts.map +1 -1
  54. package/node_modules/@xrkseek/server-config/dist/home.js +1 -2
  55. package/node_modules/@xrkseek/server-config/dist/home.js.map +1 -1
  56. package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.d.ts +6 -0
  57. package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.d.ts.map +1 -1
  58. package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.js +28 -1
  59. package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.js.map +1 -1
  60. package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.d.ts +11 -0
  61. package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.d.ts.map +1 -1
  62. package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.js +19 -0
  63. package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.js.map +1 -1
  64. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts +38 -2
  65. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts.map +1 -1
  66. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js +178 -37
  67. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js.map +1 -1
  68. package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.d.ts.map +1 -1
  69. package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.js +17 -6
  70. package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.js.map +1 -1
  71. package/node_modules/@xrkseek/server-face/dist/collab-board.d.ts +41 -0
  72. package/node_modules/@xrkseek/server-face/dist/collab-board.d.ts.map +1 -0
  73. package/node_modules/@xrkseek/server-face/dist/collab-board.js +79 -0
  74. package/node_modules/@xrkseek/server-face/dist/collab-board.js.map +1 -0
  75. package/node_modules/@xrkseek/server-face/dist/face-schema.d.ts.map +1 -1
  76. package/node_modules/@xrkseek/server-face/dist/face-schema.js +12 -2
  77. package/node_modules/@xrkseek/server-face/dist/face-schema.js.map +1 -1
  78. package/node_modules/@xrkseek/server-face/dist/handlers/session.d.ts.map +1 -1
  79. package/node_modules/@xrkseek/server-face/dist/handlers/session.js +8 -12
  80. package/node_modules/@xrkseek/server-face/dist/handlers/session.js.map +1 -1
  81. package/node_modules/@xrkseek/server-face/dist/handlers/team.d.ts.map +1 -1
  82. package/node_modules/@xrkseek/server-face/dist/handlers/team.js +13 -1
  83. package/node_modules/@xrkseek/server-face/dist/handlers/team.js.map +1 -1
  84. package/node_modules/@xrkseek/server-face/dist/index.d.ts +4 -2
  85. package/node_modules/@xrkseek/server-face/dist/index.d.ts.map +1 -1
  86. package/node_modules/@xrkseek/server-face/dist/index.js +4 -2
  87. package/node_modules/@xrkseek/server-face/dist/index.js.map +1 -1
  88. package/node_modules/@xrkseek/server-face/dist/presence-dressing.d.ts +26 -0
  89. package/node_modules/@xrkseek/server-face/dist/presence-dressing.d.ts.map +1 -0
  90. package/node_modules/@xrkseek/server-face/dist/presence-dressing.js +84 -0
  91. package/node_modules/@xrkseek/server-face/dist/presence-dressing.js.map +1 -0
  92. package/node_modules/@xrkseek/server-face/dist/presence-tools.d.ts.map +1 -1
  93. package/node_modules/@xrkseek/server-face/dist/presence-tools.js +9 -5
  94. package/node_modules/@xrkseek/server-face/dist/presence-tools.js.map +1 -1
  95. package/node_modules/@xrkseek/server-face/dist/projections/index.d.ts +1 -1
  96. package/node_modules/@xrkseek/server-face/dist/projections/index.d.ts.map +1 -1
  97. package/node_modules/@xrkseek/server-face/dist/projections/index.js +1 -1
  98. package/node_modules/@xrkseek/server-face/dist/projections/index.js.map +1 -1
  99. package/node_modules/@xrkseek/server-face/dist/projections/registry.d.ts +2 -2
  100. package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.d.ts +15 -3
  101. package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.d.ts.map +1 -1
  102. package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.js +23 -7
  103. package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.js.map +1 -1
  104. package/node_modules/@xrkseek/server-face/dist/runtime.d.ts.map +1 -1
  105. package/node_modules/@xrkseek/server-face/dist/runtime.js +6 -4
  106. package/node_modules/@xrkseek/server-face/dist/runtime.js.map +1 -1
  107. package/node_modules/@xrkseek/server-face/dist/session-status.d.ts +49 -1
  108. package/node_modules/@xrkseek/server-face/dist/session-status.d.ts.map +1 -1
  109. package/node_modules/@xrkseek/server-face/dist/session-status.js +89 -18
  110. package/node_modules/@xrkseek/server-face/dist/session-status.js.map +1 -1
  111. package/node_modules/@xrkseek/server-face/dist/session-thread-message.d.ts +17 -0
  112. package/node_modules/@xrkseek/server-face/dist/session-thread-message.d.ts.map +1 -0
  113. package/node_modules/@xrkseek/server-face/dist/session-thread-message.js +34 -0
  114. package/node_modules/@xrkseek/server-face/dist/session-thread-message.js.map +1 -0
  115. package/node_modules/@xrkseek/server-face/dist/session-thread-store.d.ts +2 -0
  116. package/node_modules/@xrkseek/server-face/dist/session-thread-store.d.ts.map +1 -1
  117. package/node_modules/@xrkseek/server-face/dist/session-thread-store.js +10 -0
  118. package/node_modules/@xrkseek/server-face/dist/session-thread-store.js.map +1 -1
  119. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.d.ts +15 -0
  120. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.d.ts.map +1 -1
  121. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js +159 -7
  122. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js.map +1 -1
  123. package/node_modules/@xrkseek/server-face/dist/settings-document.d.ts.map +1 -1
  124. package/node_modules/@xrkseek/server-face/dist/settings-document.js +36 -1
  125. package/node_modules/@xrkseek/server-face/dist/settings-document.js.map +1 -1
  126. package/node_modules/@xrkseek/server-face/dist/settings-schemas.d.ts.map +1 -1
  127. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js +28 -2
  128. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
  129. package/node_modules/@xrkseek/server-face/dist/subagent-registry.d.ts +6 -0
  130. package/node_modules/@xrkseek/server-face/dist/subagent-registry.d.ts.map +1 -1
  131. package/node_modules/@xrkseek/server-face/dist/subagent-registry.js +18 -0
  132. package/node_modules/@xrkseek/server-face/dist/subagent-registry.js.map +1 -1
  133. package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts.map +1 -1
  134. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js +2 -1
  135. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js.map +1 -1
  136. package/node_modules/@xrkseek/server-face/dist/ws-send-queue.d.ts +10 -0
  137. package/node_modules/@xrkseek/server-face/dist/ws-send-queue.d.ts.map +1 -1
  138. package/node_modules/@xrkseek/server-face/dist/ws-send-queue.js +68 -3
  139. package/node_modules/@xrkseek/server-face/dist/ws-send-queue.js.map +1 -1
  140. package/node_modules/@xrkseek/server-host/dist/index.d.ts +13 -8
  141. package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
  142. package/node_modules/@xrkseek/server-host/dist/index.js +30 -28
  143. package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
  144. package/node_modules/@xrkseek/workspace/dist/skills.d.ts +1 -1
  145. package/node_modules/@xrkseek/workspace/dist/skills.d.ts.map +1 -1
  146. package/node_modules/@xrkseek/workspace/dist/skills.js +1 -1
  147. package/node_modules/@xrkseek/workspace/dist/skills.js.map +1 -1
  148. package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.d.ts +1 -1
  149. package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.d.ts.map +1 -1
  150. package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.js +23 -1
  151. package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.js.map +1 -1
  152. package/package.json +5 -1
@@ -10,8 +10,7 @@ export declare function hostSettingsPath(env?: NodeJS.ProcessEnv): string;
10
10
  export declare function defaultPluginsDir(env?: NodeJS.ProcessEnv): string;
11
11
  /**
12
12
  * `{home}/spill` — tool-result / session-reference / pipeline tool-output
13
- * persist root. Host lists this directory (not all of `{home}`) in
14
- * `hostReadableRoots`.
13
+ * persist root. Covered when Host lists `{XRK_HOME}` in `hostReadableRoots`.
15
14
  */
16
15
  export declare function defaultSpillDir(env?: NodeJS.ProcessEnv): string;
17
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AASA,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC,gFAAgF;AAChF,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAGR;AAaD,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAezE"}
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AASA,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC,gFAAgF;AAChF,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAGR;AAaD,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAezE"}
@@ -24,8 +24,7 @@ export function defaultPluginsDir(env = process.env) {
24
24
  }
25
25
  /**
26
26
  * `{home}/spill` — tool-result / session-reference / pipeline tool-output
27
- * persist root. Host lists this directory (not all of `{home}`) in
28
- * `hostReadableRoots`.
27
+ * persist root. Covered when Host lists `{XRK_HOME}` in `hostReadableRoots`.
29
28
  */
30
29
  export function defaultSpillDir(env = process.env) {
31
30
  return path.join(resolveXrkHome(env), "spill");
@@ -1 +1 @@
1
- {"version":3,"file":"home.js","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"home.js","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,12 @@ import type { SessionEvent } from "@xrkseek/protocol";
10
10
  export declare const DEFAULT_HISTORY_MAX_MESSAGES = 50;
11
11
  /** Inclusive 0-based start index of one transcript message's supporting events. */
12
12
  export declare function messageGroupStartIndex(events: readonly SessionEvent[], messageIndex: number): number;
13
+ /**
14
+ * Inclusive index of the owning `turn/start` for the event at `fromIndex`.
15
+ * A message-count cut can land on a later assistant of the same Host turn;
16
+ * the rail and installWindow need that turn's opener in the page.
17
+ */
18
+ export declare function owningTurnStartIndex(events: readonly SessionEvent[], fromIndex: number): number;
13
19
  /**
14
20
  * Slice one backwards history page from the session log.
15
21
  * @returns page events and whether older pages exist.
@@ -1 +1 @@
1
- {"version":3,"file":"history-paginate.d.ts","sourceRoot":"","sources":["../../src/adapt/history-paginate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wFAAwF;AACxF,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAiB/C,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,YAAY,EAAE,MAAM,GACnB,MAAM,CAwCR;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM,GAClB;IACD,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAgCA;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,GAAE,MAAqC,GACjD;IACD,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAOA;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,YAAY,EAAE,CAwBhB"}
1
+ {"version":3,"file":"history-paginate.d.ts","sourceRoot":"","sources":["../../src/adapt/history-paginate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wFAAwF;AACxF,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAiB/C,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,YAAY,EAAE,MAAM,GACnB,MAAM,CA0CR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,GAChB,MAAM,CAYR;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM,GAClB;IACD,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAgCA;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,GAAE,MAAqC,GACjD;IACD,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAOA;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,YAAY,EAAE,CAwBhB"}
@@ -25,7 +25,11 @@ export function messageGroupStartIndex(events, messageIndex) {
25
25
  const event = events[i];
26
26
  if (event === undefined || MESSAGE_TYPES.has(event.type))
27
27
  break;
28
+ if (event.type === "turn/end")
29
+ break;
28
30
  start = i;
31
+ if (event.type === "turn/start")
32
+ break;
29
33
  }
30
34
  if (msg.type === "user/message") {
31
35
  for (let i = start - 1; i >= 0; i--) {
@@ -58,6 +62,29 @@ export function messageGroupStartIndex(events, messageIndex) {
58
62
  }
59
63
  return start;
60
64
  }
65
+ /**
66
+ * Inclusive index of the owning `turn/start` for the event at `fromIndex`.
67
+ * A message-count cut can land on a later assistant of the same Host turn;
68
+ * the rail and installWindow need that turn's opener in the page.
69
+ */
70
+ export function owningTurnStartIndex(events, fromIndex) {
71
+ const origin = events[fromIndex];
72
+ if (origin === undefined)
73
+ return fromIndex;
74
+ const turnId = origin.turnId;
75
+ if (typeof turnId !== "string" || turnId.length === 0)
76
+ return fromIndex;
77
+ for (let i = fromIndex; i >= 0; i--) {
78
+ const event = events[i];
79
+ if (event === undefined)
80
+ break;
81
+ if (event.type === "turn/start" && event.turnId === turnId)
82
+ return i;
83
+ if (event.type === "turn/start")
84
+ break;
85
+ }
86
+ return fromIndex;
87
+ }
61
88
  /**
62
89
  * Slice one backwards history page from the session log.
63
90
  * @returns page events and whether older pages exist.
@@ -86,7 +113,7 @@ export function paginateSessionHistory(events, beforeSeq, maxMessages) {
86
113
  count++;
87
114
  const groupStart = messageGroupStartIndex(window, i);
88
115
  if (count >= maxMessages) {
89
- cutIndex = groupStart;
116
+ cutIndex = owningTurnStartIndex(window, groupStart);
90
117
  break;
91
118
  }
92
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"history-paginate.js","sourceRoot":"","sources":["../../src/adapt/history-paginate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"history-paginate.js","sourceRoot":"","sources":["../../src/adapt/history-paginate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,wFAAwF;AACxF,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAE7E,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CACnB,IAAkB,EAClB,MAAc,EACd,MAAc;IAEd,MAAM,GAAG,GAAG,IAA4C,CAAC;IACzD,OAAO,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;AACxD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CACpC,MAA+B,EAC/B,YAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAE3E,IAAI,KAAK,GAAG,YAAY,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,MAAM;QAChE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,MAAM;QACrC,KAAK,GAAG,CAAC,CAAC;QACV,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM;IACzC,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM;YAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC/D,KAAK,GAAG,CAAC,CAAC;gBACV,MAAM;YACR,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,MAAM;QACxE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACrC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM;YAC/B,IACE,KAAK,CAAC,IAAI,KAAK,YAAY;mBACxB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EACtC,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC;gBACV,MAAM;YACR,CAAC;YACD,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;gBAAE,MAAM;QACxE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA+B,EAC/B,SAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAI,MAA8B,CAAC,MAAM,CAAC;IACtD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM;QAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC;QACrE,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM;IACzC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAA+B,EAC/B,SAA6B,EAC7B,WAAmB;IAOnB,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,SAAS,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS;gBAAE,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;;gBAC1C,MAAM;QACb,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QACpE,KAAK,EAAE,CAAC;QACR,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;YACzB,QAAQ,GAAG,oBAAoB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACpD,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9B,OAAO,EAAE,QAAQ,GAAG,CAAC;QACrB,UAAU,EAAE,QAAQ;KACrB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,+BAA+B,CAC7C,MAA+B,EAC/B,SAA6B,EAC7B,cAAsB,4BAA4B;IAMlD,MAAM,IAAI,GAAG,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACpE,OAAO;QACL,MAAM,EAAE,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAA+B;IAE/B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACvC,cAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACtC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC;QAClD,IACE,KAAK,CAAC,IAAI,KAAK,WAAW;eACvB,KAAK,CAAC,UAAU,KAAK,SAAS;eAC9B,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAC3C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -9,6 +9,17 @@ export declare class FaceWireIdMaps {
9
9
  private readonly stepCount;
10
10
  turn(sessionId: string, turnId: string): number;
11
11
  step(sessionId: string, turnId: string, stepId: string): number;
12
+ /**
13
+ * Number every turn/step in durable log order. History must call this
14
+ * before wiring a tail page — otherwise the first `turn/start` in the
15
+ * window becomes wire `1`, and a later loadOlder assigns the real first
16
+ * 轮次 a late number (the 0.5.11 opener showing as 第 5 轮).
17
+ */
18
+ primeFromLog(sessionId: string, events: readonly {
19
+ readonly type: string;
20
+ readonly turnId?: string;
21
+ readonly stepId?: string;
22
+ }[]): void;
12
23
  /**
13
24
  * Drop every session-scoped bucket for one session. Called on session
14
25
  * eviction so long-running hosts do not retain turn/step counters for
@@ -1 +1 @@
1
- {"version":3,"file":"wire-ids.d.ts","sourceRoot":"","sources":["../../src/adapt/wire-ids.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAc/C,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAgB/D;;;;OAIG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAU/B"}
1
+ {"version":3,"file":"wire-ids.d.ts","sourceRoot":"","sources":["../../src/adapt/wire-ids.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAc/C,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAgB/D;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI;IAevI;;;;OAIG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAU/B"}
@@ -37,6 +37,25 @@ export class FaceWireIdMaps {
37
37
  byStep.set(key, n);
38
38
  return n;
39
39
  }
40
+ /**
41
+ * Number every turn/step in durable log order. History must call this
42
+ * before wiring a tail page — otherwise the first `turn/start` in the
43
+ * window becomes wire `1`, and a later loadOlder assigns the real first
44
+ * 轮次 a late number (the 0.5.11 opener showing as 第 5 轮).
45
+ */
46
+ primeFromLog(sessionId, events) {
47
+ this.clear(sessionId);
48
+ for (const event of events) {
49
+ if (event.type === "turn/start" && typeof event.turnId === "string") {
50
+ this.turn(sessionId, event.turnId);
51
+ }
52
+ else if (event.type === "step/start"
53
+ && typeof event.turnId === "string"
54
+ && typeof event.stepId === "string") {
55
+ this.step(sessionId, event.turnId, event.stepId);
56
+ }
57
+ }
58
+ }
40
59
  /**
41
60
  * Drop every session-scoped bucket for one session. Called on session
42
61
  * eviction so long-running hosts do not retain turn/step counters for
@@ -1 +1 @@
1
- {"version":3,"file":"wire-ids.js","sourceRoot":"","sources":["../../src/adapt/wire-ids.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,cAAc;IACR,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC/C,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC/C,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvD,IAAI,CAAC,SAAiB,EAAE,MAAc;QACpC,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,SAAiB,EAAE,MAAc,EAAE,MAAc;QACpD,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC;QACnC,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAiB;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,oFAAoF;QACpF,MAAM,MAAM,GAAG,GAAG,SAAS,IAAI,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"wire-ids.js","sourceRoot":"","sources":["../../src/adapt/wire-ids.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type AgentTeamSpawnRole } from "./agent-team-roles.js";
2
+ import { type PresenceSticker } from "./presence-dressing.js";
2
3
  export declare const MEMBER_NAME_MAX = 40;
3
4
  export declare const MEMBER_PLAYBOOK_MAX = 8000;
4
5
  export declare const MEMBER_FACE_MAX = 80000;
@@ -15,10 +16,17 @@ export type MemberInject = "subagent" | "minimal";
15
16
  export interface MemberAppearance {
16
17
  readonly shape: MemberShape;
17
18
  readonly color: MemberColor;
18
- /** Optional overlay kit (`none` omitted). Face sticker is separate. */
19
+ /** Optional overlay kit (`none` omitted). PNG overlays are separate. */
19
20
  readonly kit?: Exclude<MemberKit, "none">;
20
- /** Optional `data:image/...;base64,...` face sticker. */
21
+ /** @deprecated Use `overlayHat`. Still read as the hat layer. */
21
22
  readonly face?: string;
23
+ readonly overlayHat?: string;
24
+ readonly overlayGlasses?: string;
25
+ readonly overlayHeld?: string;
26
+ /** Slot pick: builtin id or `sticker:<id>`. */
27
+ readonly kitHat?: string;
28
+ readonly kitGlasses?: string;
29
+ readonly kitHeld?: string;
22
30
  }
23
31
  export interface MemberToolPolicy {
24
32
  readonly mode: "allow" | "deny";
@@ -39,12 +47,39 @@ export interface AgentRosterMember {
39
47
  }
40
48
  export type ListedRosterMember = AgentRosterMember & {
41
49
  readonly scope: RosterScope;
50
+ /** Catalog example id (`mem_seed_*`), even after the user edits and `seed` drops. */
51
+ readonly catalog?: true;
42
52
  };
53
+ export declare function isCatalogSeedMemberId(id: string): boolean;
54
+ /** Built-in catalog ids cannot be updated or deleted; mint a new id to fork. */
55
+ export declare function catalogMemberWriteProblem(raw: unknown): string | undefined;
56
+ /**
57
+ * `mem_`-prefixed id, or `undefined` when none was given (caller mints one).
58
+ * A natural id (`xrk-releaseer`) gets the prefix rather than being dropped;
59
+ * what still cannot match is the caller's bug — ask {@link memberIdProblem}
60
+ * instead of silently handing back a different id.
61
+ */
62
+ export declare function normalizeMemberId(raw: unknown): string | undefined;
63
+ /** Non-empty when a supplied id can never be valid — surface it, don't blame name/playbook. */
64
+ export declare function memberIdProblem(raw: unknown): string | undefined;
43
65
  /** Default allow-list for a file-only 干员 (release / inspect). */
44
66
  export declare const MEMBER_FILE_TOOLS: readonly ["bash", "read", "grep", "glob"];
45
67
  export declare function parseRosterScope(raw: unknown): RosterScope;
46
68
  export declare function rosterRoot(productHome?: string): string;
69
+ /** Transparent PNG/JPEG/WebP/GIF data URL used as a kit overlay (hat / glasses / held). */
70
+ export declare function parseOverlayImage(raw: unknown): string | undefined;
47
71
  export declare function parseMemberAppearance(raw: unknown, fallback: MemberAppearance): MemberAppearance;
72
+ export declare function appearanceLookWire(look: MemberAppearance, stickers?: readonly PresenceSticker[]): {
73
+ readonly shape: string;
74
+ readonly color: string;
75
+ readonly kit?: string;
76
+ readonly kitHat?: string;
77
+ readonly kitGlasses?: string;
78
+ readonly kitHeld?: string;
79
+ readonly overlayHat?: string;
80
+ readonly overlayGlasses?: string;
81
+ readonly overlayHeld?: string;
82
+ };
48
83
  export declare function parseMemberToolPolicy(raw: unknown): MemberToolPolicy | undefined;
49
84
  export declare function parseMemberInject(raw: unknown, fallback: MemberInject): MemberInject;
50
85
  /** Deny-only: a 干员 may weaken the parent preset, never add tools. */
@@ -63,6 +98,7 @@ export declare function rosterPublicFields(row: ListedRosterMember): {
63
98
  brief: string;
64
99
  inject: MemberInject;
65
100
  seed: boolean;
101
+ catalog: boolean;
66
102
  appearance: MemberAppearance;
67
103
  };
68
104
  export declare function formatRosterCatalog(members: readonly ListedRosterMember[]): string;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-roster-store.d.ts","sourceRoot":"","sources":["../src/agent-roster-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-roster-store.d.ts","sourceRoot":"","sources":["../src/agent-roster-store.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ import path from "node:path";
10
10
  import { resolveXrkHome } from "@xrkseek/server-config";
11
11
  import { isAgentTeamSpawnRole, roleDeniedTools, } from "./agent-team-roles.js";
12
12
  import { tryWriteJsonSidecar } from "./json-sidecar.js";
13
+ import { GLASSES_BUILTINS, HAT_BUILTINS, HELD_BUILTINS, parseSlotPick, resolveEnginePick, resolveStickerOverlay, splitLegacyKit, stickerIdFromPick, } from "./presence-dressing.js";
13
14
  export const MEMBER_NAME_MAX = 40;
14
15
  export const MEMBER_PLAYBOOK_MAX = 8_000;
15
16
  export const MEMBER_FACE_MAX = 80_000;
@@ -65,8 +66,60 @@ export const MEMBER_KITS = [
65
66
  "specs-sun",
66
67
  "halo",
67
68
  ];
69
+ const CATALOG_SEED_MEMBER_IDS = new Set([
70
+ "mem_seed_researcher",
71
+ "mem_seed_worker",
72
+ "mem_seed_reviewer",
73
+ "mem_seed_lead",
74
+ "mem_seed_scout",
75
+ "mem_seed_docs",
76
+ "mem_seed_fixer",
77
+ "mem_seed_tester",
78
+ ]);
79
+ export function isCatalogSeedMemberId(id) {
80
+ return CATALOG_SEED_MEMBER_IDS.has(id);
81
+ }
82
+ /** Built-in catalog ids cannot be updated or deleted; mint a new id to fork. */
83
+ export function catalogMemberWriteProblem(raw) {
84
+ const trimmed = typeof raw === "string" ? raw.trim() : "";
85
+ if (!trimmed)
86
+ return undefined;
87
+ const id = normalizeMemberId(trimmed);
88
+ if (!id || !isCatalogSeedMemberId(id))
89
+ return undefined;
90
+ return `catalog member ${id} is built-in; omit id to mint a new role from that template`;
91
+ }
92
+ function listedMember(row, scope) {
93
+ return {
94
+ ...row,
95
+ scope,
96
+ ...(isCatalogSeedMemberId(row.id) ? { catalog: true } : {}),
97
+ };
98
+ }
68
99
  const ID_RE = /^mem_[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/;
69
100
  const TOOL_NAME_RE = /^[a-zA-Z][a-zA-Z0-9._-]{0,63}$/;
101
+ /**
102
+ * `mem_`-prefixed id, or `undefined` when none was given (caller mints one).
103
+ * A natural id (`xrk-releaseer`) gets the prefix rather than being dropped;
104
+ * what still cannot match is the caller's bug — ask {@link memberIdProblem}
105
+ * instead of silently handing back a different id.
106
+ */
107
+ export function normalizeMemberId(raw) {
108
+ const trimmed = typeof raw === "string" ? raw.trim() : "";
109
+ if (!trimmed)
110
+ return undefined;
111
+ if (ID_RE.test(trimmed))
112
+ return trimmed;
113
+ const prefixed = `mem_${trimmed}`;
114
+ return ID_RE.test(prefixed) ? prefixed : undefined;
115
+ }
116
+ /** Non-empty when a supplied id can never be valid — surface it, don't blame name/playbook. */
117
+ export function memberIdProblem(raw) {
118
+ const trimmed = typeof raw === "string" ? raw.trim() : "";
119
+ if (!trimmed || normalizeMemberId(trimmed))
120
+ return undefined;
121
+ return `invalid id "${trimmed}": expected mem_ then [A-Za-z0-9][A-Za-z0-9._-]* (max 64 chars); omit id to mint one`;
122
+ }
70
123
  /** Default allow-list for a file-only 干员 (release / inspect). */
71
124
  export const MEMBER_FILE_TOOLS = ["bash", "read", "grep", "glob"];
72
125
  export function parseRosterScope(raw) {
@@ -100,7 +153,8 @@ function isMemberColor(value) {
100
153
  function isMemberKit(value) {
101
154
  return MEMBER_KITS.includes(value);
102
155
  }
103
- function parseFace(raw) {
156
+ /** Transparent PNG/JPEG/WebP/GIF data URL used as a kit overlay (hat / glasses / held). */
157
+ export function parseOverlayImage(raw) {
104
158
  if (typeof raw !== "string")
105
159
  return undefined;
106
160
  const face = raw.trim();
@@ -111,6 +165,12 @@ function parseFace(raw) {
111
165
  }
112
166
  return face.replace(/\s+/g, "");
113
167
  }
168
+ function pickOverlay(base, key, fallback) {
169
+ if (Object.prototype.hasOwnProperty.call(base, key)) {
170
+ return parseOverlayImage(base[key]);
171
+ }
172
+ return fallback;
173
+ }
114
174
  export function parseMemberAppearance(raw, fallback) {
115
175
  const base = raw && typeof raw === "object" && !Array.isArray(raw)
116
176
  ? raw
@@ -121,14 +181,59 @@ export function parseMemberAppearance(raw, fallback) {
121
181
  ? base.kit
122
182
  : fallback.kit;
123
183
  const kit = isMemberKit(kitRaw) && kitRaw !== "none" ? kitRaw : undefined;
124
- const face = Object.prototype.hasOwnProperty.call(base, "face")
125
- ? parseFace(base.face)
126
- : fallback.face;
184
+ const overlayHat = pickOverlay(base, "overlayHat", fallback.overlayHat)
185
+ ?? (Object.prototype.hasOwnProperty.call(base, "face")
186
+ ? parseOverlayImage(base.face)
187
+ : fallback.face);
188
+ const overlayGlasses = pickOverlay(base, "overlayGlasses", fallback.overlayGlasses);
189
+ const overlayHeld = pickOverlay(base, "overlayHeld", fallback.overlayHeld);
190
+ const split = splitLegacyKit(kit);
191
+ const kitHat = parseSlotPick(base.kitHat ?? fallback.kitHat, HAT_BUILTINS)
192
+ ?? (split.hat !== "none" ? split.hat : undefined);
193
+ const kitGlasses = parseSlotPick(base.kitGlasses ?? fallback.kitGlasses, GLASSES_BUILTINS)
194
+ ?? (split.glasses !== "none" ? split.glasses : undefined);
195
+ const kitHeld = parseSlotPick(base.kitHeld ?? fallback.kitHeld, HELD_BUILTINS);
127
196
  return {
128
197
  shape,
129
198
  color,
130
199
  ...(kit ? { kit } : {}),
131
- ...(face ? { face } : {}),
200
+ ...(kitHat && kitHat !== "none" ? { kitHat } : {}),
201
+ ...(kitGlasses && kitGlasses !== "none" ? { kitGlasses } : {}),
202
+ ...(kitHeld && kitHeld !== "none" ? { kitHeld } : {}),
203
+ ...(overlayHat ? { overlayHat, face: overlayHat } : {}),
204
+ ...(overlayGlasses ? { overlayGlasses } : {}),
205
+ ...(overlayHeld ? { overlayHeld } : {}),
206
+ };
207
+ }
208
+ export function appearanceLookWire(look, stickers = []) {
209
+ const split = splitLegacyKit(look.kit);
210
+ const kitHat = look.kitHat ?? split.hat;
211
+ const kitGlasses = look.kitGlasses ?? split.glasses;
212
+ const kitHeld = look.kitHeld ?? "none";
213
+ const hatOverlay = resolveStickerOverlay(kitHat, stickers)
214
+ ?? (stickerIdFromPick(kitHat) ? undefined : look.overlayHat ?? look.face);
215
+ const glassesOverlay = resolveStickerOverlay(kitGlasses, stickers)
216
+ ?? (stickerIdFromPick(kitGlasses) ? undefined : look.overlayGlasses);
217
+ const heldOverlay = resolveStickerOverlay(kitHeld, stickers)
218
+ ?? (stickerIdFromPick(kitHeld) ? undefined : look.overlayHeld);
219
+ const engineHat = resolveEnginePick(kitHat, HAT_BUILTINS);
220
+ const engineGlasses = resolveEnginePick(kitGlasses, GLASSES_BUILTINS);
221
+ const engineHeld = resolveEnginePick(kitHeld, HELD_BUILTINS);
222
+ const kit = engineHat !== "none"
223
+ ? engineHat
224
+ : engineGlasses !== "none"
225
+ ? engineGlasses
226
+ : look.kit;
227
+ return {
228
+ shape: look.shape,
229
+ color: look.color,
230
+ ...(kit ? { kit } : {}),
231
+ ...(engineHat !== "none" ? { kitHat: engineHat } : {}),
232
+ ...(engineGlasses !== "none" ? { kitGlasses: engineGlasses } : {}),
233
+ ...(engineHeld !== "none" ? { kitHeld: engineHeld } : {}),
234
+ ...(hatOverlay ? { overlayHat: hatOverlay } : {}),
235
+ ...(glassesOverlay ? { overlayGlasses: glassesOverlay } : {}),
236
+ ...(heldOverlay ? { overlayHeld: heldOverlay } : {}),
132
237
  };
133
238
  }
134
239
  export function parseMemberToolPolicy(raw) {
@@ -186,6 +291,7 @@ export function rosterPublicFields(row) {
186
291
  brief: row.brief,
187
292
  inject: row.inject,
188
293
  seed: row.seed === true,
294
+ catalog: row.catalog === true,
189
295
  appearance: row.appearance,
190
296
  ...(row.tools ? { tools: row.tools } : {}),
191
297
  };
@@ -201,38 +307,18 @@ export function formatRosterCatalog(members) {
201
307
  : pub.tools?.mode === "deny"
202
308
  ? ` deny=${pub.tools.names.join(",")}`
203
309
  : "";
204
- return `- ${pub.id} [${pub.scope}] ${pub.name} · ${pub.role} · inject=${pub.inject} · ${pub.brief}${tools}`;
310
+ return `- ${pub.id} [${pub.scope}] ${pub.name} · ${pub.role} · inject=${pub.inject} · ${pub.brief}${tools}${pub.catalog ? " · catalog" : ""}`;
205
311
  })
206
312
  .join("\n")
207
313
  .slice(0, 2_400);
208
314
  }
209
- function sameSeedBody(a, b) {
210
- return (a.name === b.name &&
211
- a.role === b.role &&
212
- a.brief === b.brief &&
213
- a.inject === b.inject &&
214
- a.playbook === b.playbook &&
215
- JSON.stringify(a.appearance) === JSON.stringify(b.appearance) &&
216
- JSON.stringify(a.tools ?? null) === JSON.stringify(b.tools ?? null));
217
- }
218
315
  export function mergeGlobalSeedMembers(existing, now = Date.now()) {
219
316
  const catalog = seedGlobalRosterMembers(now);
220
317
  const leftover = new Map(existing.map((row) => [row.id, row]));
221
318
  const members = [];
222
319
  for (const seed of catalog) {
223
- const prev = leftover.get(seed.id);
224
320
  leftover.delete(seed.id);
225
- if (!prev) {
226
- members.push(seed);
227
- continue;
228
- }
229
- if (prev.seed === true) {
230
- const next = { ...seed, updatedAt: prev.updatedAt };
231
- members.push(sameSeedBody(prev, next) ? prev : next);
232
- }
233
- else {
234
- members.push(prev);
235
- }
321
+ members.push(seed);
236
322
  }
237
323
  for (const rest of leftover.values()) {
238
324
  if (rest.seed === true)
@@ -293,7 +379,53 @@ export function seedGlobalRosterMembers(now = Date.now()) {
293
379
  brief: "拆任务、协调干员。",
294
380
  playbook: "You are the workspace lead. Break work into clear sub-tasks, coordinate teammates, " +
295
381
  "and keep a short status of blockers and next steps. " +
296
- "When a specialist fits, spawn with subagent member_id from team_list rather than restating tools or playbook.",
382
+ "When a specialist fits, spawn with subagent member_id from the live catalog rather than restating tools or playbook.",
383
+ },
384
+ {
385
+ id: "mem_seed_scout",
386
+ name: "探网员",
387
+ role: "researcher",
388
+ appearance: { shape: "wedge", color: "peach" },
389
+ seed: true,
390
+ updatedAt: now,
391
+ inject: "minimal",
392
+ brief: "查网上公开事实,给出链接与日期。",
393
+ playbook: "You are the web scout. Use web_search and web_fetch for public facts. " +
394
+ "Cite URLs and dates. Do not edit the repo. Prefer primary sources over commentary.",
395
+ },
396
+ {
397
+ id: "mem_seed_docs",
398
+ name: "文书员",
399
+ role: "worker",
400
+ appearance: { shape: "squircle", color: "butter" },
401
+ seed: true,
402
+ updatedAt: now,
403
+ inject: "minimal",
404
+ brief: "写诚实说明书与发行说明,不编未做能力。",
405
+ playbook: "You are the docs writer. Revise textbook docs in this repo. Follow docs/audiences.md. " +
406
+ "Do not invent APIs. Match existing tone. Use standing skills when they apply; do not paste them.",
407
+ },
408
+ {
409
+ id: "mem_seed_fixer",
410
+ name: "排障员",
411
+ role: "worker",
412
+ appearance: { shape: "gem", color: "coral" },
413
+ seed: true,
414
+ updatedAt: now,
415
+ inject: "minimal",
416
+ brief: "复现故障、定位、修,并给出证据。",
417
+ playbook: "You are the debugger. Reproduce, isolate, then fix. Show failing evidence before the change. Stay in the given scope.",
418
+ },
419
+ {
420
+ id: "mem_seed_tester",
421
+ name: "测员",
422
+ role: "worker",
423
+ appearance: { shape: "pill", color: "sage" },
424
+ seed: true,
425
+ updatedAt: now,
426
+ inject: "minimal",
427
+ brief: "跑相关测试,报告失败与最小复现。",
428
+ playbook: "You are the tester. Run the relevant tests. Report failures with the command and output. Do not skip failing tests.",
297
429
  },
298
430
  ];
299
431
  }
@@ -375,8 +507,11 @@ export class FaceAgentRosterStore {
375
507
  this.save(workspaceId, doc);
376
508
  return doc;
377
509
  }
378
- const doc = { version: 1, members };
510
+ const kept = members.filter((row) => !isCatalogSeedMemberId(row.id));
511
+ const doc = { version: 1, members: kept };
379
512
  this.cache.set(workspaceId, doc);
513
+ if (kept.length !== members.length)
514
+ this.save(workspaceId, doc);
380
515
  return doc;
381
516
  }
382
517
  catch {
@@ -398,21 +533,22 @@ export class FaceAgentRosterStore {
398
533
  listVisible(workspaceId) {
399
534
  const byId = new Map();
400
535
  for (const row of this.list(GLOBAL_ROSTER_ID)) {
401
- byId.set(row.id, { ...row, scope: "global" });
536
+ byId.set(row.id, listedMember(row, "global"));
402
537
  }
403
538
  if (workspaceId !== GLOBAL_ROSTER_ID) {
404
539
  for (const row of this.list(workspaceId)) {
405
- byId.set(row.id, { ...row, scope: "workspace" });
540
+ byId.set(row.id, listedMember(row, "workspace"));
406
541
  }
407
542
  }
408
543
  return [...byId.values()];
409
544
  }
410
545
  get(workspaceId, memberId) {
411
546
  const local = this.list(workspaceId).find((row) => row.id === memberId);
412
- if (local)
413
- return { ...local, scope: workspaceId === GLOBAL_ROSTER_ID ? "global" : "workspace" };
547
+ if (local) {
548
+ return listedMember(local, workspaceId === GLOBAL_ROSTER_ID ? "global" : "workspace");
549
+ }
414
550
  const global = this.list(GLOBAL_ROSTER_ID).find((row) => row.id === memberId);
415
- return global ? { ...global, scope: "global" } : undefined;
551
+ return global ? listedMember(global, "global") : undefined;
416
552
  }
417
553
  upsert(workspaceId, input) {
418
554
  const name = clip(input.name, MEMBER_NAME_MAX);
@@ -422,13 +558,16 @@ export class FaceAgentRosterStore {
422
558
  const role = input.role ?? "default";
423
559
  const doc = this.load(workspaceId);
424
560
  const now = Date.now();
425
- const id = input.id?.trim();
561
+ const rawId = input.id?.trim() ?? "";
562
+ const id = normalizeMemberId(rawId);
426
563
  const fallback = { shape: "blob", color: "cream" };
427
564
  const inject = parseMemberInject(input.inject, "minimal");
428
565
  const tools = input.tools === null ? undefined : parseMemberToolPolicy(input.tools);
566
+ if (rawId && !id)
567
+ return undefined; // illegal id — callers ask memberIdProblem() first
568
+ if (id && isCatalogSeedMemberId(id))
569
+ return undefined;
429
570
  if (id) {
430
- if (!ID_RE.test(id))
431
- return undefined;
432
571
  const index = doc.members.findIndex((row) => row.id === id);
433
572
  const prev = index === -1 ? undefined : doc.members[index];
434
573
  const appearance = parseMemberAppearance({
@@ -484,6 +623,8 @@ export class FaceAgentRosterStore {
484
623
  return member;
485
624
  }
486
625
  remove(workspaceId, memberId) {
626
+ if (isCatalogSeedMemberId(memberId))
627
+ return false;
487
628
  const doc = this.load(workspaceId);
488
629
  const members = doc.members.filter((row) => row.id !== memberId);
489
630
  if (members.length === doc.members.length)