loadn 0.7.76__tar.gz → 0.7.78__tar.gz

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 (470) hide show
  1. {loadn-0.7.76 → loadn-0.7.78}/PKG-INFO +1 -1
  2. {loadn-0.7.76 → loadn-0.7.78}/loadn/__init__.py +1 -1
  3. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/subagent.py +19 -4
  4. {loadn-0.7.76 → loadn-0.7.78}/loadn.egg-info/PKG-INFO +1 -1
  5. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/consolidate.py +25 -6
  6. {loadn-0.7.76 → loadn-0.7.78}/pyproject.toml +1 -1
  7. {loadn-0.7.76 → loadn-0.7.78}/tests/test_consolidate.py +53 -0
  8. {loadn-0.7.76 → loadn-0.7.78}/tests/test_dw_engine.py +30 -0
  9. {loadn-0.7.76 → loadn-0.7.78}/LICENSE +0 -0
  10. {loadn-0.7.76 → loadn-0.7.78}/README.md +0 -0
  11. {loadn-0.7.76 → loadn-0.7.78}/loadn/__main__.py +0 -0
  12. {loadn-0.7.76 → loadn-0.7.78}/loadn/bash_policy.py +0 -0
  13. {loadn-0.7.76 → loadn-0.7.78}/loadn/cli/__init__.py +0 -0
  14. {loadn-0.7.76 → loadn-0.7.78}/loadn/cli/auth.py +0 -0
  15. {loadn-0.7.76 → loadn-0.7.78}/loadn/cli/main.py +0 -0
  16. {loadn-0.7.76 → loadn-0.7.78}/loadn/cli/memory_cli.py +0 -0
  17. {loadn-0.7.76 → loadn-0.7.78}/loadn/cli/onboard.py +0 -0
  18. {loadn-0.7.76 → loadn-0.7.78}/loadn/cli/repl.py +0 -0
  19. {loadn-0.7.76 → loadn-0.7.78}/loadn/cli/skills_lock.py +0 -0
  20. {loadn-0.7.76 → loadn-0.7.78}/loadn/cli/stream_json.py +0 -0
  21. {loadn-0.7.76 → loadn-0.7.78}/loadn/consolidate.py +0 -0
  22. {loadn-0.7.76 → loadn-0.7.78}/loadn/constants.py +0 -0
  23. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/__init__.py +0 -0
  24. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/agent_defs.py +0 -0
  25. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/autocommit.py +0 -0
  26. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/autolint.py +0 -0
  27. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/build.py +0 -0
  28. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/cache_warmer.py +0 -0
  29. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/compactor.py +0 -0
  30. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/context.py +0 -0
  31. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/ext.py +0 -0
  32. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/hooks.py +0 -0
  33. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/i18n/__init__.py +0 -0
  34. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/i18n/notify_en.py +0 -0
  35. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/i18n/notify_zh.py +0 -0
  36. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/loop.py +0 -0
  37. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/memory.py +0 -0
  38. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/models.py +0 -0
  39. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/permissions.py +0 -0
  40. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/plan.py +0 -0
  41. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/repomap.py +0 -0
  42. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/session.py +0 -0
  43. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/skills.py +0 -0
  44. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/streamsynth.py +0 -0
  45. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/task_tools.py +0 -0
  46. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/tasks.py +0 -0
  47. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/tool_repair.py +0 -0
  48. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/trust.py +0 -0
  49. {loadn-0.7.76 → loadn-0.7.78}/loadn/core/turn_diff.py +0 -0
  50. {loadn-0.7.76 → loadn-0.7.78}/loadn/mcp/__init__.py +0 -0
  51. {loadn-0.7.76 → loadn-0.7.78}/loadn/mcp/client.py +0 -0
  52. {loadn-0.7.76 → loadn-0.7.78}/loadn/mcp/oauth.py +0 -0
  53. {loadn-0.7.76 → loadn-0.7.78}/loadn/memorystore.py +0 -0
  54. {loadn-0.7.76 → loadn-0.7.78}/loadn/models.json +0 -0
  55. {loadn-0.7.76 → loadn-0.7.78}/loadn/persistence/__init__.py +0 -0
  56. {loadn-0.7.76 → loadn-0.7.78}/loadn/persistence/db.py +0 -0
  57. {loadn-0.7.76 → loadn-0.7.78}/loadn/persistence/transcript.py +0 -0
  58. {loadn-0.7.76 → loadn-0.7.78}/loadn/prompts/models/generic.md +0 -0
  59. {loadn-0.7.76 → loadn-0.7.78}/loadn/prompts/models/glm-5.3.md +0 -0
  60. {loadn-0.7.76 → loadn-0.7.78}/loadn/prompts/title.txt +0 -0
  61. {loadn-0.7.76 → loadn-0.7.78}/loadn/protocol/__init__.py +0 -0
  62. {loadn-0.7.76 → loadn-0.7.78}/loadn/protocol/manifest.json +0 -0
  63. {loadn-0.7.76 → loadn-0.7.78}/loadn/providers/__init__.py +0 -0
  64. {loadn-0.7.76 → loadn-0.7.78}/loadn/providers/anthropic.py +0 -0
  65. {loadn-0.7.76 → loadn-0.7.78}/loadn/providers/cassette.py +0 -0
  66. {loadn-0.7.76 → loadn-0.7.78}/loadn/providers/fake.py +0 -0
  67. {loadn-0.7.76 → loadn-0.7.78}/loadn/providers/fingerprint.py +0 -0
  68. {loadn-0.7.76 → loadn-0.7.78}/loadn/providers/openai_compat.py +0 -0
  69. {loadn-0.7.76 → loadn-0.7.78}/loadn/providers/retry.py +0 -0
  70. {loadn-0.7.76 → loadn-0.7.78}/loadn/py.typed +0 -0
  71. {loadn-0.7.76 → loadn-0.7.78}/loadn/skilllock.py +0 -0
  72. {loadn-0.7.76 → loadn-0.7.78}/loadn/supervisor/__init__.py +0 -0
  73. {loadn-0.7.76 → loadn-0.7.78}/loadn/supervisor/process.py +0 -0
  74. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/__init__.py +0 -0
  75. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/base.py +0 -0
  76. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/bash.py +0 -0
  77. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/cc_stubs.py +0 -0
  78. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/edit.py +0 -0
  79. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/glob.py +0 -0
  80. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/grep.py +0 -0
  81. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/interactive.py +0 -0
  82. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/multiedit.py +0 -0
  83. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/notebook.py +0 -0
  84. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/read.py +0 -0
  85. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/skill.py +0 -0
  86. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/task.py +0 -0
  87. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/todowrite.py +0 -0
  88. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/tool_search.py +0 -0
  89. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/truncate.py +0 -0
  90. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/webfetch.py +0 -0
  91. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/websearch.py +0 -0
  92. {loadn-0.7.76 → loadn-0.7.78}/loadn/tools/write.py +0 -0
  93. {loadn-0.7.76 → loadn-0.7.78}/loadn/transport/__init__.py +0 -0
  94. {loadn-0.7.76 → loadn-0.7.78}/loadn/transport/bridge.py +0 -0
  95. {loadn-0.7.76 → loadn-0.7.78}/loadn/transport/daemon.py +0 -0
  96. {loadn-0.7.76 → loadn-0.7.78}/loadn/truststore.py +0 -0
  97. {loadn-0.7.76 → loadn-0.7.78}/loadn/tui.py +0 -0
  98. {loadn-0.7.76 → loadn-0.7.78}/loadn/types.py +0 -0
  99. {loadn-0.7.76 → loadn-0.7.78}/loadn/util.py +0 -0
  100. {loadn-0.7.76 → loadn-0.7.78}/loadn.egg-info/SOURCES.txt +0 -0
  101. {loadn-0.7.76 → loadn-0.7.78}/loadn.egg-info/dependency_links.txt +0 -0
  102. {loadn-0.7.76 → loadn-0.7.78}/loadn.egg-info/entry_points.txt +0 -0
  103. {loadn-0.7.76 → loadn-0.7.78}/loadn.egg-info/requires.txt +0 -0
  104. {loadn-0.7.76 → loadn-0.7.78}/loadn.egg-info/top_level.txt +0 -0
  105. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/__init__.py +0 -0
  106. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/__main__.py +0 -0
  107. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/__init__.py +0 -0
  108. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/app.py +0 -0
  109. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/__init__.py +0 -0
  110. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/_common.py +0 -0
  111. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/activity.py +0 -0
  112. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/admin.py +0 -0
  113. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/approvals.py +0 -0
  114. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/artifacts.py +0 -0
  115. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/auth.py +0 -0
  116. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/channels_admin.py +0 -0
  117. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/files.py +0 -0
  118. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/hooks.py +0 -0
  119. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/memory.py +0 -0
  120. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/models.py +0 -0
  121. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/org.py +0 -0
  122. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/projects.py +0 -0
  123. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/routines.py +0 -0
  124. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/schedules.py +0 -0
  125. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/sessions.py +0 -0
  126. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/settings.py +0 -0
  127. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/skills.py +0 -0
  128. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/stats.py +0 -0
  129. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/target_policy_admin.py +0 -0
  130. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/tools.py +0 -0
  131. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/routes/turns.py +0 -0
  132. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/api/sse.py +0 -0
  133. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/archive.py +0 -0
  134. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/artifacts.py +0 -0
  135. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/backfill.py +0 -0
  136. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/backup.py +0 -0
  137. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/claude_runner.py +0 -0
  138. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/cli.py +0 -0
  139. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/config.py +0 -0
  140. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/cron.py +0 -0
  141. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/db.py +0 -0
  142. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/engine.py +0 -0
  143. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/engines/__init__.py +0 -0
  144. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/engines/base.py +0 -0
  145. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/engines/claude.py +0 -0
  146. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/engines/loadn.py +0 -0
  147. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/engines/opencode.py +0 -0
  148. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/exporter/__init__.py +0 -0
  149. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/exporter/md_to_docx.py +0 -0
  150. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/exporter/md_to_html.py +0 -0
  151. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/abnfDiagram-WEYOIA3C-R1J1j9kv.js +0 -0
  152. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/arc-C2XNcGQt.js +0 -0
  153. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/architecture-WOLXFQ4H-CepPv59C.js +0 -0
  154. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/architectureDiagram-ZHVYKT53-DdSBNF9h.js +0 -0
  155. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/array-BifhSqXX.js +0 -0
  156. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/blockDiagram-RJAE7QA3-B22G_PdG.js +0 -0
  157. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/c4Diagram-XDPPPE54-Cl6rXRVb.js +0 -0
  158. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/channel-B2R7elJk.js +0 -0
  159. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-2E7WHVMD-CnCIUgD6.js +0 -0
  160. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +0 -0
  161. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-4EMNKR2T-BGtbZNP9.js +0 -0
  162. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-55XCU76K-DCynpdZw.js +0 -0
  163. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-5VM5RSS4-ZNzvKenW.js +0 -0
  164. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-7S6XSTFO-Ct5jDiIU.js +0 -0
  165. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-AQDTSKZB-DRd2Qhb9.js +0 -0
  166. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-DSNLSHJZ-y21jje5T.js +0 -0
  167. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-DUW6YSOI-Dgx8z5s3.js +0 -0
  168. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-HAGFOTED-D6h6Nbjc.js +0 -0
  169. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-HNE4Q36P-C3xSfau-.js +0 -0
  170. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-J5ZVWO5B-oDCd-gWO.js +0 -0
  171. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-JWPE2WC7-DVXcaiue.js +0 -0
  172. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-NGNAAXSQ-BW1P8EP7.js +0 -0
  173. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-NQOKRVIF-DfFgwCwu.js +0 -0
  174. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-UHW7PFBP-FCarZJXv.js +0 -0
  175. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-VQ5W62QI-Bsl3TxaO.js +0 -0
  176. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-WQQL4CDK-DqGsBRo1.js +0 -0
  177. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-XXDRQBXY-CCFNOzGL.js +0 -0
  178. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +0 -0
  179. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-YZO67HFG-BhdtI4-J.js +0 -0
  180. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-ZAUX2LTX-D0R5fzI3.js +0 -0
  181. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/chunk-ZCHMQSOR-jpwumauT.js +0 -0
  182. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/classDiagram-v2-4MYWR3UA-UR-yX8_L.js +0 -0
  183. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/cose-bilkent-JH36ORCC-xDQsnS2f.js +0 -0
  184. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/cynefin-EF2NZ3EQ-CPc1wSli.js +0 -0
  185. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/cynefinDiagram-WF24UDRP-Cpvl6GAJ.js +0 -0
  186. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/cytoscape.esm-BABknn1H.js +0 -0
  187. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/dagre-NK4GIZVX-C_3XFWJB.js +0 -0
  188. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/defaultLocale-BFoDCU3G.js +0 -0
  189. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/diagram-CBK3MWTC-CJSL6rxw.js +0 -0
  190. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/diagram-I5XIIV2D-3wxopGAf.js +0 -0
  191. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/diagram-ODIL2UCW-B3mkTjaa.js +0 -0
  192. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/diagram-PFBEJUXE-fcRFt2Cx.js +0 -0
  193. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/diagram-RJA3I4VV-mdKJAxDe.js +0 -0
  194. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/diagram-TYUNFSNR-zVbsPuWg.js +0 -0
  195. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/dist-Bdhrcrt6.js +0 -0
  196. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/ebnfDiagram-V4P3TTPT-DmNFaUR6.js +0 -0
  197. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/elk-QONTBCTQ-D_uwPqty.js +0 -0
  198. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/erDiagram-KYQIGQAA-5Elpr-lZ.js +0 -0
  199. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/eventmodeling-K75KTNOO-Chwsmd35.js +0 -0
  200. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/flowDiagram-IUGLLWBU-5W7toNwU.js +0 -0
  201. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/ganttDiagram-R7GPNTJY-CYljZSxE.js +0 -0
  202. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/gitGraph-VSP46ZUC-DmVJSAF_.js +0 -0
  203. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/gitGraphDiagram-PDYL7XHY-i8O9XpoA.js +0 -0
  204. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/graphlib-DS17s2tU.js +0 -0
  205. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/index-Bbbpumgh.css +0 -0
  206. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/index-hyXc8nuG.js +0 -0
  207. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/info-OHQRW6UA-BXfXtweV.js +0 -0
  208. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/infoDiagram-MVDRKAX5-BP8xcmox.js +0 -0
  209. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/init-C-OQMol4.js +0 -0
  210. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/ishikawaDiagram-HPEHV2GE-D4M7t_ep.js +0 -0
  211. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/journeyDiagram-BOSHW7O7-ClaHxBJr.js +0 -0
  212. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/kanban-definition-FNSA4HC5-BO6K1CNv.js +0 -0
  213. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/katex-DErKE0Ic.js +0 -0
  214. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/line-CO7ci5vv.js +0 -0
  215. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/linear-DUwaZITh.js +0 -0
  216. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/mermaid-parser.core-FANuMWYX.js +0 -0
  217. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/mermaid.core-DdVU2IGc.js +0 -0
  218. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/mindmap-definition-6OY57UG3-BcZPCa53.js +0 -0
  219. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/ordinal-BDEzSJ7C.js +0 -0
  220. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/packet-JDAUHWVQ-Bs6D2Y6E.js +0 -0
  221. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/path-fybaL0A-.js +0 -0
  222. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/pegDiagram-ECIUJNBX-Bm-ksqsj.js +0 -0
  223. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/pie-XZMESJXO-DRA6rEdo.js +0 -0
  224. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/pieDiagram-GNMPY74T-k_9dblN2.js +0 -0
  225. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/quadrantDiagram-D57K4MC3-Bah0IMFk.js +0 -0
  226. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/radar-ABXABTNO-BHG5WWdj.js +0 -0
  227. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/railroad-I3PHUGI6-DuHRgV3R.js +0 -0
  228. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/railroad-abnf-LNEFI6M7-Bb4MKDGL.js +0 -0
  229. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/railroad-ebnf-DWYD2UWJ-C5kwYx25.js +0 -0
  230. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/railroad-peg-JR7BVNR7-bYOQ_uGb.js +0 -0
  231. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/railroadDiagram-Y72NRBL7-C1vwgHzH.js +0 -0
  232. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/requirementDiagram-EQYSW5RA-DdQsX-ze.js +0 -0
  233. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/rough.esm-Dy-Kn_BL.js +0 -0
  234. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/sankeyDiagram-SY24JHO5-CgwTJWxf.js +0 -0
  235. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/sequenceDiagram-BLEHNHQU-XAk7CH3J.js +0 -0
  236. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -0
  237. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/src-DF_ht5z_.js +0 -0
  238. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/stateDiagram-v2-A6IESKWZ-8bRW63f-.js +0 -0
  239. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/swimlanes-B3ENRKFQ-mmhpmGrK.js +0 -0
  240. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/swimlanesDiagram-AYQRV4AK-Ec3pmWGe.js +0 -0
  241. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/timeline-definition-JXYKGLGB-DW7oGQ4t.js +0 -0
  242. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/treeView-D4JQ5SDB-D7ZdeSV-.js +0 -0
  243. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/treemap-SAJKECNS-qTz0eJQJ.js +0 -0
  244. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/usecaseDiagram-WPOLBNNX-_29D7LNh.js +0 -0
  245. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/vennDiagram-Q3Y3IDCW-C69ydS5F.js +0 -0
  246. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/wardley-7MLQ67FV-Dc22eP55.js +0 -0
  247. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/wardleyDiagram-IVAIDKWA-CfVCO0p9.js +0 -0
  248. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/assets/xychartDiagram-4URNHDU4-DEJAZlPA.js +0 -0
  249. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/favicon.svg +0 -0
  250. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/icons/apple-touch-icon.png +0 -0
  251. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/icons/icon-192.png +0 -0
  252. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/icons/icon-512.png +0 -0
  253. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/icons/icon-maskable-512.png +0 -0
  254. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/icons.svg +0 -0
  255. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/index.html +0 -0
  256. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/manifest.json +0 -0
  257. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/frontend/dist/sw.js +0 -0
  258. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/hooks.py +0 -0
  259. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/init_cmd.py +0 -0
  260. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/__init__.py +0 -0
  261. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/browser_mcp.py +0 -0
  262. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/channels.py +0 -0
  263. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/codemode_mcp.py +0 -0
  264. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/lsp_host.py +0 -0
  265. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/mcp_admin.py +0 -0
  266. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/notify.py +0 -0
  267. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/pricing.py +0 -0
  268. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/resources.py +0 -0
  269. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/share.py +0 -0
  270. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/skill_zh.py +0 -0
  271. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/skillhub.py +0 -0
  272. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/subtask.py +0 -0
  273. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/integrations/titlegen.py +0 -0
  274. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/maintenance.py +0 -0
  275. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/ops.py +0 -0
  276. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/org.py +0 -0
  277. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/params.py +0 -0
  278. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/profile.py +0 -0
  279. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/profiles/assistant.md +0 -0
  280. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/profiles/chat.md +0 -0
  281. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/profiles/coder.md +0 -0
  282. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/profiles/registry.yaml +0 -0
  283. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/profiles/researcher.md +0 -0
  284. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/prompts/workspace.md.tmpl +0 -0
  285. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/routines.py +0 -0
  286. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/scheduler.py +0 -0
  287. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/scripts/fetch_page.py +0 -0
  288. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/__init__.py +0 -0
  289. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/approve.py +0 -0
  290. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/audit.py +0 -0
  291. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/canary.py +0 -0
  292. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/egress_grants.py +0 -0
  293. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/egress_proxy.py +0 -0
  294. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/net_policy.py +0 -0
  295. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/policy.py +0 -0
  296. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/sandbox.py +0 -0
  297. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/skill_scan.py +0 -0
  298. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/target_policy.py +0 -0
  299. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/userauth.py +0 -0
  300. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/security/vault.py +0 -0
  301. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/settings_admin.py +0 -0
  302. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/skills.py +0 -0
  303. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/transcript.py +0 -0
  304. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/util.py +0 -0
  305. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/verify.py +0 -0
  306. {loadn-0.7.76 → loadn-0.7.78}/loadn_webui/workspace.py +0 -0
  307. {loadn-0.7.76 → loadn-0.7.78}/setup.cfg +0 -0
  308. {loadn-0.7.76 → loadn-0.7.78}/tests/test_acceptance_gate.py +0 -0
  309. {loadn-0.7.76 → loadn-0.7.78}/tests/test_activity.py +0 -0
  310. {loadn-0.7.76 → loadn-0.7.78}/tests/test_admin.py +0 -0
  311. {loadn-0.7.76 → loadn-0.7.78}/tests/test_admin_ping_history.py +0 -0
  312. {loadn-0.7.76 → loadn-0.7.78}/tests/test_admin_size_rescan.py +0 -0
  313. {loadn-0.7.76 → loadn-0.7.78}/tests/test_admin_system.py +0 -0
  314. {loadn-0.7.76 → loadn-0.7.78}/tests/test_admin_tasks.py +0 -0
  315. {loadn-0.7.76 → loadn-0.7.78}/tests/test_adoption.py +0 -0
  316. {loadn-0.7.76 → loadn-0.7.78}/tests/test_agent_attrs.py +0 -0
  317. {loadn-0.7.76 → loadn-0.7.78}/tests/test_architecture.py +0 -0
  318. {loadn-0.7.76 → loadn-0.7.78}/tests/test_archive.py +0 -0
  319. {loadn-0.7.76 → loadn-0.7.78}/tests/test_artifacts_units.py +0 -0
  320. {loadn-0.7.76 → loadn-0.7.78}/tests/test_attachments.py +0 -0
  321. {loadn-0.7.76 → loadn-0.7.78}/tests/test_auth_cli.py +0 -0
  322. {loadn-0.7.76 → loadn-0.7.78}/tests/test_auto_continue.py +0 -0
  323. {loadn-0.7.76 → loadn-0.7.78}/tests/test_autocommit.py +0 -0
  324. {loadn-0.7.76 → loadn-0.7.78}/tests/test_autolint.py +0 -0
  325. {loadn-0.7.76 → loadn-0.7.78}/tests/test_backup.py +0 -0
  326. {loadn-0.7.76 → loadn-0.7.78}/tests/test_bridge_units.py +0 -0
  327. {loadn-0.7.76 → loadn-0.7.78}/tests/test_browser_units.py +0 -0
  328. {loadn-0.7.76 → loadn-0.7.78}/tests/test_browser_vision.py +0 -0
  329. {loadn-0.7.76 → loadn-0.7.78}/tests/test_cache_warmer.py +0 -0
  330. {loadn-0.7.76 → loadn-0.7.78}/tests/test_cassette.py +0 -0
  331. {loadn-0.7.76 → loadn-0.7.78}/tests/test_categories.py +0 -0
  332. {loadn-0.7.76 → loadn-0.7.78}/tests/test_channels.py +0 -0
  333. {loadn-0.7.76 → loadn-0.7.78}/tests/test_cli_admin.py +0 -0
  334. {loadn-0.7.76 → loadn-0.7.78}/tests/test_cli_main_units.py +0 -0
  335. {loadn-0.7.76 → loadn-0.7.78}/tests/test_codemode_stdio_units.py +0 -0
  336. {loadn-0.7.76 → loadn-0.7.78}/tests/test_compactor_units.py +0 -0
  337. {loadn-0.7.76 → loadn-0.7.78}/tests/test_config_barekey.py +0 -0
  338. {loadn-0.7.76 → loadn-0.7.78}/tests/test_context_memory.py +0 -0
  339. {loadn-0.7.76 → loadn-0.7.78}/tests/test_context_sections.py +0 -0
  340. {loadn-0.7.76 → loadn-0.7.78}/tests/test_cron.py +0 -0
  341. {loadn-0.7.76 → loadn-0.7.78}/tests/test_daemon.py +0 -0
  342. {loadn-0.7.76 → loadn-0.7.78}/tests/test_deepseek_search.py +0 -0
  343. {loadn-0.7.76 → loadn-0.7.78}/tests/test_delta_order.py +0 -0
  344. {loadn-0.7.76 → loadn-0.7.78}/tests/test_dormant_gate.py +0 -0
  345. {loadn-0.7.76 → loadn-0.7.78}/tests/test_dw_bind.py +0 -0
  346. {loadn-0.7.76 → loadn-0.7.78}/tests/test_e2e.py +0 -0
  347. {loadn-0.7.76 → loadn-0.7.78}/tests/test_e2e_cli.py +0 -0
  348. {loadn-0.7.76 → loadn-0.7.78}/tests/test_e2e_loadn.py +0 -0
  349. {loadn-0.7.76 → loadn-0.7.78}/tests/test_e2e_opencode.py +0 -0
  350. {loadn-0.7.76 → loadn-0.7.78}/tests/test_egress_align.py +0 -0
  351. {loadn-0.7.76 → loadn-0.7.78}/tests/test_egress_ask.py +0 -0
  352. {loadn-0.7.76 → loadn-0.7.78}/tests/test_egress_balance.py +0 -0
  353. {loadn-0.7.76 → loadn-0.7.78}/tests/test_egress_gates.py +0 -0
  354. {loadn-0.7.76 → loadn-0.7.78}/tests/test_egress_session_reap.py +0 -0
  355. {loadn-0.7.76 → loadn-0.7.78}/tests/test_egress_units.py +0 -0
  356. {loadn-0.7.76 → loadn-0.7.78}/tests/test_engine_fail_obs.py +0 -0
  357. {loadn-0.7.76 → loadn-0.7.78}/tests/test_engine_rename_migrate.py +0 -0
  358. {loadn-0.7.76 → loadn-0.7.78}/tests/test_engine_switch.py +0 -0
  359. {loadn-0.7.76 → loadn-0.7.78}/tests/test_engines.py +0 -0
  360. {loadn-0.7.76 → loadn-0.7.78}/tests/test_engines_registry.py +0 -0
  361. {loadn-0.7.76 → loadn-0.7.78}/tests/test_evals_gate.py +0 -0
  362. {loadn-0.7.76 → loadn-0.7.78}/tests/test_exec_domain_gate.py +0 -0
  363. {loadn-0.7.76 → loadn-0.7.78}/tests/test_exporter_html.py +0 -0
  364. {loadn-0.7.76 → loadn-0.7.78}/tests/test_ext.py +0 -0
  365. {loadn-0.7.76 → loadn-0.7.78}/tests/test_file_mutex.py +0 -0
  366. {loadn-0.7.76 → loadn-0.7.78}/tests/test_fingerprint.py +0 -0
  367. {loadn-0.7.76 → loadn-0.7.78}/tests/test_goal_contract.py +0 -0
  368. {loadn-0.7.76 → loadn-0.7.78}/tests/test_grep_capability.py +0 -0
  369. {loadn-0.7.76 → loadn-0.7.78}/tests/test_hard_links.py +0 -0
  370. {loadn-0.7.76 → loadn-0.7.78}/tests/test_hooks_ext_cmds.py +0 -0
  371. {loadn-0.7.76 → loadn-0.7.78}/tests/test_init.py +0 -0
  372. {loadn-0.7.76 → loadn-0.7.78}/tests/test_kimi_search.py +0 -0
  373. {loadn-0.7.76 → loadn-0.7.78}/tests/test_loop.py +0 -0
  374. {loadn-0.7.76 → loadn-0.7.78}/tests/test_loop_grind.py +0 -0
  375. {loadn-0.7.76 → loadn-0.7.78}/tests/test_loop_units.py +0 -0
  376. {loadn-0.7.76 → loadn-0.7.78}/tests/test_lsp_host.py +0 -0
  377. {loadn-0.7.76 → loadn-0.7.78}/tests/test_lsp_session_units.py +0 -0
  378. {loadn-0.7.76 → loadn-0.7.78}/tests/test_m4_units.py +0 -0
  379. {loadn-0.7.76 → loadn-0.7.78}/tests/test_m6a_units.py +0 -0
  380. {loadn-0.7.76 → loadn-0.7.78}/tests/test_m6c_units.py +0 -0
  381. {loadn-0.7.76 → loadn-0.7.78}/tests/test_m6d_units.py +0 -0
  382. {loadn-0.7.76 → loadn-0.7.78}/tests/test_m7_units.py +0 -0
  383. {loadn-0.7.76 → loadn-0.7.78}/tests/test_m7b_units.py +0 -0
  384. {loadn-0.7.76 → loadn-0.7.78}/tests/test_maturity.py +0 -0
  385. {loadn-0.7.76 → loadn-0.7.78}/tests/test_mcp_http.py +0 -0
  386. {loadn-0.7.76 → loadn-0.7.78}/tests/test_mcp_lazy.py +0 -0
  387. {loadn-0.7.76 → loadn-0.7.78}/tests/test_mcp_oauth.py +0 -0
  388. {loadn-0.7.76 → loadn-0.7.78}/tests/test_mcp_stdio_units.py +0 -0
  389. {loadn-0.7.76 → loadn-0.7.78}/tests/test_memory.py +0 -0
  390. {loadn-0.7.76 → loadn-0.7.78}/tests/test_memory_ui.py +0 -0
  391. {loadn-0.7.76 → loadn-0.7.78}/tests/test_models_catalog.py +0 -0
  392. {loadn-0.7.76 → loadn-0.7.78}/tests/test_multiedit_units.py +0 -0
  393. {loadn-0.7.76 → loadn-0.7.78}/tests/test_notify.py +0 -0
  394. {loadn-0.7.76 → loadn-0.7.78}/tests/test_onboard_units.py +0 -0
  395. {loadn-0.7.76 → loadn-0.7.78}/tests/test_ops.py +0 -0
  396. {loadn-0.7.76 → loadn-0.7.78}/tests/test_ops_entry_bootstrap.py +0 -0
  397. {loadn-0.7.76 → loadn-0.7.78}/tests/test_org.py +0 -0
  398. {loadn-0.7.76 → loadn-0.7.78}/tests/test_p37_approval_timeline.py +0 -0
  399. {loadn-0.7.76 → loadn-0.7.78}/tests/test_params.py +0 -0
  400. {loadn-0.7.76 → loadn-0.7.78}/tests/test_perf_archive.py +0 -0
  401. {loadn-0.7.76 → loadn-0.7.78}/tests/test_perf_audit_arch.py +0 -0
  402. {loadn-0.7.76 → loadn-0.7.78}/tests/test_perf_files.py +0 -0
  403. {loadn-0.7.76 → loadn-0.7.78}/tests/test_perf_gate.py +0 -0
  404. {loadn-0.7.76 → loadn-0.7.78}/tests/test_perf_history_page.py +0 -0
  405. {loadn-0.7.76 → loadn-0.7.78}/tests/test_perf_maint.py +0 -0
  406. {loadn-0.7.76 → loadn-0.7.78}/tests/test_perf_sessions.py +0 -0
  407. {loadn-0.7.76 → loadn-0.7.78}/tests/test_permissions_context.py +0 -0
  408. {loadn-0.7.76 → loadn-0.7.78}/tests/test_plan.py +0 -0
  409. {loadn-0.7.76 → loadn-0.7.78}/tests/test_plan_mode.py +0 -0
  410. {loadn-0.7.76 → loadn-0.7.78}/tests/test_pricing.py +0 -0
  411. {loadn-0.7.76 → loadn-0.7.78}/tests/test_projects.py +0 -0
  412. {loadn-0.7.76 → loadn-0.7.78}/tests/test_prompt_variants.py +0 -0
  413. {loadn-0.7.76 → loadn-0.7.78}/tests/test_properties_surface.py +0 -0
  414. {loadn-0.7.76 → loadn-0.7.78}/tests/test_providers_anthropic.py +0 -0
  415. {loadn-0.7.76 → loadn-0.7.78}/tests/test_providers_fake.py +0 -0
  416. {loadn-0.7.76 → loadn-0.7.78}/tests/test_providers_openai.py +0 -0
  417. {loadn-0.7.76 → loadn-0.7.78}/tests/test_providers_retry.py +0 -0
  418. {loadn-0.7.76 → loadn-0.7.78}/tests/test_repl_units.py +0 -0
  419. {loadn-0.7.76 → loadn-0.7.78}/tests/test_replay_parity.py +0 -0
  420. {loadn-0.7.76 → loadn-0.7.78}/tests/test_repomap.py +0 -0
  421. {loadn-0.7.76 → loadn-0.7.78}/tests/test_resources.py +0 -0
  422. {loadn-0.7.76 → loadn-0.7.78}/tests/test_resources_unify.py +0 -0
  423. {loadn-0.7.76 → loadn-0.7.78}/tests/test_robustness.py +0 -0
  424. {loadn-0.7.76 → loadn-0.7.78}/tests/test_rotation_anchor.py +0 -0
  425. {loadn-0.7.76 → loadn-0.7.78}/tests/test_routines.py +0 -0
  426. {loadn-0.7.76 → loadn-0.7.78}/tests/test_runner_e2big.py +0 -0
  427. {loadn-0.7.76 → loadn-0.7.78}/tests/test_runner_units.py +0 -0
  428. {loadn-0.7.76 → loadn-0.7.78}/tests/test_sandbox_tiers.py +0 -0
  429. {loadn-0.7.76 → loadn-0.7.78}/tests/test_sandbox_units.py +0 -0
  430. {loadn-0.7.76 → loadn-0.7.78}/tests/test_scheduler.py +0 -0
  431. {loadn-0.7.76 → loadn-0.7.78}/tests/test_security_knobs.py +0 -0
  432. {loadn-0.7.76 → loadn-0.7.78}/tests/test_session_eng.py +0 -0
  433. {loadn-0.7.76 → loadn-0.7.78}/tests/test_settings.py +0 -0
  434. {loadn-0.7.76 → loadn-0.7.78}/tests/test_settings_admin.py +0 -0
  435. {loadn-0.7.76 → loadn-0.7.78}/tests/test_share.py +0 -0
  436. {loadn-0.7.76 → loadn-0.7.78}/tests/test_ssrf_proxy.py +0 -0
  437. {loadn-0.7.76 → loadn-0.7.78}/tests/test_stats_by_owner.py +0 -0
  438. {loadn-0.7.76 → loadn-0.7.78}/tests/test_stats_cost.py +0 -0
  439. {loadn-0.7.76 → loadn-0.7.78}/tests/test_steer.py +0 -0
  440. {loadn-0.7.76 → loadn-0.7.78}/tests/test_stream_events.py +0 -0
  441. {loadn-0.7.76 → loadn-0.7.78}/tests/test_subagent_custom.py +0 -0
  442. {loadn-0.7.76 → loadn-0.7.78}/tests/test_subagent_streamjson.py +0 -0
  443. {loadn-0.7.76 → loadn-0.7.78}/tests/test_subagent_think_fwd.py +0 -0
  444. {loadn-0.7.76 → loadn-0.7.78}/tests/test_subtask_tag.py +0 -0
  445. {loadn-0.7.76 → loadn-0.7.78}/tests/test_subtasks_db.py +0 -0
  446. {loadn-0.7.76 → loadn-0.7.78}/tests/test_supervisor.py +0 -0
  447. {loadn-0.7.76 → loadn-0.7.78}/tests/test_t8_units.py +0 -0
  448. {loadn-0.7.76 → loadn-0.7.78}/tests/test_t9_units.py +0 -0
  449. {loadn-0.7.76 → loadn-0.7.78}/tests/test_target_policy.py +0 -0
  450. {loadn-0.7.76 → loadn-0.7.78}/tests/test_task_registry.py +0 -0
  451. {loadn-0.7.76 → loadn-0.7.78}/tests/test_tool_repair.py +0 -0
  452. {loadn-0.7.76 → loadn-0.7.78}/tests/test_tools_bash.py +0 -0
  453. {loadn-0.7.76 → loadn-0.7.78}/tests/test_tools_files.py +0 -0
  454. {loadn-0.7.76 → loadn-0.7.78}/tests/test_tools_interactive.py +0 -0
  455. {loadn-0.7.76 → loadn-0.7.78}/tests/test_tools_notebook.py +0 -0
  456. {loadn-0.7.76 → loadn-0.7.78}/tests/test_tools_search.py +0 -0
  457. {loadn-0.7.76 → loadn-0.7.78}/tests/test_tools_todowrite.py +0 -0
  458. {loadn-0.7.76 → loadn-0.7.78}/tests/test_transcript.py +0 -0
  459. {loadn-0.7.76 → loadn-0.7.78}/tests/test_transfer.py +0 -0
  460. {loadn-0.7.76 → loadn-0.7.78}/tests/test_transport_units.py +0 -0
  461. {loadn-0.7.76 → loadn-0.7.78}/tests/test_tui_units.py +0 -0
  462. {loadn-0.7.76 → loadn-0.7.78}/tests/test_turn_diff.py +0 -0
  463. {loadn-0.7.76 → loadn-0.7.78}/tests/test_upgrade_idle_guard.py +0 -0
  464. {loadn-0.7.76 → loadn-0.7.78}/tests/test_vault.py +0 -0
  465. {loadn-0.7.76 → loadn-0.7.78}/tests/test_verify.py +0 -0
  466. {loadn-0.7.76 → loadn-0.7.78}/tests/test_w0_security.py +0 -0
  467. {loadn-0.7.76 → loadn-0.7.78}/tests/test_web_ops.py +0 -0
  468. {loadn-0.7.76 → loadn-0.7.78}/tests/test_webhooks.py +0 -0
  469. {loadn-0.7.76 → loadn-0.7.78}/tests/test_workspace_render.py +0 -0
  470. {loadn-0.7.76 → loadn-0.7.78}/tests/test_ws_files.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loadn
3
- Version: 0.7.76
3
+ Version: 0.7.78
4
4
  Summary: loadn (load-n) agent engine: Claude Code-compatible stream-json CLI, pluggable providers, tools, MCP, subagents, and context compaction. Monorepo also hosts loadn webui.
5
5
  Author: loadn-ai contributors
6
6
  License:
@@ -12,7 +12,7 @@ import os
12
12
  import shutil
13
13
  from pathlib import Path
14
14
 
15
- __version__ = "0.7.76"
15
+ __version__ = "0.7.78"
16
16
 
17
17
 
18
18
  def loadn_home() -> Path:
@@ -80,16 +80,24 @@ class SubagentManager:
80
80
  self.session_id = session_id
81
81
  self.home = home
82
82
  self.types = {**SUBAGENT_TYPES, **(extra_types or {})}
83
+ # 自定义类型键集(org 数字员工 def 等):点名派发时人卡合一的判据
84
+ self.custom_types = set(extra_types or {})
83
85
  self.model_provider_factory = model_provider_factory
84
86
  self._sem = asyncio.Semaphore(SUBAGENT_CONCURRENCY)
85
87
  self._n = 0
86
88
  self._used_names: set[str] = set()
87
89
 
88
- def _pick_name(self) -> str:
89
- """子代理取名:临时工池优先(temp_pool.json 随机取),池空回落
90
- AGENT_NAME_POOL 确定性轮转;同回合撞名追加「·N」。
90
+ def _pick_name(self, forced: str | None = None) -> str:
91
+ """子代理取名:forced(点名员工名)优先直用;否则临时工池优先
92
+ (temp_pool.json 随机取),池空回落 AGENT_NAME_POOL 确定性轮转;
93
+ 同回合撞名追加「·N」。
91
94
 
92
95
  池文件由 webui recruit/retire 全量重写(单写者),引擎侧只读零竞态。"""
96
+ if forced:
97
+ name = forced if forced not in self._used_names \
98
+ else f"{forced}·{self._n}"
99
+ self._used_names.add(name)
100
+ return name
93
101
  base = None
94
102
  pool = self._temp_pool_names()
95
103
  if pool:
@@ -175,7 +183,14 @@ class SubagentManager:
175
183
  self._n += 1
176
184
  sub_sid = f"{self.session_id}-sub{self._n}"
177
185
  card_id = f"sub_{self._n}"
178
- agent_name = self._pick_name()
186
+ # 人卡合一(DW 点名派发修复):subagent_type 命中自定义类型
187
+ # (org 数字员工 def)时 agent_name 用员工名——此前恒池取临时工
188
+ # 名(生产实证 9b71:点名郑明衡/林知夏,卡片显示陈沐阳——员工
189
+ # persona/system_add 已生效但名字是临时工的,人格分裂);池取名
190
+ # 只服务内建类型/未点名 general 派发。
191
+ agent_name = self._pick_name(
192
+ forced=subagent_type if subagent_type in self.custom_types
193
+ else None)
179
194
  if emit is not None:
180
195
  # 形状纪律:主 emit 是 StreamJsonEmitter——message 必须是
181
196
  # Message 对象、块必须带 to_dict()(裸 dict 会 AttributeError
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loadn
3
- Version: 0.7.76
3
+ Version: 0.7.78
4
4
  Summary: loadn (load-n) agent engine: Claude Code-compatible stream-json CLI, pluggable providers, tools, MCP, subagents, and context compaction. Monorepo also hosts loadn webui.
5
5
  Author: loadn-ai contributors
6
6
  License:
@@ -83,14 +83,25 @@ async def get_suggest(sid: str):
83
83
 
84
84
 
85
85
  _ADJUDICATE_SYSTEM = (
86
- "你判断「用户发给 AI 助手的一条消息」是否是对助手行为的纠正、或希望助手"
87
- "今后持续遵循的规则教导。只输出 JSON(不要解释):"
88
- '{"verdict":"teach|correct|reject","rule":"提炼成一句 ≤40 字的规则,reject 时为空"}\n'
89
- "- teach=明确教导持续规则(以后都/记住/今后一律…)\n"
90
- "- correct=对助手上一轮行为的明确否定并要求改正(不对/错了/重做…)\n"
86
+ "你判断「用户发给 AI 助手的一条消息」是否是对助手行为的纠正/规则教导,"
87
+ "并评估可复用价值。只输出一行 JSON(不要解释),必须含全部三键:\\n"
88
+ '{"verdict":"teach|correct|reject","rule":"≤40字规则,reject为空","reusable":true|false}\\n'
89
+ "判定规则:\\n"
90
+ "- teach=明确教导持续规则(以后都/记住/今后一律…)\\n"
91
+ "- correct=对助手上一轮行为的明确否定并要求改正(不对/错了/重做…)\\n"
91
92
  "- reject=以下任一:转贴的日志/代码/报错文本、巡检或定时任务等系统注入、"
92
93
  "对外部事物的问题描述(错的是别的东西不是助手)、与助手行为无关的闲聊、"
93
- "含纠正字样但无纠正意图的叙述。拿不准判 reject。"
94
+ "含纠正字样但无纠正意图的叙述。拿不准判 reject。\\n"
95
+ "- reusable(判 teach/correct 时必须给 false 或 true,不可省略):该经验"
96
+ "能否泛化到未来其他任务。例:\\n"
97
+ ' 用户说「不对,应该先建 venv 再装依赖」→ {"verdict":"correct",'
98
+ '"rule":"先建venv再pip","reusable":true}(通用纪律)\\n'
99
+ ' 用户说「我是想让你排查X,不是让你去做Y」→ {"verdict":"correct",'
100
+ '"rule":"","reusable":false}(会话内意图澄清,歧义一次性,新会话'
101
+ "不会再遇同样场景)\\n"
102
+ " 以下均 reusable=false:①意图澄清(「我想让你做 X 不是 Y」);"
103
+ "②仅本任务专属细节(「这个任务里不要动某文件」);③未来遇不到的"
104
+ "一次性场景。reusable=false 与 reject 等效(不值得存为技能)。"
94
105
  )
95
106
 
96
107
 
@@ -129,6 +140,14 @@ async def _llm_adjudicate(card: dict) -> dict | None:
129
140
  return {"verdict": "reject"}
130
141
  d = json.loads(m.group(0))
131
142
  if d.get("verdict") in ("teach", "correct"):
143
+ # 价值门(VA):判真还须可复用——意图澄清/一次性任务细节
144
+ # (reusable=false)视同 reject(生产实证:用户纠正「我是想让你
145
+ # 排查名字问题不是召唤子代理」被提炼成 avoid-lesson 存技能——
146
+ # 会话内歧义零跨会话价值,用户「教导完全没有价值」的直接来源)。
147
+ # 缺 reusable 字段亦 fail-closed(真机实测 doubao-mini 会漏键,
148
+ # 默认放行=价值门失效;误杀真教导的代价=少一张卡,可接受)。
149
+ if str(d.get("reusable", "")).lower() not in ("true", "1", "yes"):
150
+ return {"verdict": "reject"}
132
151
  return {"verdict": d["verdict"], "rule": str(d.get("rule") or "")}
133
152
  return {"verdict": "reject"}
134
153
  except Exception: # 判定失败 fail-closed(不出卡)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "loadn"
7
- version = "0.7.76"
7
+ version = "0.7.78"
8
8
  description = "loadn (load-n) agent engine: Claude Code-compatible stream-json CLI, pluggable providers, tools, MCP, subagents, and context compaction. Monorepo also hosts loadn webui."
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -509,3 +509,56 @@ async def test_llm_adjudicate_unconfigured_falls_back(client, monkeypatch):
509
509
  p = r.json()["pending"]
510
510
  assert calls["n"] == 1 # 被调且内部短路
511
511
  assert p is not None and p["kind"] == "teach" # 原样返回未删
512
+
513
+
514
+ async def test_llm_adjudicate_value_gate_oneoff_clarification(client, monkeypatch):
515
+ """>>> VA 价值门:判真(correct)但 reusable=false 的会话内意图澄清
516
+ → 视同 reject 不出卡(生产实证:用户纠正「我是想让你排查名字问题,
517
+ 不是让你召唤子代理」被提炼成 avoid-lesson——歧义一次性零跨会话价值,
518
+ 用户「教导完全没有价值」反馈的直接来源)。"""
519
+ from loadn_webui.api.routes import consolidate as croute
520
+ from loadn_webui.config import PATHS
521
+ r = await client.post("/api/sessions", json={"title": "价值门"})
522
+ sid = r.json()["session"]["id"]
523
+ ws = PATHS["workspace"] / sid
524
+ card = {"kind": "correct", "fingerprint": "fpvg1", "name": "avoid-lesson",
525
+ "description": "x",
526
+ "trigger": "上个任务处理的不对,我是想让你排查召唤子代理时候产生的"
527
+ "名字问题,而不是让你召唤子代理去处理事件",
528
+ "body": "# 用户教导(correct)\n\n> 上个任务处理的不对…\n\n"
529
+ "## 上一轮行为(被纠正的上下文)\n\n派发了三个子代理\n\n"
530
+ "## 应遵循的规则\n\n排查意图要先确认",
531
+ "origin_session": sid, "created_at": "now"}
532
+ (ws / ".loadn").mkdir(parents=True, exist_ok=True)
533
+ (ws / ".loadn" / "skill-suggest.json").write_text(json.dumps(card, ensure_ascii=False))
534
+ # 真实判定链:不 mock _llm_adjudicate,mock 其内部 HTTP 层成本高——
535
+ # 直接验证消费端语义:reusable=false 的真判定 → 卡被清。
536
+ async def fake_adj(c):
537
+ return {"verdict": "reject"} # _llm_adjudicate 内部已把 reusable=false 折叠为 reject
538
+ monkeypatch.setattr(croute, "_llm_adjudicate", fake_adj)
539
+ r = await client.get(f"/api/sessions/{sid}/skill-suggest")
540
+ assert r.json()["pending"] is None
541
+ assert not (ws / ".loadn" / "skill-suggest.json").exists(), "一次性澄清不该存活"
542
+
543
+
544
+ async def test_llm_adjudicate_reusable_true_general_discipline(client, monkeypatch):
545
+ """>>> VA 对照:通用纪律(先建 venv 再装依赖)reusable=true → 正常出卡。"""
546
+ from loadn_webui.api.routes import consolidate as croute
547
+ from loadn_webui.config import PATHS
548
+ r = await client.post("/api/sessions", json={"title": "价值门通"})
549
+ sid = r.json()["session"]["id"]
550
+ ws = PATHS["workspace"] / sid
551
+ card = {"kind": "correct", "fingerprint": "fpvg2", "name": "venv-first",
552
+ "description": "x", "trigger": "不对,应该先建 venv 再装依赖",
553
+ "body": "# 用户教导(correct)\n\n> 不对,应该先建 venv\n\n"
554
+ "## 应遵循的规则\n\n先建 venv",
555
+ "origin_session": sid, "created_at": "now"}
556
+ (ws / ".loadn").mkdir(parents=True, exist_ok=True)
557
+ (ws / ".loadn" / "skill-suggest.json").write_text(json.dumps(card, ensure_ascii=False))
558
+ async def fake_adj(c):
559
+ return {"verdict": "correct", "rule": "Python 安装先建 venv 再 pip",
560
+ "reusable": True} # 真判定带 reusable=true 原样传递
561
+ monkeypatch.setattr(croute, "_llm_adjudicate", fake_adj)
562
+ r = await client.get(f"/api/sessions/{sid}/skill-suggest")
563
+ p = r.json()["pending"]
564
+ assert p and p["adjudicated"] is True, "通用纪律应正常出卡"
@@ -90,3 +90,33 @@ def test_pick_name_pool_first(tmp_path):
90
90
  cwd=tmp_path, session_id="s", home=home)
91
91
  mgr3._n = 1
92
92
  assert mgr3._pick_name() == AGENT_NAME_POOL[0], "坏池文件=空池回落"
93
+
94
+
95
+ def test_pick_name_forced_employee_identity(tmp_path):
96
+ """>>> 人卡合一(DW 点名派发修复):subagent_type 命中自定义员工类型时
97
+ agent_name 用员工名(生产实证 9b71:点名郑明衡,卡片显示池工陈沐阳
98
+ ——persona 生效但名字人格分裂);内建类型不 forced 仍走池;同名
99
+ 防撞追加 ·N。"""
100
+ import json as _json
101
+ home = tmp_path / "h"
102
+ home.mkdir()
103
+ (home / "temp_pool.json").write_text(
104
+ _json.dumps({"names": ["陈沐阳", "林晓悦"]}, ensure_ascii=False),
105
+ encoding="utf-8")
106
+ mgr = SubagentManager(
107
+ registry=None, provider_factory=None, cwd=tmp_path, session_id="s",
108
+ home=home,
109
+ extra_types={"郑明衡": {"tools": None, "system_add": "产品分析师"},
110
+ "林知夏": {"tools": None, "system_add": "产品经理"}})
111
+ mgr._n = 1
112
+ # 点名员工:名字=员工名(不吃池)
113
+ assert mgr._pick_name(forced="郑明衡") == "郑明衡"
114
+ assert mgr._pick_name(forced="林知夏") == "林知夏"
115
+ # 同名并发:防撞 ·N
116
+ mgr._n = 3
117
+ assert mgr._pick_name(forced="郑明衡") == "郑明衡·3"
118
+ # 未 forced:池取名不变(回归)
119
+ assert mgr._pick_name() in {"陈沐阳", "林晓悦"}
120
+ # task() 派发链:custom_types 判据——点名员工的 Task 卡 agent_name=员工名
121
+ assert mgr.custom_types == {"郑明衡", "林知夏"}
122
+ assert "郑明衡" in mgr.types and "general" in mgr.types
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes