@lsamien/yaovi 0.1.0 → 0.1.1

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 (57) hide show
  1. package/build-info.json +24 -3
  2. package/dist/assets/{AboutDialog-BW25cB-W.js → AboutDialog-CBKv505Y.js} +2 -2
  3. package/dist/assets/AboutDialog-CBKv505Y.js.map +1 -0
  4. package/dist/assets/{BotAutomationsView-BoK2R918.js → BotAutomationsView-S3aHciek.js} +2 -2
  5. package/dist/assets/{BotAutomationsView-BoK2R918.js.map → BotAutomationsView-S3aHciek.js.map} +1 -1
  6. package/dist/assets/{BotControlSettingsPanel-BbhD2eC0.js → BotControlSettingsPanel-DJF4oA6g.js} +2 -2
  7. package/dist/assets/{BotControlSettingsPanel-BbhD2eC0.js.map → BotControlSettingsPanel-DJF4oA6g.js.map} +1 -1
  8. package/dist/assets/{BotPluginsDialog-DjwFw-lt.js → BotPluginsDialog-BVOQ3DTp.js} +2 -2
  9. package/dist/assets/{BotPluginsDialog-DjwFw-lt.js.map → BotPluginsDialog-BVOQ3DTp.js.map} +1 -1
  10. package/dist/assets/{BotSettingsPanel-DLmnL6pH.js → BotSettingsPanel-CEH3KSAO.js} +3 -3
  11. package/dist/assets/{BotSettingsPanel-DLmnL6pH.js.map → BotSettingsPanel-CEH3KSAO.js.map} +1 -1
  12. package/dist/assets/{ComputerPanel-CRIF1YEd.js → ComputerPanel-CC-xkAxr.js} +2 -2
  13. package/dist/assets/{ComputerPanel-CRIF1YEd.js.map → ComputerPanel-CC-xkAxr.js.map} +1 -1
  14. package/dist/assets/{ComputerViewerView-CizYWH2R.js → ComputerViewerView-CEQrOmy7.js} +2 -2
  15. package/dist/assets/{ComputerViewerView-CizYWH2R.js.map → ComputerViewerView-CEQrOmy7.js.map} +1 -1
  16. package/dist/assets/{ConversationsView-h94_iPtv.css → ConversationsView-B6JNGLt_.css} +1 -1
  17. package/dist/assets/{ConversationsView-1igFR9VY.js → ConversationsView-CzFWn-79.js} +8 -8
  18. package/dist/assets/ConversationsView-CzFWn-79.js.map +1 -0
  19. package/dist/assets/{DevicePairingDialog-orOS4xqu.js → DevicePairingDialog-ByYk05DC.js} +2 -2
  20. package/dist/assets/{DevicePairingDialog-orOS4xqu.js.map → DevicePairingDialog-ByYk05DC.js.map} +1 -1
  21. package/dist/assets/{LocalVmSettingsPanel-DzM--Lpg.js → LocalVmSettingsPanel-DBkqouAU.js} +2 -2
  22. package/dist/assets/{LocalVmSettingsPanel-DzM--Lpg.js.map → LocalVmSettingsPanel-DBkqouAU.js.map} +1 -1
  23. package/dist/assets/{ProviderLoginDialog-Bw5KVMfi.js → ProviderLoginDialog-DdPS62uM.js} +2 -2
  24. package/dist/assets/{ProviderLoginDialog-Bw5KVMfi.js.map → ProviderLoginDialog-DdPS62uM.js.map} +1 -1
  25. package/dist/assets/{RunnerSettingsPanel-B-fwuBEs.js → RunnerSettingsPanel-gzA2xzOg.js} +2 -2
  26. package/dist/assets/{RunnerSettingsPanel-B-fwuBEs.js.map → RunnerSettingsPanel-gzA2xzOg.js.map} +1 -1
  27. package/dist/assets/{StandaloneDialog-7GkhtRlT.js → StandaloneDialog-B9HCNEFb.js} +2 -2
  28. package/dist/assets/{StandaloneDialog-7GkhtRlT.js.map → StandaloneDialog-B9HCNEFb.js.map} +1 -1
  29. package/dist/assets/{UpdateCheckDialog-DYiM4xBv.js → UpdateCheckDialog-djkXTQgD.js} +2 -2
  30. package/dist/assets/{UpdateCheckDialog-DYiM4xBv.js.map → UpdateCheckDialog-djkXTQgD.js.map} +1 -1
  31. package/dist/assets/{UsageView-D1cjS1hy.js → UsageView-DFaWBB40.js} +2 -2
  32. package/dist/assets/{UsageView-D1cjS1hy.js.map → UsageView-DFaWBB40.js.map} +1 -1
  33. package/dist/assets/{WorkspaceKnowledgePanel-DcGdLRS1.js → WorkspaceKnowledgePanel-In2a_s_z.js} +2 -2
  34. package/dist/assets/{WorkspaceKnowledgePanel-DcGdLRS1.js.map → WorkspaceKnowledgePanel-In2a_s_z.js.map} +1 -1
  35. package/dist/assets/{WorkspaceRoutinesPanel-DLntimKs.js → WorkspaceRoutinesPanel-zOxFoqML.js} +2 -2
  36. package/dist/assets/{WorkspaceRoutinesPanel-DLntimKs.js.map → WorkspaceRoutinesPanel-zOxFoqML.js.map} +1 -1
  37. package/dist/assets/{WorkstreamsView-DMoeV8Eu.js → WorkstreamsView-HvlivC3b.js} +2 -2
  38. package/dist/assets/{WorkstreamsView-DMoeV8Eu.js.map → WorkstreamsView-HvlivC3b.js.map} +1 -1
  39. package/dist/assets/{index-D0pMYnOi.js → index-BPE9bBla.js} +3 -3
  40. package/dist/assets/{index-D0pMYnOi.js.map → index-BPE9bBla.js.map} +1 -1
  41. package/dist/assets/{pdf-BCisgslg.js → pdf-Q2a37aK5.js} +2 -2
  42. package/dist/assets/{pdf-BCisgslg.js.map → pdf-Q2a37aK5.js.map} +1 -1
  43. package/dist/index.html +1 -1
  44. package/dist-server/server/botControl.js +12 -0
  45. package/dist-server/server/harness/agentRuntime.js +22 -8
  46. package/dist-server/server/workspaceDialoguePolicy.js +3 -1
  47. package/dist-server/server/workspaceKnowledge.js +25 -16
  48. package/dist-server/server/workspaceMemoryContext.js +75 -19
  49. package/dist-server/server/workspacePrompt.js +9 -2
  50. package/dist-server/server/workspaceRuntime.js +35 -13
  51. package/package.json +2 -2
  52. package/release.json +3 -3
  53. package/runtime/hermes/hermes_state_messages.py +17 -0
  54. package/runtime/worker.py +34 -1
  55. package/dist/assets/AboutDialog-BW25cB-W.js.map +0 -1
  56. package/dist/assets/ConversationsView-1igFR9VY.js.map +0 -1
  57. package/dist-server/server/harness/context.js +0 -88
package/runtime/worker.py CHANGED
@@ -22,6 +22,8 @@ steer_lock = threading.Lock()
22
22
  turn_closed = False
23
23
  steer_ready = False
24
24
  startup_steers = []
25
+ # Prefix of the per-turn application state Yaovi renders (src/server/workspacePrompt.ts).
26
+ TURN_CONTEXT_SENTINEL = "[[YAOVI_TURN_CONTEXT_V1]]"
25
27
 
26
28
 
27
29
  def emit(kind, **payload):
@@ -106,6 +108,26 @@ def read_replies():
106
108
  interrupt()
107
109
 
108
110
 
111
+ def strip_turn_context_sidecars(history):
112
+ """Earlier turns replay their user content only, never the per-turn state sent with them."""
113
+ for message in history:
114
+ sidecar = message.get("api_content")
115
+ if message.get("role") == "user" and isinstance(sidecar, str) and sidecar.startswith(TURN_CONTEXT_SENTINEL):
116
+ message.pop("api_content", None)
117
+ return history
118
+
119
+
120
+ def compose_turn(text, turn_context):
121
+ """``(model-facing message, persisted message)``; state reaches this turn's calls only."""
122
+ if not turn_context:
123
+ return text, None
124
+ if not str(turn_context).startswith(TURN_CONTEXT_SENTINEL):
125
+ raise ValueError("Turn context is missing its sentinel")
126
+ if isinstance(text, list):
127
+ return [{"type": "text", "text": turn_context}, *text], text
128
+ return turn_context + "\n\n" + str(text), text
129
+
130
+
109
131
  def clarify(questions):
110
132
  answers = {}
111
133
  for question in questions:
@@ -224,6 +246,10 @@ def main():
224
246
  pending_calls -= {m.get("tool_call_id") for m in history if m.get("role") == "tool"}
225
247
  for call in pending_calls:
226
248
  history.append({"role":"tool", "tool_call_id":call, "content":json.dumps({"error":"Interrupted before the result was confirmed. Inspect effects before retrying.","outcomeUnknown":True})})
249
+ # A turn that crashed before its cleanup must not leak its state into this one,
250
+ # including rows reloaded from the store after in-turn compaction.
251
+ db.clear_user_api_content_with_prefix(session, TURN_CONTEXT_SENTINEL)
252
+ strip_turn_context_sidecars(history)
227
253
  # Existing sessions retain their admitted tools and context. Only the known
228
254
  # application identity prefix changes, at a turn boundary before model use.
229
255
  row = db.get_session(session)
@@ -287,7 +313,14 @@ def main():
287
313
  if not result:
288
314
  raise RuntimeError("Native skill review did not finish")
289
315
  else:
290
- result = agent.run_conversation(request["text"], conversation_history=history)
316
+ message, persisted = compose_turn(request["text"], request.get("turnContext"))
317
+ try:
318
+ result = agent.run_conversation(message, conversation_history=history,
319
+ **({"persist_user_message": persisted} if persisted is not None else {}))
320
+ finally:
321
+ if persisted is not None:
322
+ for lineage in dict.fromkeys((session, agent.session_id)):
323
+ db.clear_user_api_content_with_prefix(lineage, TURN_CONTEXT_SENTINEL)
291
324
  with steer_lock:
292
325
  turn_closed = True
293
326
  with agent._pending_redirect_lock:
@@ -1 +0,0 @@
1
- {"version":3,"file":"AboutDialog-BW25cB-W.js","names":[],"sources":["../../package.json","../../src/client/components/app/AboutDialog.vue","../../src/client/components/app/AboutDialog.vue"],"sourcesContent":["{\n \"name\": \"@lsamien/yaovi\",\n \"version\": \"0.1.0\",\n \"license\": \"Apache-2.0\",\n \"description\": \"Yaovi:单用户、多 Bot、多设备服务器\",\n \"type\": \"module\",\n \"main\": \"desktop/main.mjs\",\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"bin\": {\n \"yaovi\": \"bin/yaovi-agent.mjs\",\n \"yaovi-agent\": \"bin/yaovi-agent.mjs\"\n },\n \"scripts\": {\n \"dev\": \"cross-env NODE_ENV=development tsx watch src/server/index.ts\",\n \"build\": \"npm run brand:verify && npm run release:verify && vue-tsc -b tsconfig.client.build.json && vite build && node scripts/clean-server.mjs && tsc -p tsconfig.server.json && node scripts/copy-worker.mjs && node scripts/write-build-info.mjs\",\n \"start\": \"node bin/yaovi-agent.mjs start\",\n \"typecheck\": \"vue-tsc -b && tsc --noEmit -p tsconfig.server.json\",\n \"test\": \"vitest run\",\n \"prepack\": \"npm run build\",\n \"test:watch\": \"vitest\",\n \"test:e2e\": \"npm run build && playwright test\",\n \"test:live\": \"cross-env YAOVI_LIVE_TEST=1 vitest run tests/live\",\n \"brand:verify\": \"node scripts/verify-brand.mjs\",\n \"release:verify\": \"node scripts/verify-release.mjs\",\n \"verify:lifecycle\": \"node scripts/verify-lifecycle.mjs\",\n \"test:e2e:workspace\": \"npm run build && playwright test -c playwright.workspace.config.ts\",\n \"test:e2e:desktop-hosts\": \"npm run build && playwright test -c playwright.desktop-hosts.config.ts\",\n \"test:e2e:team-tools\": \"npm run build && playwright test -c playwright.team-tools.config.ts\",\n \"desktop:build\": \"npm run build && node scripts/build-desktop.mjs\",\n \"desktop:build:client\": \"node scripts/write-build-info.mjs && node scripts/build-desktop-client.mjs\",\n \"desktop:dev:client\": \"npm run desktop:build:client && cross-env YAOVI_DESKTOP_CLIENT_ONLY=1 electron .\",\n \"desktop:pack:client\": \"npm run desktop:build:client && electron-builder --config electron-builder.client.yml --mac --arm64 --publish never\",\n \"desktop:dev\": \"npm run desktop:build && cross-env YAOVI_DESKTOP_CLIENT_ONLY=0 electron .\",\n \"desktop:pack\": \"npm run desktop:build && electron-builder --mac --arm64 --publish never\",\n \"desktop:release\": \"npm run desktop:build && node scripts/desktop-release.mjs\",\n \"desktop:test\": \"cross-env YAOVI_DESKTOP_CLIENT_ONLY=0 node --test desktop/*.test.mjs\",\n \"runner\": \"node dist-server/runner/index.js\",\n \"runner:dev\": \"tsx src/runner/index.ts\",\n \"runner:build\": \"node scripts/build-runner.mjs\",\n \"desktop:build:win\": \"npm run build && node scripts/build-windows-desktop.mjs\",\n \"desktop:pack:win\": \"npm run desktop:build:win && node scripts/windows-desktop-release.mjs\",\n \"desktop:test:win\": \"node scripts/test-windows-desktop.mjs\",\n \"agent:setup\": \"node scripts/agent-setup.mjs\",\n \"agent:test\": \".venv/bin/python tests/runtime/test_kernel.py && .venv/bin/python tests/runtime/test_compression.py && .venv/bin/python tests/runtime/test_backup.py && .venv/bin/python tests/runtime/test_hermes_web.py && .venv/bin/python tests/runtime/test_native_openviking.py && .venv/bin/python tests/runtime/test_native_openviking_config.py && .venv/bin/python tests/runtime/test_vault_env.py && vitest run tests/server/embeddedAgent.test.ts tests/server/singleUserDevices.test.ts tests/server/harnessWeb.test.ts\",\n \"agent:pack\": \"npm run build && node scripts/build-agent-host.mjs\",\n \"postinstall\": \"node scripts/agent-setup.mjs --postinstall\"\n },\n \"dependencies\": {\n \"@koa/bodyparser\": \"^5.0.0\",\n \"@koa/router\": \"^15.4.0\",\n \"@openviking/sdk\": \"0.1.0\",\n \"@trycua/cua-driver\": \"0.28.2\",\n \"@types/busboy\": \"^1.5.4\",\n \"@types/koa\": \"^2.15.0\",\n \"@types/koa-send\": \"^4.1.6\",\n \"@types/koa-static\": \"^4.0.4\",\n \"@types/markdown-it\": \"^14.1.2\",\n \"@types/mime-types\": \"^2.1.4\",\n \"@types/node\": \"^24.10.0\",\n \"@types/qrcode\": \"^1.5.6\",\n \"@types/ws\": \"^8.18.1\",\n \"@vicons/ionicons5\": \"^0.13.0\",\n \"@vicons/tabler\": \"^0.13.0\",\n \"@vitejs/plugin-vue\": \"^6.0.5\",\n \"@vue/tsconfig\": \"^0.9.1\",\n \"busboy\": \"^1.6.0\",\n \"cookie\": \"^1.0.2\",\n \"docx-preview\": \"^0.3.7\",\n \"dompurify\": \"^3.2.6\",\n \"highlight.js\": \"^11.11.1\",\n \"koa\": \"^2.15.3\",\n \"koa-send\": \"^5.0.1\",\n \"koa-static\": \"^5.0.0\",\n \"libsodium-wrappers-sumo\": \"0.8.4\",\n \"markdown-it\": \"^14.1.0\",\n \"mime-types\": \"^3.0.1\",\n \"naive-ui\": \"^2.44.1\",\n \"pdfjs-dist\": \"6.2.108\",\n \"pinia\": \"^3.0.4\",\n \"pinyin-pro\": \"3.29.5\",\n \"playwright\": \"1.62.1\",\n \"qrcode\": \"^1.5.4\",\n \"read-excel-file\": \"^7.0.3\",\n \"sass\": \"^1.99.0\",\n \"ssh2\": \"1.17.0\",\n \"typescript\": \"~6.0.2\",\n \"undici\": \"7.29.1\",\n \"vite\": \"^8.0.4\",\n \"vue\": \"^3.5.32\",\n \"vue-router\": \"^4.6.4\",\n \"vue-tsc\": \"^3.2.8\",\n \"ws\": \"^8.20.0\",\n \"zod\": \"^4.1.12\"\n },\n \"devDependencies\": {\n \"@playwright/test\": \"^1.60.0\",\n \"@types/jsdom\": \"^21.1.7\",\n \"@types/ssh2\": \"1.15.5\",\n \"@types/supertest\": \"^6.0.3\",\n \"@vitest/coverage-v8\": \"^3.2.4\",\n \"@vue/test-utils\": \"^2.4.6\",\n \"cross-env\": \"^10.1.0\",\n \"electron\": \"43.4.0\",\n \"electron-builder\": \"26.15.3\",\n \"electron-updater\": \"6.8.9\",\n \"esbuild\": \"0.28.2\",\n \"js-yaml\": \"4.3.2\",\n \"jsdom\": \"^27.0.1\",\n \"supertest\": \"^7.1.4\",\n \"tsx\": \"^4.21.0\",\n \"vitest\": \"^3.2.4\"\n },\n \"files\": [\n \"bin\",\n \"dist\",\n \"dist-server\",\n \"licenses\",\n \"LICENSE\",\n \"NOTICE\",\n \"THIRD_PARTY_NOTICES.md\",\n \"release.json\",\n \"build-info.json\",\n \"runtime\",\n \"scripts/agent-backup.py\",\n \"scripts/agent-setup.mjs\",\n \"!runtime/**/__pycache__/**\",\n \"!runtime/**/*.pyc\",\n \"!runtime/**/*.pyo\",\n \"!runtime/**/.env\",\n \"!runtime/**/auth.json\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","<script setup lang=\"ts\">\nimport { version } from '../../../../package.json'\nimport BrandMark from '@/components/common/BrandMark.vue'\nimport StandaloneDialog from '@/components/common/StandaloneDialog.vue'\nconst emit = defineEmits<{ close: [] }>()\n</script>\n<template>\n <StandaloneDialog title=\"关于Yaovi\" compact @close=\"emit('close')\"><section class=\"about-content\">\n <BrandMark :size=\"56\" :label=\"false\" compact bare /><h3>Yaovi</h3><p class=\"about-version\">版本 {{ version }}</p>\n <p>通过 OpenAI 模型与 Bot 对话、协作完成任务。<br />基于 Apache-2.0 许可证开放源代码。</p>\n\n </section></StandaloneDialog>\n</template>\n<style scoped>\n.about-content{display:grid;justify-items:center;gap:12px;text-align:center}.about-content h3{font-size:21px;margin:0}.about-content p{margin:0;color:var(--text-secondary);font-size:13px;line-height:1.8}.about-content .about-version{font-size:12px}.about-content nav{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:8px}.about-content a{padding:10px 8px;color:var(--accent);font-size:13px;text-decoration:none}.about-content a:hover{text-decoration:underline}.about-content a:focus-visible{outline:2px solid var(--accent);outline-offset:2px}\n</style>\n","<script setup lang=\"ts\">\nimport { version } from '../../../../package.json'\nimport BrandMark from '@/components/common/BrandMark.vue'\nimport StandaloneDialog from '@/components/common/StandaloneDialog.vue'\nconst emit = defineEmits<{ close: [] }>()\n</script>\n<template>\n <StandaloneDialog title=\"关于Yaovi\" compact @close=\"emit('close')\"><section class=\"about-content\">\n <BrandMark :size=\"56\" :label=\"false\" compact bare /><h3>Yaovi</h3><p class=\"about-version\">版本 {{ version }}</p>\n <p>通过 OpenAI 模型与 Bot 对话、协作完成任务。<br />基于 Apache-2.0 许可证开放源代码。</p>\n\n </section></StandaloneDialog>\n</template>\n<style scoped>\n.about-content{display:grid;justify-items:center;gap:12px;text-align:center}.about-content h3{font-size:21px;margin:0}.about-content p{margin:0;color:var(--text-secondary);font-size:13px;line-height:1.8}.about-content .about-version{font-size:12px}.about-content nav{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:8px}.about-content a{padding:10px 8px;color:var(--accent);font-size:13px;text-decoration:none}.about-content a:hover{text-decoration:underline}.about-content a:focus-visible{outline:2px solid var(--accent);outline-offset:2px}\n</style>\n"],"mappings":"wVCIA,IAAM,EAAO,gBAGX,EAAA,EAAA,EAI6B,EAAA,CAJX,MAAM,UAAU,QAAA,GAAS,QAAK,AAAA,EAAA,KAAA,GAAE,EAAI,OAAA,IAAW,QAAA,MAIvD,CAJuD,EAIvD,UAJuD,EAIvD,CAHR,EAAoD,EAAA,CAAxC,KAAM,GAAK,MAAO,GAAO,QAAA,GAAQ,KAAA,KAAO,AAAA,EAAA,KAAA,EAAc,KAAA,KAAV,QAAK,EAAA,EAAK,EAA6C,IAA7C,EAAyB,MAAG,EAAG,EAAA,CAAA,CAAO,EAAA,CAAA,EACxG,AAAA,EAAA,KAAA,EAAgE,IAAA,KAAA,CAA7D,EAAA,8BAA4B,EAAA,EAAM,IAAA,EAAA,EAAA,yBAAuB"}