@xrkseek/harness 0.6.2 → 0.6.4

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 (137) hide show
  1. package/node_modules/@xrkseek/core-agent/dist/index.d.ts +2 -2
  2. package/node_modules/@xrkseek/core-agent/dist/index.d.ts.map +1 -1
  3. package/node_modules/@xrkseek/core-agent/dist/index.js +3 -1
  4. package/node_modules/@xrkseek/core-agent/dist/index.js.map +1 -1
  5. package/node_modules/@xrkseek/core-agent-loop/dist/compaction.d.ts +9 -3
  6. package/node_modules/@xrkseek/core-agent-loop/dist/compaction.d.ts.map +1 -1
  7. package/node_modules/@xrkseek/core-agent-loop/dist/compaction.js +36 -3
  8. package/node_modules/@xrkseek/core-agent-loop/dist/compaction.js.map +1 -1
  9. package/node_modules/@xrkseek/core-agent-loop/dist/index.d.ts +5 -5
  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 +123 -36
  12. package/node_modules/@xrkseek/core-agent-loop/dist/index.js.map +1 -1
  13. package/node_modules/@xrkseek/core-session/dist/compaction.d.ts +30 -0
  14. package/node_modules/@xrkseek/core-session/dist/compaction.d.ts.map +1 -1
  15. package/node_modules/@xrkseek/core-session/dist/compaction.js +15 -0
  16. package/node_modules/@xrkseek/core-session/dist/compaction.js.map +1 -1
  17. package/node_modules/@xrkseek/core-session/dist/index.d.ts +1 -1
  18. package/node_modules/@xrkseek/core-session/dist/index.d.ts.map +1 -1
  19. package/node_modules/@xrkseek/core-session/dist/index.js +1 -1
  20. package/node_modules/@xrkseek/core-session/dist/index.js.map +1 -1
  21. package/node_modules/@xrkseek/core-session/dist/search-text.d.ts.map +1 -1
  22. package/node_modules/@xrkseek/core-session/dist/search-text.js +6 -0
  23. package/node_modules/@xrkseek/core-session/dist/search-text.js.map +1 -1
  24. package/node_modules/@xrkseek/core-session/dist/sqlite-store.d.ts +5 -2
  25. package/node_modules/@xrkseek/core-session/dist/sqlite-store.d.ts.map +1 -1
  26. package/node_modules/@xrkseek/core-session/dist/sqlite-store.js +155 -29
  27. package/node_modules/@xrkseek/core-session/dist/sqlite-store.js.map +1 -1
  28. package/node_modules/@xrkseek/core-tools/dist/tool-exposure.d.ts +6 -2
  29. package/node_modules/@xrkseek/core-tools/dist/tool-exposure.d.ts.map +1 -1
  30. package/node_modules/@xrkseek/core-tools/dist/tool-exposure.js +10 -3
  31. package/node_modules/@xrkseek/core-tools/dist/tool-exposure.js.map +1 -1
  32. package/node_modules/@xrkseek/llm/dist/failure.js +1 -1
  33. package/node_modules/@xrkseek/llm/dist/retry-policy.d.ts.map +1 -1
  34. package/node_modules/@xrkseek/llm/dist/retry-policy.js +2 -1
  35. package/node_modules/@xrkseek/llm/dist/retry-policy.js.map +1 -1
  36. package/node_modules/@xrkseek/llm-openai-compatible/dist/index.d.ts.map +1 -1
  37. package/node_modules/@xrkseek/llm-openai-compatible/dist/index.js +33 -1
  38. package/node_modules/@xrkseek/llm-openai-compatible/dist/index.js.map +1 -1
  39. package/node_modules/@xrkseek/llm-registry/dist/discover.d.ts +11 -0
  40. package/node_modules/@xrkseek/llm-registry/dist/discover.d.ts.map +1 -1
  41. package/node_modules/@xrkseek/llm-registry/dist/discover.js +61 -0
  42. package/node_modules/@xrkseek/llm-registry/dist/discover.js.map +1 -1
  43. package/node_modules/@xrkseek/llm-registry/dist/index.d.ts +1 -1
  44. package/node_modules/@xrkseek/llm-registry/dist/index.d.ts.map +1 -1
  45. package/node_modules/@xrkseek/llm-registry/dist/index.js.map +1 -1
  46. package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts.map +1 -1
  47. package/node_modules/@xrkseek/preset-harness/dist/preset.js +27 -13
  48. package/node_modules/@xrkseek/preset-harness/dist/preset.js.map +1 -1
  49. package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
  50. package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
  51. package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
  52. package/node_modules/@xrkseek/protocol/dist/session-events.d.ts +3 -3
  53. package/node_modules/@xrkseek/server-face/dist/adapt/index.d.ts +1 -1
  54. package/node_modules/@xrkseek/server-face/dist/adapt/index.d.ts.map +1 -1
  55. package/node_modules/@xrkseek/server-face/dist/adapt/index.js +1 -1
  56. package/node_modules/@xrkseek/server-face/dist/adapt/index.js.map +1 -1
  57. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.d.ts +15 -1
  58. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.d.ts.map +1 -1
  59. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js +108 -8
  60. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js.map +1 -1
  61. package/node_modules/@xrkseek/server-face/dist/community-llm-sync.d.ts +5 -1
  62. package/node_modules/@xrkseek/server-face/dist/community-llm-sync.d.ts.map +1 -1
  63. package/node_modules/@xrkseek/server-face/dist/community-llm-sync.js +8 -4
  64. package/node_modules/@xrkseek/server-face/dist/community-llm-sync.js.map +1 -1
  65. package/node_modules/@xrkseek/server-face/dist/context.d.ts +5 -0
  66. package/node_modules/@xrkseek/server-face/dist/context.d.ts.map +1 -1
  67. package/node_modules/@xrkseek/server-face/dist/handlers/catalog.d.ts.map +1 -1
  68. package/node_modules/@xrkseek/server-face/dist/handlers/catalog.js +9 -1
  69. package/node_modules/@xrkseek/server-face/dist/handlers/catalog.js.map +1 -1
  70. package/node_modules/@xrkseek/server-face/dist/handlers/session.d.ts.map +1 -1
  71. package/node_modules/@xrkseek/server-face/dist/handlers/session.js +69 -19
  72. package/node_modules/@xrkseek/server-face/dist/handlers/session.js.map +1 -1
  73. package/node_modules/@xrkseek/server-face/dist/handlers/subagent.d.ts.map +1 -1
  74. package/node_modules/@xrkseek/server-face/dist/handlers/subagent.js +7 -1
  75. package/node_modules/@xrkseek/server-face/dist/handlers/subagent.js.map +1 -1
  76. package/node_modules/@xrkseek/server-face/dist/index.d.ts +2 -1
  77. package/node_modules/@xrkseek/server-face/dist/index.d.ts.map +1 -1
  78. package/node_modules/@xrkseek/server-face/dist/index.js +2 -1
  79. package/node_modules/@xrkseek/server-face/dist/index.js.map +1 -1
  80. package/node_modules/@xrkseek/server-face/dist/model-catalog.d.ts.map +1 -1
  81. package/node_modules/@xrkseek/server-face/dist/model-catalog.js +2 -1
  82. package/node_modules/@xrkseek/server-face/dist/model-catalog.js.map +1 -1
  83. package/node_modules/@xrkseek/server-face/dist/peer-session-wait.d.ts.map +1 -1
  84. package/node_modules/@xrkseek/server-face/dist/peer-session-wait.js +16 -9
  85. package/node_modules/@xrkseek/server-face/dist/peer-session-wait.js.map +1 -1
  86. package/node_modules/@xrkseek/server-face/dist/ralph-tool.d.ts.map +1 -1
  87. package/node_modules/@xrkseek/server-face/dist/ralph-tool.js +19 -20
  88. package/node_modules/@xrkseek/server-face/dist/ralph-tool.js.map +1 -1
  89. package/node_modules/@xrkseek/server-face/dist/runtime.d.ts.map +1 -1
  90. package/node_modules/@xrkseek/server-face/dist/runtime.js +54 -10
  91. package/node_modules/@xrkseek/server-face/dist/runtime.js.map +1 -1
  92. package/node_modules/@xrkseek/server-face/dist/select-session-model.d.ts.map +1 -1
  93. package/node_modules/@xrkseek/server-face/dist/select-session-model.js +33 -1
  94. package/node_modules/@xrkseek/server-face/dist/select-session-model.js.map +1 -1
  95. package/node_modules/@xrkseek/server-face/dist/session-thread-message.d.ts +5 -0
  96. package/node_modules/@xrkseek/server-face/dist/session-thread-message.d.ts.map +1 -1
  97. package/node_modules/@xrkseek/server-face/dist/session-thread-message.js +8 -0
  98. package/node_modules/@xrkseek/server-face/dist/session-thread-message.js.map +1 -1
  99. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.d.ts.map +1 -1
  100. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js +4 -1
  101. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js.map +1 -1
  102. package/node_modules/@xrkseek/server-face/dist/settings-schemas.d.ts.map +1 -1
  103. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js +32 -5
  104. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
  105. package/node_modules/@xrkseek/server-face/dist/subagent-registry.d.ts +7 -0
  106. package/node_modules/@xrkseek/server-face/dist/subagent-registry.d.ts.map +1 -1
  107. package/node_modules/@xrkseek/server-face/dist/subagent-registry.js +21 -5
  108. package/node_modules/@xrkseek/server-face/dist/subagent-registry.js.map +1 -1
  109. package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts.map +1 -1
  110. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js +79 -149
  111. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js.map +1 -1
  112. package/node_modules/@xrkseek/server-face/dist/wait-drain-idle.d.ts +32 -0
  113. package/node_modules/@xrkseek/server-face/dist/wait-drain-idle.d.ts.map +1 -0
  114. package/node_modules/@xrkseek/server-face/dist/wait-drain-idle.js +138 -0
  115. package/node_modules/@xrkseek/server-face/dist/wait-drain-idle.js.map +1 -0
  116. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.d.ts.map +1 -1
  117. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.js +2 -1
  118. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.js.map +1 -1
  119. package/node_modules/@xrkseek/server-host/dist/agent-cache.d.ts +28 -4
  120. package/node_modules/@xrkseek/server-host/dist/agent-cache.d.ts.map +1 -1
  121. package/node_modules/@xrkseek/server-host/dist/agent-cache.js +66 -16
  122. package/node_modules/@xrkseek/server-host/dist/agent-cache.js.map +1 -1
  123. package/node_modules/@xrkseek/server-host/dist/index.d.ts +1 -1
  124. package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
  125. package/node_modules/@xrkseek/server-host/dist/index.js +112 -22
  126. package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
  127. package/node_modules/@xrkseek/server-host/dist/workflow-engine-mount.d.ts.map +1 -1
  128. package/node_modules/@xrkseek/server-host/dist/workflow-engine-mount.js +16 -21
  129. package/node_modules/@xrkseek/server-host/dist/workflow-engine-mount.js.map +1 -1
  130. package/node_modules/@xrkseek/server-http/dist/dsh-compat/community-llm-host-sync.d.ts.map +1 -1
  131. package/node_modules/@xrkseek/server-http/dist/dsh-compat/community-llm-host-sync.js +49 -11
  132. package/node_modules/@xrkseek/server-http/dist/dsh-compat/community-llm-host-sync.js.map +1 -1
  133. package/node_modules/@xrkseek/session-projection/dist/index.d.ts +7 -0
  134. package/node_modules/@xrkseek/session-projection/dist/index.d.ts.map +1 -1
  135. package/node_modules/@xrkseek/session-projection/dist/index.js +16 -0
  136. package/node_modules/@xrkseek/session-projection/dist/index.js.map +1 -1
  137. package/package.json +1 -1
@@ -21,7 +21,7 @@ import { createPluginLoader, composeHostPolicyEngine, wireCompositionChannels, w
21
21
  import { existsSync } from "node:fs";
22
22
  import { access } from "node:fs/promises";
23
23
  import path from "node:path";
24
- import { createHostAgentCache } from "./agent-cache.js";
24
+ import { createHostAgentCache, deferBusyAgentInvalidate } from "./agent-cache.js";
25
25
  import { createHostCron } from "@xrkseek/server-cron";
26
26
  import { AsyncLocalStorage } from "node:async_hooks";
27
27
  import { wireDrainStatus, publishDrainIdle } from "./drain-status.js";
@@ -48,7 +48,7 @@ import { resolveExecEnvironment, } from "@xrkseek/exec-environment";
48
48
  import { createSshExecutionWorldReady, resolveSshConfig, } from "@xrkseek/exec-ssh";
49
49
  /** True while an unattended cron agent turn is running — skip cron tools to avoid recursion. */
50
50
  const cronAgentDepth = new AsyncLocalStorage();
51
- export { createHostAgentCache, HOST_PLUGINS_KEY } from "./agent-cache.js";
51
+ export { createHostAgentCache, deferBusyAgentInvalidate, HOST_PLUGINS_KEY } from "./agent-cache.js";
52
52
  export { createStandingToolRegistry } from "./standing-tools.js";
53
53
  export { a2aInboundSessionId, createA2aInboundPublicHandler, resolveA2aInboundEnabled, } from "./a2a-inbound-public.js";
54
54
  import { createImFaceAdmitHook } from "./im-face-admit.js";
@@ -457,11 +457,21 @@ export function createHostManager() {
457
457
  invalidateAgents = async () => {
458
458
  await agentCache.invalidateAll({
459
459
  skip: (sessionId) => {
460
- if (!drainActiveBox.isActive(sessionId))
460
+ // Drain-active: mid-turn on the Hub bookkeeping path.
461
+ // isBusy: subagent / edge cases where latch is live but drain
462
+ // was not marked — disposing those was painting disposed 「已停止」.
463
+ if (!drainActiveBox.isActive(sessionId) &&
464
+ !agentCache.isBusy(sessionId)) {
461
465
  return false;
466
+ }
462
467
  pendingAgentInvalidate.add(sessionId);
463
468
  return true;
464
469
  },
470
+ // Idle parent of a busy nested worker: hold until the child drains,
471
+ // else parent.dispose cascades and paints the worker 「已停止」.
472
+ onHold: (sessionId) => {
473
+ pendingAgentInvalidate.add(sessionId);
474
+ },
465
475
  });
466
476
  await mcpDeferred.flush();
467
477
  };
@@ -796,15 +806,29 @@ export function createHostManager() {
796
806
  }
797
807
  return pathAccessModeFromSandbox(effectiveSandboxMode(readSessionEvents(store, sessionId)));
798
808
  },
799
- readSessionPathAllowlist: () => faceBox.runtime?.pathAllowlist.list(sessionId) ?? [],
809
+ readSessionPathAllowlist: () => {
810
+ const rt = faceBox.runtime;
811
+ if (!rt)
812
+ return [];
813
+ // Resident eviction forgets the in-memory map; cron/IM/drain
814
+ // turns may never call session.history — refill from the log.
815
+ rt.pathAllowlist.hydrate(rt.store, sessionId);
816
+ return rt.pathAllowlist.list(sessionId);
817
+ },
800
818
  clearSessionPathOnce: () => {
801
819
  faceBox.runtime?.pathAllowlist.clearOnce(sessionId);
802
820
  },
803
- ...(faceBox.runtime
804
- ? {
805
- toolSearchState: faceBox.runtime.toolDisclosure.stateFor(sessionId),
806
- }
807
- : {}),
821
+ // Always register tool_search — even while Face is still booting.
822
+ // Omitting toolSearchState used to dump every deferred MCP schema
823
+ // onto the wire (~100k+ tokens). Live getters attach to Face
824
+ // disclosure once runtime is assigned.
825
+ toolSearchState: {
826
+ listExpanded: () => faceBox.runtime?.toolDisclosure.listExpanded(sessionId) ??
827
+ new Set(),
828
+ expand: (names) => {
829
+ faceBox.runtime?.toolDisclosure.expand(sessionId, names);
830
+ },
831
+ },
808
832
  routeAllowsImage: () => faceForModality.current
809
833
  ? liveRouteAllowsImageInput(faceForModality.current, sessionId)
810
834
  : false,
@@ -1247,14 +1271,36 @@ export function createHostManager() {
1247
1271
  if (!running &&
1248
1272
  "flush" in store &&
1249
1273
  typeof store.flush === "function") {
1250
- store.flush();
1251
- }
1252
- if (!running && pendingAgentInvalidate.has(sid)) {
1253
- pendingAgentInvalidate.delete(sid);
1254
- void agentCache.invalidate(sid).then(() => mcpDeferred.flush());
1274
+ store.flush(sid);
1255
1275
  }
1256
- else if (!running) {
1257
- void mcpDeferred.flush();
1276
+ if (!running) {
1277
+ // Invalidate this session if it was deferred mid-turn, then flush
1278
+ // other pending ids that are idle (incl. parents held only to
1279
+ // protect a nested busy child — see agent-cache onHold).
1280
+ if (pendingAgentInvalidate.has(sid)) {
1281
+ pendingAgentInvalidate.delete(sid);
1282
+ void agentCache.invalidate(sid).then(() => mcpDeferred.flush());
1283
+ }
1284
+ for (const pending of [...pendingAgentInvalidate]) {
1285
+ if (pending === sid)
1286
+ continue;
1287
+ if (drainActiveBox.isActive(pending) ||
1288
+ agentCache.isBusy(pending)) {
1289
+ continue;
1290
+ }
1291
+ // Idle parent held only for a nested worker: wait until that
1292
+ // child is no longer protected, else parent.dispose cascades.
1293
+ if (agentCache.hasProtectedNestedChild(pending, (id) => pendingAgentInvalidate.has(id) ||
1294
+ drainActiveBox.isActive(id) ||
1295
+ agentCache.isBusy(id))) {
1296
+ continue;
1297
+ }
1298
+ pendingAgentInvalidate.delete(pending);
1299
+ void agentCache.invalidate(pending);
1300
+ }
1301
+ if (!pendingAgentInvalidate.has(sid)) {
1302
+ void mcpDeferred.flush();
1303
+ }
1258
1304
  }
1259
1305
  hostStatusBox.publish?.(sid, running);
1260
1306
  });
@@ -1577,7 +1623,15 @@ export function createHostManager() {
1577
1623
  ...(config.runtime.policyFile
1578
1624
  ? { settingsDocumentPath: path.resolve(config.runtime.policyFile) }
1579
1625
  : {}),
1580
- invalidateAgent: (sessionId) => agentCache.invalidate(sessionId),
1626
+ invalidateAgent: (sessionId) => deferBusyAgentInvalidate({
1627
+ sessionId,
1628
+ drainActive: drainActiveBox.isActive(sessionId),
1629
+ busy: agentCache.isBusy(sessionId),
1630
+ defer: (id) => {
1631
+ pendingAgentInvalidate.add(id);
1632
+ },
1633
+ invalidate: (id) => agentCache.invalidate(id),
1634
+ }),
1581
1635
  onSessionFinalize: (sessionId) => {
1582
1636
  consolidateCuratedMemoryForSession(sessionId);
1583
1637
  sharedBrowser?.drop(sessionId);
@@ -1703,6 +1757,22 @@ export function createHostManager() {
1703
1757
  compactionStrategyRaw === "off"
1704
1758
  ? compactionStrategyRaw
1705
1759
  : undefined;
1760
+ const softBudgetTriggerPercent = typeof loop.softBudgetTriggerPercent === "number" &&
1761
+ Number.isFinite(loop.softBudgetTriggerPercent) &&
1762
+ loop.softBudgetTriggerPercent >= 50 &&
1763
+ loop.softBudgetTriggerPercent <= 100
1764
+ ? Math.floor(loop.softBudgetTriggerPercent)
1765
+ : undefined;
1766
+ const compactRecentMaxTokens = typeof loop.compactRecentMaxTokens === "number" &&
1767
+ Number.isFinite(loop.compactRecentMaxTokens) &&
1768
+ loop.compactRecentMaxTokens >= 2_000
1769
+ ? Math.floor(loop.compactRecentMaxTokens)
1770
+ : undefined;
1771
+ const softBudgetPeelAttempts = typeof loop.softBudgetPeelAttempts === "number" &&
1772
+ Number.isFinite(loop.softBudgetPeelAttempts) &&
1773
+ loop.softBudgetPeelAttempts >= 0
1774
+ ? Math.floor(loop.softBudgetPeelAttempts)
1775
+ : undefined;
1706
1776
  const toolResultMaxInlineBytes = typeof loop.toolResultMaxInlineBytes === "number" &&
1707
1777
  Number.isFinite(loop.toolResultMaxInlineBytes) &&
1708
1778
  loop.toolResultMaxInlineBytes >= 0
@@ -2018,8 +2088,28 @@ export function createHostManager() {
2018
2088
  ...(toolOrder !== undefined ? { toolOrder } : {}),
2019
2089
  ...(toolSettle !== undefined ? { toolSettle } : {}),
2020
2090
  ...(llmRetryMaxRetries !== undefined ? { llmRetryMaxRetries } : {}),
2021
- ...(compactionStrategy !== undefined
2022
- ? { compaction: { strategy: compactionStrategy } }
2091
+ ...(compactionStrategy !== undefined ||
2092
+ softBudgetTriggerPercent !== undefined ||
2093
+ compactRecentMaxTokens !== undefined ||
2094
+ softBudgetPeelAttempts !== undefined
2095
+ ? {
2096
+ compaction: {
2097
+ ...(compactionStrategy !== undefined
2098
+ ? { strategy: compactionStrategy }
2099
+ : {}),
2100
+ ...(softBudgetTriggerPercent !== undefined
2101
+ ? {
2102
+ softBudgetTriggerRatio: softBudgetTriggerPercent / 100,
2103
+ }
2104
+ : {}),
2105
+ ...(compactRecentMaxTokens !== undefined
2106
+ ? { compactRecentMaxTokens }
2107
+ : {}),
2108
+ ...(softBudgetPeelAttempts !== undefined
2109
+ ? { softBudgetPeelAttempts }
2110
+ : {}),
2111
+ },
2112
+ }
2023
2113
  : {}),
2024
2114
  ...(toolResultMaxInlineBytes !== undefined
2025
2115
  ? { toolResultMaxInlineBytes }
@@ -2106,9 +2196,9 @@ export function createHostManager() {
2106
2196
  }
2107
2197
  }
2108
2198
  });
2109
- // Tool-delegated children nest under the parent compose scope. UI/rewind
2110
- // forks (`mode: "fork"`) stay root `agent:{id}` scopes — nesting them
2111
- // under a live parent races dispose while the child's create() awaits.
2199
+ // Summoning session id is for identity / workspace inject only.
2200
+ // Agent scopes stay siblings under the host root so one session's
2201
+ // dispose cannot abort another.
2112
2202
  lineage.parentOf = (sessionId) => {
2113
2203
  const link = faceRuntime.subagents.getByChild(sessionId);
2114
2204
  if (!link || link.mode === "fork")