noeta 1.0.0rc1__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 (1054) hide show
  1. noeta-1.0.0rc1/.editorconfig +25 -0
  2. noeta-1.0.0rc1/.env.example +23 -0
  3. noeta-1.0.0rc1/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
  4. noeta-1.0.0rc1/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. noeta-1.0.0rc1/.github/ISSUE_TEMPLATE/feature_request.md +30 -0
  6. noeta-1.0.0rc1/.github/PULL_REQUEST_TEMPLATE.md +32 -0
  7. noeta-1.0.0rc1/.github/workflows/ci.yml +102 -0
  8. noeta-1.0.0rc1/.github/workflows/docs.yml +85 -0
  9. noeta-1.0.0rc1/.github/workflows/release.yml +73 -0
  10. noeta-1.0.0rc1/.gitignore +73 -0
  11. noeta-1.0.0rc1/.python-version +1 -0
  12. noeta-1.0.0rc1/AGENTS.md +81 -0
  13. noeta-1.0.0rc1/CHANGELOG.md +1728 -0
  14. noeta-1.0.0rc1/CODE_OF_CONDUCT.md +132 -0
  15. noeta-1.0.0rc1/CONTEXT.md +216 -0
  16. noeta-1.0.0rc1/CONTRIBUTING.md +90 -0
  17. noeta-1.0.0rc1/LICENSE +201 -0
  18. noeta-1.0.0rc1/Makefile +141 -0
  19. noeta-1.0.0rc1/PKG-INFO +215 -0
  20. noeta-1.0.0rc1/README.md +168 -0
  21. noeta-1.0.0rc1/SECURITY.md +93 -0
  22. noeta-1.0.0rc1/bench/README.md +633 -0
  23. noeta-1.0.0rc1/bench/compare.py +974 -0
  24. noeta-1.0.0rc1/bench/harbor_adapter.py +457 -0
  25. noeta-1.0.0rc1/bench/merge_sample40.py +122 -0
  26. noeta-1.0.0rc1/bench/quick6_table.py +91 -0
  27. noeta-1.0.0rc1/bench/run_benchmark.sh +353 -0
  28. noeta-1.0.0rc1/bench/run_quick6_compare.sh +29 -0
  29. noeta-1.0.0rc1/bench/summarize.py +112 -0
  30. noeta-1.0.0rc1/desktop/e2e/app.spec.ts +133 -0
  31. noeta-1.0.0rc1/desktop/e2e/noeta +5 -0
  32. noeta-1.0.0rc1/desktop/electron-builder.yml +18 -0
  33. noeta-1.0.0rc1/desktop/package-lock.json +5230 -0
  34. noeta-1.0.0rc1/desktop/package.json +26 -0
  35. noeta-1.0.0rc1/desktop/playwright.config.ts +11 -0
  36. noeta-1.0.0rc1/desktop/screenshots/01-new-session.png +0 -0
  37. noeta-1.0.0rc1/desktop/screenshots/02-reply.png +0 -0
  38. noeta-1.0.0rc1/desktop/screenshots/03-missing-noeta.png +0 -0
  39. noeta-1.0.0rc1/desktop/screenshots/04-server-stopped.png +0 -0
  40. noeta-1.0.0rc1/desktop/screenshots/README.md +31 -0
  41. noeta-1.0.0rc1/desktop/src/main.ts +264 -0
  42. noeta-1.0.0rc1/desktop/src/preload.ts +21 -0
  43. noeta-1.0.0rc1/desktop/src/server.ts +176 -0
  44. noeta-1.0.0rc1/desktop/src/settings.ts +91 -0
  45. noeta-1.0.0rc1/desktop/src/shell.ts +119 -0
  46. noeta-1.0.0rc1/desktop/test/preload.test.ts +55 -0
  47. noeta-1.0.0rc1/desktop/test/server.test.ts +190 -0
  48. noeta-1.0.0rc1/desktop/test/shell.test.ts +131 -0
  49. noeta-1.0.0rc1/desktop/tsconfig.build.json +5 -0
  50. noeta-1.0.0rc1/desktop/tsconfig.json +17 -0
  51. noeta-1.0.0rc1/desktop/vitest.config.ts +3 -0
  52. noeta-1.0.0rc1/docs/.npmrc +3 -0
  53. noeta-1.0.0rc1/docs/.vitepress/config.ts +127 -0
  54. noeta-1.0.0rc1/docs/.vitepress/theme/Diagram.vue +42 -0
  55. noeta-1.0.0rc1/docs/.vitepress/theme/custom.css +241 -0
  56. noeta-1.0.0rc1/docs/.vitepress/theme/diagrams.generated.css +33 -0
  57. noeta-1.0.0rc1/docs/.vitepress/theme/index.ts +14 -0
  58. noeta-1.0.0rc1/docs/adr/001-task-is-an-event-log-with-one-writer.md +48 -0
  59. noeta-1.0.0rc1/docs/adr/002-one-extension-interface-and-entry-points.md +45 -0
  60. noeta-1.0.0rc1/docs/adr/003-claude-code-is-the-model-visible-contract.md +43 -0
  61. noeta-1.0.0rc1/docs/adr/004-noeta-reads-only-its-own-config-places.md +39 -0
  62. noeta-1.0.0rc1/docs/adr/005-holds-with-epochs-and-hold-lost.md +43 -0
  63. noeta-1.0.0rc1/docs/adr/006-fold-snapshots.md +39 -0
  64. noeta-1.0.0rc1/docs/adr/007-tenants.md +44 -0
  65. noeta-1.0.0rc1/docs/adr/008-sandbox-protected-path-placeholders.md +46 -0
  66. noeta-1.0.0rc1/docs/adr/009-serve-requires-a-token.md +38 -0
  67. noeta-1.0.0rc1/docs/adr/010-nothing-uploaded-by-default.md +33 -0
  68. noeta-1.0.0rc1/docs/adr/011-one-holding-worker-per-tree.md +42 -0
  69. noeta-1.0.0rc1/docs/adr/012-snapshots-follow-state-size.md +36 -0
  70. noeta-1.0.0rc1/docs/adr/013-server-token-kept-as-a-digest.md +42 -0
  71. noeta-1.0.0rc1/docs/adr/014-tenants-separated-at-the-api-tools-need-an-os-boundary.md +65 -0
  72. noeta-1.0.0rc1/docs/adr/015-a-held-tree-runs-only-on-its-holder.md +40 -0
  73. noeta-1.0.0rc1/docs/adr/016-deferred-tool-loading-stays-in-the-kernel-for-now.md +49 -0
  74. noeta-1.0.0rc1/docs/adr/017-deferred-tool-loading-is-a-plugin.md +57 -0
  75. noeta-1.0.0rc1/docs/adr/018-each-tenant-has-its-own-places-on-disk.md +55 -0
  76. noeta-1.0.0rc1/docs/adr/019-tenant-limits-are-enforced-by-the-kernel.md +56 -0
  77. noeta-1.0.0rc1/docs/adr/020-claude-code-wording-is-allowed-where-it-serves-parity.md +43 -0
  78. noeta-1.0.0rc1/docs/adr/021-a-tenant-reads-all-but-a-protected-set-and-writes-only-its-own-places.md +50 -0
  79. noeta-1.0.0rc1/docs/adr/022-the-model-catalog-is-kernel-data.md +31 -0
  80. noeta-1.0.0rc1/docs/adr/023-snapshots-per-fold-version-and-newer-logs-left-to-newer-workers.md +56 -0
  81. noeta-1.0.0rc1/docs/adr/024-a-hold-takes-back-lapsed-claims-and-a-held-tree-stays-on-its-holders-queues.md +59 -0
  82. noeta-1.0.0rc1/docs/adr/025-every-model-call-checks-the-budget-before-it-is-made.md +45 -0
  83. noeta-1.0.0rc1/docs/adr/026-a-blocked-prompt-is-erased-by-a-core-record.md +60 -0
  84. noeta-1.0.0rc1/docs/adr/027-the-store-refuses-a-child-off-its-held-trees-queues-and-a-reclaim-counts-toward-the-limit.md +56 -0
  85. noeta-1.0.0rc1/docs/adr/028-no-tenants-in-noeta.md +58 -0
  86. noeta-1.0.0rc1/docs/adr/029-a-task-keeps-its-own-claim-while-it-owns-process-bound-work.md +61 -0
  87. noeta-1.0.0rc1/docs/adr/030-the-log-is-the-only-full-transcript.md +41 -0
  88. noeta-1.0.0rc1/docs/adr/031-background-plugin-work-returns-through-the-inbox.md +52 -0
  89. noeta-1.0.0rc1/docs/adr/index.md +66 -0
  90. noeta-1.0.0rc1/docs/assets/logo/noeta-icon.svg +9 -0
  91. noeta-1.0.0rc1/docs/assets/logo/noeta-logo-dark.svg +12 -0
  92. noeta-1.0.0rc1/docs/assets/logo/noeta-logo-light.svg +12 -0
  93. noeta-1.0.0rc1/docs/benchmarks.md +186 -0
  94. noeta-1.0.0rc1/docs/diagrams/core-architecture.en.svg +82 -0
  95. noeta-1.0.0rc1/docs/diagrams/core-architecture.zh.svg +82 -0
  96. noeta-1.0.0rc1/docs/diagrams/core-claim-epochs.en.svg +69 -0
  97. noeta-1.0.0rc1/docs/diagrams/core-claim-epochs.zh.svg +69 -0
  98. noeta-1.0.0rc1/docs/diagrams/core-event-log.en.svg +79 -0
  99. noeta-1.0.0rc1/docs/diagrams/core-event-log.zh.svg +79 -0
  100. noeta-1.0.0rc1/docs/diagrams/core-inbox.en.svg +67 -0
  101. noeta-1.0.0rc1/docs/diagrams/core-inbox.zh.svg +67 -0
  102. noeta-1.0.0rc1/docs/diagrams/core-kept-claim.en.svg +51 -0
  103. noeta-1.0.0rc1/docs/diagrams/core-kept-claim.zh.svg +51 -0
  104. noeta-1.0.0rc1/docs/diagrams/core-kernel-plugins.en.svg +75 -0
  105. noeta-1.0.0rc1/docs/diagrams/core-kernel-plugins.zh.svg +75 -0
  106. noeta-1.0.0rc1/docs/diagrams/core-layers.en.svg +40 -0
  107. noeta-1.0.0rc1/docs/diagrams/core-layers.zh.svg +40 -0
  108. noeta-1.0.0rc1/docs/diagrams/core-log-vs-fold.en.svg +34 -0
  109. noeta-1.0.0rc1/docs/diagrams/core-log-vs-fold.zh.svg +34 -0
  110. noeta-1.0.0rc1/docs/diagrams/core-park-wake.en.svg +39 -0
  111. noeta-1.0.0rc1/docs/diagrams/core-park-wake.zh.svg +39 -0
  112. noeta-1.0.0rc1/docs/diagrams/core-snapshot.en.svg +79 -0
  113. noeta-1.0.0rc1/docs/diagrams/core-snapshot.zh.svg +78 -0
  114. noeta-1.0.0rc1/docs/diagrams/core-step.en.svg +79 -0
  115. noeta-1.0.0rc1/docs/diagrams/core-step.zh.svg +79 -0
  116. noeta-1.0.0rc1/docs/diagrams/core-task-states.en.svg +42 -0
  117. noeta-1.0.0rc1/docs/diagrams/core-task-states.zh.svg +42 -0
  118. noeta-1.0.0rc1/docs/diagrams/core-tool-gates.en.svg +66 -0
  119. noeta-1.0.0rc1/docs/diagrams/core-tool-gates.zh.svg +66 -0
  120. noeta-1.0.0rc1/docs/diagrams/core-tool-recovery.en.svg +41 -0
  121. noeta-1.0.0rc1/docs/diagrams/core-tool-recovery.zh.svg +41 -0
  122. noeta-1.0.0rc1/docs/diagrams/ctx-cache-breakpoints.en.svg +32 -0
  123. noeta-1.0.0rc1/docs/diagrams/ctx-cache-breakpoints.zh.svg +32 -0
  124. noeta-1.0.0rc1/docs/diagrams/ctx-compaction.en.svg +45 -0
  125. noeta-1.0.0rc1/docs/diagrams/ctx-compaction.zh.svg +44 -0
  126. noeta-1.0.0rc1/docs/diagrams/ctx-large-output.en.svg +44 -0
  127. noeta-1.0.0rc1/docs/diagrams/ctx-large-output.zh.svg +44 -0
  128. noeta-1.0.0rc1/docs/diagrams/ctx-log-fold.en.svg +46 -0
  129. noeta-1.0.0rc1/docs/diagrams/ctx-log-fold.zh.svg +46 -0
  130. noeta-1.0.0rc1/docs/diagrams/ctx-precompute.en.svg +46 -0
  131. noeta-1.0.0rc1/docs/diagrams/ctx-precompute.zh.svg +46 -0
  132. noeta-1.0.0rc1/docs/diagrams/ctx-request-layout.en.svg +43 -0
  133. noeta-1.0.0rc1/docs/diagrams/ctx-request-layout.zh.svg +43 -0
  134. noeta-1.0.0rc1/docs/diagrams/ctx-window.en.svg +34 -0
  135. noeta-1.0.0rc1/docs/diagrams/ctx-window.zh.svg +34 -0
  136. noeta-1.0.0rc1/docs/diagrams/guide-gates.en.svg +60 -0
  137. noeta-1.0.0rc1/docs/diagrams/guide-gates.zh.svg +60 -0
  138. noeta-1.0.0rc1/docs/diagrams/guide-instructions-sources.en.svg +45 -0
  139. noeta-1.0.0rc1/docs/diagrams/guide-instructions-sources.zh.svg +45 -0
  140. noeta-1.0.0rc1/docs/diagrams/guide-permission-decision.en.svg +61 -0
  141. noeta-1.0.0rc1/docs/diagrams/guide-permission-decision.zh.svg +61 -0
  142. noeta-1.0.0rc1/docs/diagrams/guide-skills-lookup.en.svg +49 -0
  143. noeta-1.0.0rc1/docs/diagrams/guide-skills-lookup.zh.svg +49 -0
  144. noeta-1.0.0rc1/docs/diagrams/guide-stream-json.en.svg +48 -0
  145. noeta-1.0.0rc1/docs/diagrams/guide-stream-json.zh.svg +48 -0
  146. noeta-1.0.0rc1/docs/diagrams/guide-ways-in.en.svg +66 -0
  147. noeta-1.0.0rc1/docs/diagrams/guide-ways-in.zh.svg +66 -0
  148. noeta-1.0.0rc1/docs/diagrams/guide2-child-wait.en.svg +53 -0
  149. noeta-1.0.0rc1/docs/diagrams/guide2-child-wait.zh.svg +53 -0
  150. noeta-1.0.0rc1/docs/diagrams/guide2-execenvs.en.svg +34 -0
  151. noeta-1.0.0rc1/docs/diagrams/guide2-execenvs.zh.svg +34 -0
  152. noeta-1.0.0rc1/docs/diagrams/guide2-mcp.en.svg +62 -0
  153. noeta-1.0.0rc1/docs/diagrams/guide2-mcp.zh.svg +62 -0
  154. noeta-1.0.0rc1/docs/diagrams/guide2-plugin-install.en.svg +41 -0
  155. noeta-1.0.0rc1/docs/diagrams/guide2-plugin-install.zh.svg +41 -0
  156. noeta-1.0.0rc1/docs/diagrams/guide2-plugin-shapes.en.svg +44 -0
  157. noeta-1.0.0rc1/docs/diagrams/guide2-plugin-shapes.zh.svg +44 -0
  158. noeta-1.0.0rc1/docs/diagrams/guide2-sandbox.en.svg +40 -0
  159. noeta-1.0.0rc1/docs/diagrams/guide2-sandbox.zh.svg +40 -0
  160. noeta-1.0.0rc1/docs/diagrams/guide2-server-deploy.en.svg +59 -0
  161. noeta-1.0.0rc1/docs/diagrams/guide2-server-deploy.zh.svg +59 -0
  162. noeta-1.0.0rc1/docs/diagrams/guide2-task-tree.en.svg +45 -0
  163. noeta-1.0.0rc1/docs/diagrams/guide2-task-tree.zh.svg +45 -0
  164. noeta-1.0.0rc1/docs/diagrams/home-overview.en.svg +87 -0
  165. noeta-1.0.0rc1/docs/diagrams/home-overview.zh.svg +87 -0
  166. noeta-1.0.0rc1/docs/diagrams/model-retry.en.svg +45 -0
  167. noeta-1.0.0rc1/docs/diagrams/model-retry.zh.svg +45 -0
  168. noeta-1.0.0rc1/docs/diagrams/model-routing.en.svg +51 -0
  169. noeta-1.0.0rc1/docs/diagrams/model-routing.zh.svg +49 -0
  170. noeta-1.0.0rc1/docs/diagrams/multi-deploy.en.svg +55 -0
  171. noeta-1.0.0rc1/docs/diagrams/multi-deploy.zh.svg +54 -0
  172. noeta-1.0.0rc1/docs/diagrams/multi-live-output.en.svg +40 -0
  173. noeta-1.0.0rc1/docs/diagrams/multi-live-output.zh.svg +40 -0
  174. noeta-1.0.0rc1/docs/diagrams/ops-plugin-missing.en.svg +42 -0
  175. noeta-1.0.0rc1/docs/diagrams/ops-plugin-missing.zh.svg +42 -0
  176. noeta-1.0.0rc1/docs/diagrams/parity-replay.en.svg +52 -0
  177. noeta-1.0.0rc1/docs/diagrams/parity-replay.zh.svg +52 -0
  178. noeta-1.0.0rc1/docs/diagrams/plug-hooks.en.svg +61 -0
  179. noeta-1.0.0rc1/docs/diagrams/plug-hooks.zh.svg +61 -0
  180. noeta-1.0.0rc1/docs/diagrams/plug-registry.en.svg +47 -0
  181. noeta-1.0.0rc1/docs/diagrams/plug-registry.zh.svg +47 -0
  182. noeta-1.0.0rc1/docs/diagrams/plug-state.en.svg +34 -0
  183. noeta-1.0.0rc1/docs/diagrams/plug-state.zh.svg +34 -0
  184. noeta-1.0.0rc1/docs/diagrams/ref-http-stream.en.svg +44 -0
  185. noeta-1.0.0rc1/docs/diagrams/ref-http-stream.zh.svg +44 -0
  186. noeta-1.0.0rc1/docs/diagrams/ref-request-guard.en.svg +43 -0
  187. noeta-1.0.0rc1/docs/diagrams/ref-request-guard.zh.svg +43 -0
  188. noeta-1.0.0rc1/docs/diagrams/ref-ways-in.en.svg +51 -0
  189. noeta-1.0.0rc1/docs/diagrams/ref-ways-in.zh.svg +51 -0
  190. noeta-1.0.0rc1/docs/diagrams/start-config-places.en.svg +44 -0
  191. noeta-1.0.0rc1/docs/diagrams/start-config-places.zh.svg +44 -0
  192. noeta-1.0.0rc1/docs/diagrams/start-embedding.en.svg +53 -0
  193. noeta-1.0.0rc1/docs/diagrams/start-embedding.zh.svg +53 -0
  194. noeta-1.0.0rc1/docs/diagrams/theme.mjs +58 -0
  195. noeta-1.0.0rc1/docs/gc.md +48 -0
  196. noeta-1.0.0rc1/docs/guides/front-ends.md +173 -0
  197. noeta-1.0.0rc1/docs/guides/mcp.md +277 -0
  198. noeta-1.0.0rc1/docs/guides/memory-and-instructions.md +181 -0
  199. noeta-1.0.0rc1/docs/guides/models.md +218 -0
  200. noeta-1.0.0rc1/docs/guides/permissions.md +277 -0
  201. noeta-1.0.0rc1/docs/guides/plugins.md +477 -0
  202. noeta-1.0.0rc1/docs/guides/sandbox.md +252 -0
  203. noeta-1.0.0rc1/docs/guides/server.md +273 -0
  204. noeta-1.0.0rc1/docs/guides/skills-and-agents.md +251 -0
  205. noeta-1.0.0rc1/docs/guides/subagents.md +287 -0
  206. noeta-1.0.0rc1/docs/guides/terminal.md +337 -0
  207. noeta-1.0.0rc1/docs/how-it-works/context.md +388 -0
  208. noeta-1.0.0rc1/docs/how-it-works/event-log.md +259 -0
  209. noeta-1.0.0rc1/docs/how-it-works/index.md +129 -0
  210. noeta-1.0.0rc1/docs/how-it-works/many-machines.md +150 -0
  211. noeta-1.0.0rc1/docs/how-it-works/models.md +189 -0
  212. noeta-1.0.0rc1/docs/how-it-works/one-step.md +232 -0
  213. noeta-1.0.0rc1/docs/how-it-works/parity.md +150 -0
  214. noeta-1.0.0rc1/docs/how-it-works/plugins.md +239 -0
  215. noeta-1.0.0rc1/docs/how-it-works/recovery.md +217 -0
  216. noeta-1.0.0rc1/docs/how-it-works/waiting.md +213 -0
  217. noeta-1.0.0rc1/docs/index.md +111 -0
  218. noeta-1.0.0rc1/docs/operations/comparison.md +163 -0
  219. noeta-1.0.0rc1/docs/operations/limitations.md +152 -0
  220. noeta-1.0.0rc1/docs/operations/troubleshooting.md +228 -0
  221. noeta-1.0.0rc1/docs/package-lock.json +2700 -0
  222. noeta-1.0.0rc1/docs/package.json +15 -0
  223. noeta-1.0.0rc1/docs/public/logo.svg +9 -0
  224. noeta-1.0.0rc1/docs/public/og.png +0 -0
  225. noeta-1.0.0rc1/docs/reference/cli.md +301 -0
  226. noeta-1.0.0rc1/docs/reference/config.md +227 -0
  227. noeta-1.0.0rc1/docs/reference/events.md +191 -0
  228. noeta-1.0.0rc1/docs/reference/extension.md +262 -0
  229. noeta-1.0.0rc1/docs/reference/http-api.md +246 -0
  230. noeta-1.0.0rc1/docs/reference/plugins.md +565 -0
  231. noeta-1.0.0rc1/docs/reference/python-api.md +227 -0
  232. noeta-1.0.0rc1/docs/reference/tools.md +455 -0
  233. noeta-1.0.0rc1/docs/releasing.md +21 -0
  234. noeta-1.0.0rc1/docs/reviewing.md +48 -0
  235. noeta-1.0.0rc1/docs/scripts/diagrams.mjs +66 -0
  236. noeta-1.0.0rc1/docs/specs/2026-10-26-noeta-1-0-redesign.md +420 -0
  237. noeta-1.0.0rc1/docs/specs/2026-10-26-prompt-regression-eval.md +159 -0
  238. noeta-1.0.0rc1/docs/specs/2026-10-29-open-source-follow-ups.md +129 -0
  239. noeta-1.0.0rc1/docs/specs/TEMPLATE.md +29 -0
  240. noeta-1.0.0rc1/docs/specs/archive/2026-10-27-extension-surface.md +86 -0
  241. noeta-1.0.0rc1/docs/specs/archive/2026-10-27-layout-split.md +155 -0
  242. noeta-1.0.0rc1/docs/specs/archive/2026-10-27-noeta-1-0-layout.md +145 -0
  243. noeta-1.0.0rc1/docs/specs/archive/2026-10-27-tree-hold-and-plugin-files.md +118 -0
  244. noeta-1.0.0rc1/docs/specs/archive/2026-10-28-claude-code-parity.md +651 -0
  245. noeta-1.0.0rc1/docs/specs/archive/2026-10-28-open-source-release.md +727 -0
  246. noeta-1.0.0rc1/docs/specs/archive/2026-10-29-best-of-three.md +337 -0
  247. noeta-1.0.0rc1/docs/specs/archive/2026-10-29-drop-tenants.md +65 -0
  248. noeta-1.0.0rc1/docs/specs/archive/2026-10-30-bench-findings-capture.json +273 -0
  249. noeta-1.0.0rc1/docs/specs/archive/2026-10-30-bench-findings.md +144 -0
  250. noeta-1.0.0rc1/docs/specs/archive/2026-10-30-commands-inherit-the-environment.md +140 -0
  251. noeta-1.0.0rc1/docs/specs/archive/2026-11-01-empty-turn.md +213 -0
  252. noeta-1.0.0rc1/docs/specs/archive/2026-11-02-context-audit-closure.md +273 -0
  253. noeta-1.0.0rc1/docs/specs/archive/2026-11-02-context-final-closure.md +157 -0
  254. noeta-1.0.0rc1/docs/specs/archive/2026-11-02-context-reaudit-closure.md +558 -0
  255. noeta-1.0.0rc1/docs/specs/archive/2026-11-02-task-tools.md +180 -0
  256. noeta-1.0.0rc1/docs/specs/archive/2026-11-03-multi-provider.md +153 -0
  257. noeta-1.0.0rc1/docs/specs/archive/2026-11-03-plugin-splits.md +133 -0
  258. noeta-1.0.0rc1/docs/specs/archive/2026-11-03-shell-deny-paths.md +76 -0
  259. noeta-1.0.0rc1/docs/specs/archive/2026-11-04-front-end-alignment-gaps.md +128 -0
  260. noeta-1.0.0rc1/docs/specs/archive/2026-11-04-v1-finish.md +276 -0
  261. noeta-1.0.0rc1/docs/specs/archive/2026-11-05-history-out-of-snapshots.md +85 -0
  262. noeta-1.0.0rc1/docs/specs/archive/2026-11-05-long-context-handling.md +151 -0
  263. noeta-1.0.0rc1/docs/start/configuration.md +246 -0
  264. noeta-1.0.0rc1/docs/start/embedding.md +265 -0
  265. noeta-1.0.0rc1/docs/start/quickstart.md +189 -0
  266. noeta-1.0.0rc1/docs/why-noeta.md +102 -0
  267. noeta-1.0.0rc1/docs/zh/benchmarks.md +164 -0
  268. noeta-1.0.0rc1/docs/zh/guides/front-ends.md +111 -0
  269. noeta-1.0.0rc1/docs/zh/guides/mcp.md +180 -0
  270. noeta-1.0.0rc1/docs/zh/guides/memory-and-instructions.md +125 -0
  271. noeta-1.0.0rc1/docs/zh/guides/models.md +167 -0
  272. noeta-1.0.0rc1/docs/zh/guides/permissions.md +187 -0
  273. noeta-1.0.0rc1/docs/zh/guides/plugins.md +337 -0
  274. noeta-1.0.0rc1/docs/zh/guides/sandbox.md +156 -0
  275. noeta-1.0.0rc1/docs/zh/guides/server.md +151 -0
  276. noeta-1.0.0rc1/docs/zh/guides/skills-and-agents.md +193 -0
  277. noeta-1.0.0rc1/docs/zh/guides/subagents.md +174 -0
  278. noeta-1.0.0rc1/docs/zh/guides/terminal.md +256 -0
  279. noeta-1.0.0rc1/docs/zh/how-it-works/context.md +198 -0
  280. noeta-1.0.0rc1/docs/zh/how-it-works/event-log.md +154 -0
  281. noeta-1.0.0rc1/docs/zh/how-it-works/index.md +85 -0
  282. noeta-1.0.0rc1/docs/zh/how-it-works/many-machines.md +86 -0
  283. noeta-1.0.0rc1/docs/zh/how-it-works/models.md +113 -0
  284. noeta-1.0.0rc1/docs/zh/how-it-works/one-step.md +143 -0
  285. noeta-1.0.0rc1/docs/zh/how-it-works/parity.md +79 -0
  286. noeta-1.0.0rc1/docs/zh/how-it-works/plugins.md +140 -0
  287. noeta-1.0.0rc1/docs/zh/how-it-works/recovery.md +126 -0
  288. noeta-1.0.0rc1/docs/zh/how-it-works/waiting.md +108 -0
  289. noeta-1.0.0rc1/docs/zh/index.md +105 -0
  290. noeta-1.0.0rc1/docs/zh/operations/comparison.md +144 -0
  291. noeta-1.0.0rc1/docs/zh/operations/limitations.md +110 -0
  292. noeta-1.0.0rc1/docs/zh/operations/troubleshooting.md +202 -0
  293. noeta-1.0.0rc1/docs/zh/reference/cli.md +282 -0
  294. noeta-1.0.0rc1/docs/zh/reference/config.md +216 -0
  295. noeta-1.0.0rc1/docs/zh/reference/events.md +170 -0
  296. noeta-1.0.0rc1/docs/zh/reference/extension.md +247 -0
  297. noeta-1.0.0rc1/docs/zh/reference/http-api.md +224 -0
  298. noeta-1.0.0rc1/docs/zh/reference/plugins.md +440 -0
  299. noeta-1.0.0rc1/docs/zh/reference/python-api.md +219 -0
  300. noeta-1.0.0rc1/docs/zh/reference/tools.md +384 -0
  301. noeta-1.0.0rc1/docs/zh/start/configuration.md +223 -0
  302. noeta-1.0.0rc1/docs/zh/start/embedding.md +243 -0
  303. noeta-1.0.0rc1/docs/zh/start/quickstart.md +175 -0
  304. noeta-1.0.0rc1/docs/zh/why-noeta.md +86 -0
  305. noeta-1.0.0rc1/evals/__init__.py +5 -0
  306. noeta-1.0.0rc1/evals/__main__.py +266 -0
  307. noeta-1.0.0rc1/evals/baseline.json +536 -0
  308. noeta-1.0.0rc1/evals/core.py +296 -0
  309. noeta-1.0.0rc1/evals/engine.py +440 -0
  310. noeta-1.0.0rc1/evals/fixtures.py +821 -0
  311. noeta-1.0.0rc1/evals/live_env.py +46 -0
  312. noeta-1.0.0rc1/evals/scenarios.py +1158 -0
  313. noeta-1.0.0rc1/examples/chat-approvals/README.md +25 -0
  314. noeta-1.0.0rc1/examples/chat-approvals/chat_approvals.py +93 -0
  315. noeta-1.0.0rc1/examples/chat-approvals/tests/test_chat_approvals.py +115 -0
  316. noeta-1.0.0rc1/examples/chat-bridge/README.md +31 -0
  317. noeta-1.0.0rc1/examples/chat-bridge/chat_bridge.py +93 -0
  318. noeta-1.0.0rc1/examples/chat-bridge/tests/test_chat_bridge.py +146 -0
  319. noeta-1.0.0rc1/examples/hello-plugin/README.md +38 -0
  320. noeta-1.0.0rc1/examples/hello-plugin/pyproject.toml +18 -0
  321. noeta-1.0.0rc1/examples/hello-plugin/src/noeta_hello/__init__.py +106 -0
  322. noeta-1.0.0rc1/examples/hello-plugin/tests/test_hello.py +97 -0
  323. noeta-1.0.0rc1/examples/house-style/README.md +18 -0
  324. noeta-1.0.0rc1/examples/house-style/house_style.py +52 -0
  325. noeta-1.0.0rc1/examples/house-style/tests/test_house_style.py +72 -0
  326. noeta-1.0.0rc1/examples/run-tests/README.md +16 -0
  327. noeta-1.0.0rc1/examples/run-tests/run_tests.py +71 -0
  328. noeta-1.0.0rc1/examples/run-tests/tests/test_run_tests.py +86 -0
  329. noeta-1.0.0rc1/noeta/__init__.py +140 -0
  330. noeta-1.0.0rc1/noeta/agents/__init__.py +89 -0
  331. noeta-1.0.0rc1/noeta/agents/agent_files.py +521 -0
  332. noeta-1.0.0rc1/noeta/agents/files/explore.md +61 -0
  333. noeta-1.0.0rc1/noeta/agents/files/general-purpose.md +47 -0
  334. noeta-1.0.0rc1/noeta/agents/files/main.md +63 -0
  335. noeta-1.0.0rc1/noeta/agents/files/plan.md +56 -0
  336. noeta-1.0.0rc1/noeta/backends/__init__.py +0 -0
  337. noeta-1.0.0rc1/noeta/backends/execenvs/__init__.py +0 -0
  338. noeta-1.0.0rc1/noeta/backends/execenvs/container.py +376 -0
  339. noeta-1.0.0rc1/noeta/backends/execenvs/container_provision.py +247 -0
  340. noeta-1.0.0rc1/noeta/backends/execenvs/local.py +470 -0
  341. noeta-1.0.0rc1/noeta/backends/execenvs/sandbox.py +309 -0
  342. noeta-1.0.0rc1/noeta/backends/execenvs/sandbox_bridge.py +216 -0
  343. noeta-1.0.0rc1/noeta/backends/execenvs/sandbox_plan.py +490 -0
  344. noeta-1.0.0rc1/noeta/backends/execenvs/sandbox_proxy.py +370 -0
  345. noeta-1.0.0rc1/noeta/backends/providers/__init__.py +79 -0
  346. noeta-1.0.0rc1/noeta/backends/providers/_anthropic_stream.py +393 -0
  347. noeta-1.0.0rc1/noeta/backends/providers/_anthropic_user_id.py +26 -0
  348. noeta-1.0.0rc1/noeta/backends/providers/_anthropic_wire.py +471 -0
  349. noeta-1.0.0rc1/noeta/backends/providers/_common.py +559 -0
  350. noeta-1.0.0rc1/noeta/backends/providers/_openai_compat_stream.py +278 -0
  351. noeta-1.0.0rc1/noeta/backends/providers/_openai_responses_stream.py +311 -0
  352. noeta-1.0.0rc1/noeta/backends/providers/_sse.py +49 -0
  353. noeta-1.0.0rc1/noeta/backends/providers/anthropic.py +460 -0
  354. noeta-1.0.0rc1/noeta/backends/providers/listing.py +139 -0
  355. noeta-1.0.0rc1/noeta/backends/providers/openai_compat.py +389 -0
  356. noeta-1.0.0rc1/noeta/backends/providers/openai_responses.py +386 -0
  357. noeta-1.0.0rc1/noeta/backends/providers/routing.py +469 -0
  358. noeta-1.0.0rc1/noeta/backends/stores/__init__.py +1 -0
  359. noeta-1.0.0rc1/noeta/backends/stores/_rows.py +38 -0
  360. noeta-1.0.0rc1/noeta/backends/stores/postgres.py +538 -0
  361. noeta-1.0.0rc1/noeta/backends/stores/postgres_conn.py +131 -0
  362. noeta-1.0.0rc1/noeta/backends/stores/postgres_feed.py +236 -0
  363. noeta-1.0.0rc1/noeta/backends/stores/postgres_snapshots.py +57 -0
  364. noeta-1.0.0rc1/noeta/backends/stores/sqlite.py +574 -0
  365. noeta-1.0.0rc1/noeta/cli/__init__.py +3 -0
  366. noeta-1.0.0rc1/noeta/cli/claude_plugins.py +460 -0
  367. noeta-1.0.0rc1/noeta/cli/config.py +913 -0
  368. noeta-1.0.0rc1/noeta/cli/headless.py +395 -0
  369. noeta-1.0.0rc1/noeta/cli/home_dir.py +71 -0
  370. noeta-1.0.0rc1/noeta/cli/main.py +515 -0
  371. noeta-1.0.0rc1/noeta/cli/mcp_command.py +380 -0
  372. noeta-1.0.0rc1/noeta/cli/plugin_command.py +349 -0
  373. noeta-1.0.0rc1/noeta/cli/plugin_options.py +301 -0
  374. noeta-1.0.0rc1/noeta/cli/plugin_policy.py +38 -0
  375. noeta-1.0.0rc1/noeta/cli/server_token.py +90 -0
  376. noeta-1.0.0rc1/noeta/cli/settings_files.py +315 -0
  377. noeta-1.0.0rc1/noeta/cli/trust.py +67 -0
  378. noeta-1.0.0rc1/noeta/core/__init__.py +0 -0
  379. noeta-1.0.0rc1/noeta/core/agent.py +62 -0
  380. noeta-1.0.0rc1/noeta/core/channel.py +146 -0
  381. noeta-1.0.0rc1/noeta/core/client.py +224 -0
  382. noeta-1.0.0rc1/noeta/core/commands.py +116 -0
  383. noeta-1.0.0rc1/noeta/core/errors.py +121 -0
  384. noeta-1.0.0rc1/noeta/core/events.py +201 -0
  385. noeta-1.0.0rc1/noeta/core/execenv.py +112 -0
  386. noeta-1.0.0rc1/noeta/core/extension.py +629 -0
  387. noeta-1.0.0rc1/noeta/core/images.py +276 -0
  388. noeta-1.0.0rc1/noeta/core/large_output.py +266 -0
  389. noeta-1.0.0rc1/noeta/core/loop/__init__.py +0 -0
  390. noeta-1.0.0rc1/noeta/core/loop/decide.py +133 -0
  391. noeta-1.0.0rc1/noeta/core/loop/request.py +105 -0
  392. noeta-1.0.0rc1/noeta/core/loop/state.py +661 -0
  393. noeta-1.0.0rc1/noeta/core/mcp_names.py +191 -0
  394. noeta-1.0.0rc1/noeta/core/models.py +629 -0
  395. noeta-1.0.0rc1/noeta/core/prompts.py +106 -0
  396. noeta-1.0.0rc1/noeta/core/provider.py +34 -0
  397. noeta-1.0.0rc1/noeta/core/questions.py +159 -0
  398. noeta-1.0.0rc1/noeta/core/records.py +407 -0
  399. noeta-1.0.0rc1/noeta/core/registry.py +360 -0
  400. noeta-1.0.0rc1/noeta/core/retry.py +193 -0
  401. noeta-1.0.0rc1/noeta/core/runner/__init__.py +19 -0
  402. noeta-1.0.0rc1/noeta/core/runner/calls.py +445 -0
  403. noeta-1.0.0rc1/noeta/core/runner/closing.py +163 -0
  404. noeta-1.0.0rc1/noeta/core/runner/model.py +259 -0
  405. noeta-1.0.0rc1/noeta/core/runner/runtime.py +327 -0
  406. noeta-1.0.0rc1/noeta/core/runner/snapshotting.py +126 -0
  407. noeta-1.0.0rc1/noeta/core/runner/task.py +921 -0
  408. noeta-1.0.0rc1/noeta/core/runner/texts.py +87 -0
  409. noeta-1.0.0rc1/noeta/core/runner/timers.py +38 -0
  410. noeta-1.0.0rc1/noeta/core/snapshots.py +227 -0
  411. noeta-1.0.0rc1/noeta/core/store.py +296 -0
  412. noeta-1.0.0rc1/noeta/core/tool.py +303 -0
  413. noeta-1.0.0rc1/noeta/core/tool_input.py +164 -0
  414. noeta-1.0.0rc1/noeta/core/types.py +272 -0
  415. noeta-1.0.0rc1/noeta/host/__init__.py +5 -0
  416. noeta-1.0.0rc1/noeta/host/_acp_updates.py +358 -0
  417. noeta-1.0.0rc1/noeta/host/_errors.py +24 -0
  418. noeta-1.0.0rc1/noeta/host/_http_guard.py +304 -0
  419. noeta-1.0.0rc1/noeta/host/_http_openapi.py +98 -0
  420. noeta-1.0.0rc1/noeta/host/_http_routes.py +253 -0
  421. noeta-1.0.0rc1/noeta/host/_http_stream.py +173 -0
  422. noeta-1.0.0rc1/noeta/host/_stream_json_control.py +284 -0
  423. noeta-1.0.0rc1/noeta/host/_stream_json_wire.py +104 -0
  424. noeta-1.0.0rc1/noeta/host/acp.py +599 -0
  425. noeta-1.0.0rc1/noeta/host/app.py +162 -0
  426. noeta-1.0.0rc1/noeta/host/channels.py +42 -0
  427. noeta-1.0.0rc1/noeta/host/feed.py +25 -0
  428. noeta-1.0.0rc1/noeta/host/files.py +47 -0
  429. noeta-1.0.0rc1/noeta/host/http.py +264 -0
  430. noeta-1.0.0rc1/noeta/host/local.py +322 -0
  431. noeta-1.0.0rc1/noeta/host/pending.py +261 -0
  432. noeta-1.0.0rc1/noeta/host/questions.py +91 -0
  433. noeta-1.0.0rc1/noeta/host/remote.py +238 -0
  434. noeta-1.0.0rc1/noeta/host/rewind.py +207 -0
  435. noeta-1.0.0rc1/noeta/host/spill_sweep.py +102 -0
  436. noeta-1.0.0rc1/noeta/host/stream_json.py +619 -0
  437. noeta-1.0.0rc1/noeta/host/summaries.py +110 -0
  438. noeta-1.0.0rc1/noeta/host/usage.py +182 -0
  439. noeta-1.0.0rc1/noeta/plugins/__init__.py +0 -0
  440. noeta-1.0.0rc1/noeta/plugins/ask_user/__init__.py +399 -0
  441. noeta-1.0.0rc1/noeta/plugins/ask_user/descriptions/AskUserQuestion.md +13 -0
  442. noeta-1.0.0rc1/noeta/plugins/budget.py +168 -0
  443. noeta-1.0.0rc1/noeta/plugins/checkpoints.py +220 -0
  444. noeta-1.0.0rc1/noeta/plugins/compaction/__init__.py +8 -0
  445. noeta-1.0.0rc1/noeta/plugins/compaction/clearing.py +82 -0
  446. noeta-1.0.0rc1/noeta/plugins/compaction/estimate.py +74 -0
  447. noeta-1.0.0rc1/noeta/plugins/compaction/extension.py +1047 -0
  448. noeta-1.0.0rc1/noeta/plugins/compaction/prompts/summarize.md +89 -0
  449. noeta-1.0.0rc1/noeta/plugins/compaction/restore.py +168 -0
  450. noeta-1.0.0rc1/noeta/plugins/compaction/summary.py +336 -0
  451. noeta-1.0.0rc1/noeta/plugins/compaction/transcript.py +39 -0
  452. noeta-1.0.0rc1/noeta/plugins/compaction/window.py +101 -0
  453. noeta-1.0.0rc1/noeta/plugins/empty_reply.py +45 -0
  454. noeta-1.0.0rc1/noeta/plugins/environment/__init__.py +152 -0
  455. noeta-1.0.0rc1/noeta/plugins/environment/extension.py +432 -0
  456. noeta-1.0.0rc1/noeta/plugins/environment/facts.py +181 -0
  457. noeta-1.0.0rc1/noeta/plugins/environment/git.py +176 -0
  458. noeta-1.0.0rc1/noeta/plugins/environment/notes.py +243 -0
  459. noeta-1.0.0rc1/noeta/plugins/findings.py +147 -0
  460. noeta-1.0.0rc1/noeta/plugins/fs/__init__.py +244 -0
  461. noeta-1.0.0rc1/noeta/plugins/fs/_encoding.py +117 -0
  462. noeta-1.0.0rc1/noeta/plugins/fs/_missing.py +52 -0
  463. noeta-1.0.0rc1/noeta/plugins/fs/_mutate.py +262 -0
  464. noeta-1.0.0rc1/noeta/plugins/fs/_read_formats.py +373 -0
  465. noeta-1.0.0rc1/noeta/plugins/fs/changes.py +123 -0
  466. noeta-1.0.0rc1/noeta/plugins/fs/descriptions/edit.md +6 -0
  467. noeta-1.0.0rc1/noeta/plugins/fs/descriptions/notebook_edit.md +6 -0
  468. noeta-1.0.0rc1/noeta/plugins/fs/descriptions/read.md +10 -0
  469. noeta-1.0.0rc1/noeta/plugins/fs/descriptions/write.md +5 -0
  470. noeta-1.0.0rc1/noeta/plugins/fs/edit.py +316 -0
  471. noeta-1.0.0rc1/noeta/plugins/fs/mentions.py +325 -0
  472. noeta-1.0.0rc1/noeta/plugins/fs/notebook.py +210 -0
  473. noeta-1.0.0rc1/noeta/plugins/fs/pasted.py +184 -0
  474. noeta-1.0.0rc1/noeta/plugins/fs/read.py +671 -0
  475. noeta-1.0.0rc1/noeta/plugins/fs/shell_reads.py +129 -0
  476. noeta-1.0.0rc1/noeta/plugins/fs/shell_writes.py +90 -0
  477. noeta-1.0.0rc1/noeta/plugins/fs/state.py +253 -0
  478. noeta-1.0.0rc1/noeta/plugins/fs/write.py +137 -0
  479. noeta-1.0.0rc1/noeta/plugins/hooks/__init__.py +116 -0
  480. noeta-1.0.0rc1/noeta/plugins/hooks/config.py +294 -0
  481. noeta-1.0.0rc1/noeta/plugins/hooks/dispatch.py +669 -0
  482. noeta-1.0.0rc1/noeta/plugins/hooks/extension.py +793 -0
  483. noeta-1.0.0rc1/noeta/plugins/hooks/gates.py +128 -0
  484. noeta-1.0.0rc1/noeta/plugins/hooks/runners.py +453 -0
  485. noeta-1.0.0rc1/noeta/plugins/instructions/__init__.py +14 -0
  486. noeta-1.0.0rc1/noeta/plugins/instructions/extension.py +658 -0
  487. noeta-1.0.0rc1/noeta/plugins/instructions/files.py +425 -0
  488. noeta-1.0.0rc1/noeta/plugins/markdown_commands.py +170 -0
  489. noeta-1.0.0rc1/noeta/plugins/mcp/__init__.py +42 -0
  490. noeta-1.0.0rc1/noeta/plugins/mcp/admin.py +116 -0
  491. noeta-1.0.0rc1/noeta/plugins/mcp/client.py +396 -0
  492. noeta-1.0.0rc1/noeta/plugins/mcp/config.py +293 -0
  493. noeta-1.0.0rc1/noeta/plugins/mcp/descriptions/authenticate.md +1 -0
  494. noeta-1.0.0rc1/noeta/plugins/mcp/descriptions/complete_authentication.md +1 -0
  495. noeta-1.0.0rc1/noeta/plugins/mcp/elicitation.py +154 -0
  496. noeta-1.0.0rc1/noeta/plugins/mcp/extension.py +857 -0
  497. noeta-1.0.0rc1/noeta/plugins/mcp/http_client.py +284 -0
  498. noeta-1.0.0rc1/noeta/plugins/mcp/instructions.py +84 -0
  499. noeta-1.0.0rc1/noeta/plugins/mcp/oauth.py +499 -0
  500. noeta-1.0.0rc1/noeta/plugins/mcp/oauth_discovery.py +156 -0
  501. noeta-1.0.0rc1/noeta/plugins/mcp/pool.py +292 -0
  502. noeta-1.0.0rc1/noeta/plugins/mcp/prompts.py +213 -0
  503. noeta-1.0.0rc1/noeta/plugins/mcp/results.py +216 -0
  504. noeta-1.0.0rc1/noeta/plugins/mcp/settings.py +188 -0
  505. noeta-1.0.0rc1/noeta/plugins/mcp/sign_ins.py +126 -0
  506. noeta-1.0.0rc1/noeta/plugins/mcp/sse_client.py +191 -0
  507. noeta-1.0.0rc1/noeta/plugins/mcp/stdio.py +151 -0
  508. noeta-1.0.0rc1/noeta/plugins/mcp/tools.py +356 -0
  509. noeta-1.0.0rc1/noeta/plugins/mcp/ws_client.py +201 -0
  510. noeta-1.0.0rc1/noeta/plugins/memory/__init__.py +12 -0
  511. noeta-1.0.0rc1/noeta/plugins/memory/extension.py +501 -0
  512. noeta-1.0.0rc1/noeta/plugins/memory/prompts/recall.md +3 -0
  513. noeta-1.0.0rc1/noeta/plugins/memory/prompts/section.md +22 -0
  514. noeta-1.0.0rc1/noeta/plugins/permissions/__init__.py +48 -0
  515. noeta-1.0.0rc1/noeta/plugins/permissions/auto.py +340 -0
  516. noeta-1.0.0rc1/noeta/plugins/permissions/classifier.py +405 -0
  517. noeta-1.0.0rc1/noeta/plugins/permissions/decision.py +60 -0
  518. noeta-1.0.0rc1/noeta/plugins/permissions/deny_paths.py +116 -0
  519. noeta-1.0.0rc1/noeta/plugins/permissions/extension.py +576 -0
  520. noeta-1.0.0rc1/noeta/plugins/permissions/guards.py +127 -0
  521. noeta-1.0.0rc1/noeta/plugins/permissions/modes.py +85 -0
  522. noeta-1.0.0rc1/noeta/plugins/permissions/policy.py +265 -0
  523. noeta-1.0.0rc1/noeta/plugins/permissions/read_only_programs.py +451 -0
  524. noeta-1.0.0rc1/noeta/plugins/permissions/rule_check.py +400 -0
  525. noeta-1.0.0rc1/noeta/plugins/permissions/rule_specs.py +59 -0
  526. noeta-1.0.0rc1/noeta/plugins/permissions/scope.py +468 -0
  527. noeta-1.0.0rc1/noeta/plugins/permissions/shell_check.py +300 -0
  528. noeta-1.0.0rc1/noeta/plugins/permissions/shell_paths.py +448 -0
  529. noeta-1.0.0rc1/noeta/plugins/permissions/state.py +173 -0
  530. noeta-1.0.0rc1/noeta/plugins/permissions/texts/auto_mode_classifier.md +369 -0
  531. noeta-1.0.0rc1/noeta/plugins/permissions/wording.py +128 -0
  532. noeta-1.0.0rc1/noeta/plugins/plan_mode/__init__.py +14 -0
  533. noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/enter_plan_mode.md +63 -0
  534. noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/exit_plan_mode.md +19 -0
  535. noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/plan_mode.md +31 -0
  536. noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/plan_mode_reentry.md +11 -0
  537. noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/plan_mode_sparse.md +1 -0
  538. noeta-1.0.0rc1/noeta/plugins/plan_mode/descriptions/plan_mode_subagent.md +7 -0
  539. noeta-1.0.0rc1/noeta/plugins/plan_mode/extension.py +242 -0
  540. noeta-1.0.0rc1/noeta/plugins/plan_mode/notes.py +165 -0
  541. noeta-1.0.0rc1/noeta/plugins/plan_mode/plan.py +341 -0
  542. noeta-1.0.0rc1/noeta/plugins/plan_mode/state.py +129 -0
  543. noeta-1.0.0rc1/noeta/plugins/quiet_nudge.py +82 -0
  544. noeta-1.0.0rc1/noeta/plugins/repetition_guard.py +104 -0
  545. noeta-1.0.0rc1/noeta/plugins/schedule/__init__.py +360 -0
  546. noeta-1.0.0rc1/noeta/plugins/schedule/cron.py +188 -0
  547. noeta-1.0.0rc1/noeta/plugins/schedule/descriptions/cron_create.md +36 -0
  548. noeta-1.0.0rc1/noeta/plugins/schedule/descriptions/cron_delete.md +1 -0
  549. noeta-1.0.0rc1/noeta/plugins/schedule/descriptions/cron_list.md +1 -0
  550. noeta-1.0.0rc1/noeta/plugins/schedule/descriptions/schedule_wakeup.md +27 -0
  551. noeta-1.0.0rc1/noeta/plugins/schedule/loop.md +50 -0
  552. noeta-1.0.0rc1/noeta/plugins/schedule/texts.py +90 -0
  553. noeta-1.0.0rc1/noeta/plugins/shell/__init__.py +299 -0
  554. noeta-1.0.0rc1/noeta/plugins/shell/bash.py +310 -0
  555. noeta-1.0.0rc1/noeta/plugins/shell/cwd.py +54 -0
  556. noeta-1.0.0rc1/noeta/plugins/shell/descriptions/enter_worktree.md +9 -0
  557. noeta-1.0.0rc1/noeta/plugins/shell/descriptions/exit_worktree.md +10 -0
  558. noeta-1.0.0rc1/noeta/plugins/shell/descriptions/monitor.md +41 -0
  559. noeta-1.0.0rc1/noeta/plugins/shell/descriptions/shell_run.md +16 -0
  560. noeta-1.0.0rc1/noeta/plugins/shell/descriptions/shell_sandbox.md +6 -0
  561. noeta-1.0.0rc1/noeta/plugins/shell/descriptions/shell_sandbox_escape.md +6 -0
  562. noeta-1.0.0rc1/noeta/plugins/shell/descriptions/shell_sandbox_no_escape.md +3 -0
  563. noeta-1.0.0rc1/noeta/plugins/shell/git_prelude.py +127 -0
  564. noeta-1.0.0rc1/noeta/plugins/shell/hardening.py +137 -0
  565. noeta-1.0.0rc1/noeta/plugins/shell/job_logs.py +118 -0
  566. noeta-1.0.0rc1/noeta/plugins/shell/jobs.py +904 -0
  567. noeta-1.0.0rc1/noeta/plugins/shell/notices.py +363 -0
  568. noeta-1.0.0rc1/noeta/plugins/shell/output.py +114 -0
  569. noeta-1.0.0rc1/noeta/plugins/shell/sandbox.py +82 -0
  570. noeta-1.0.0rc1/noeta/plugins/shell/state.py +77 -0
  571. noeta-1.0.0rc1/noeta/plugins/shell/tools.py +639 -0
  572. noeta-1.0.0rc1/noeta/plugins/shell/websocket.py +200 -0
  573. noeta-1.0.0rc1/noeta/plugins/shell/worktree.py +243 -0
  574. noeta-1.0.0rc1/noeta/plugins/skills/__init__.py +21 -0
  575. noeta-1.0.0rc1/noeta/plugins/skills/_frontmatter.py +326 -0
  576. noeta-1.0.0rc1/noeta/plugins/skills/descriptions/run_skill_script.md +1 -0
  577. noeta-1.0.0rc1/noeta/plugins/skills/descriptions/skill.md +12 -0
  578. noeta-1.0.0rc1/noeta/plugins/skills/extension.py +1496 -0
  579. noeta-1.0.0rc1/noeta/plugins/skills/gates.py +64 -0
  580. noeta-1.0.0rc1/noeta/plugins/skills/listing.py +208 -0
  581. noeta-1.0.0rc1/noeta/plugins/skills/registry.py +675 -0
  582. noeta-1.0.0rc1/noeta/plugins/skills/script.py +210 -0
  583. noeta-1.0.0rc1/noeta/plugins/skills/tool.py +181 -0
  584. noeta-1.0.0rc1/noeta/plugins/skills/usage.py +120 -0
  585. noeta-1.0.0rc1/noeta/plugins/structured_output.py +229 -0
  586. noeta-1.0.0rc1/noeta/plugins/subtasks/__init__.py +26 -0
  587. noeta-1.0.0rc1/noeta/plugins/subtasks/descriptions/agent.md +21 -0
  588. noeta-1.0.0rc1/noeta/plugins/subtasks/descriptions/list_agents.md +1 -0
  589. noeta-1.0.0rc1/noeta/plugins/subtasks/descriptions/send_message.md +7 -0
  590. noeta-1.0.0rc1/noeta/plugins/subtasks/descriptions/subagent_handback.md +1 -0
  591. noeta-1.0.0rc1/noeta/plugins/subtasks/extension.py +696 -0
  592. noeta-1.0.0rc1/noeta/plugins/subtasks/idle.py +166 -0
  593. noeta-1.0.0rc1/noeta/plugins/subtasks/mentions.py +57 -0
  594. noeta-1.0.0rc1/noeta/plugins/subtasks/roster.py +166 -0
  595. noeta-1.0.0rc1/noeta/plugins/subtasks/texts.py +324 -0
  596. noeta-1.0.0rc1/noeta/plugins/subtasks/tool.py +567 -0
  597. noeta-1.0.0rc1/noeta/plugins/subtasks/worktree.py +109 -0
  598. noeta-1.0.0rc1/noeta/plugins/title.md +17 -0
  599. noeta-1.0.0rc1/noeta/plugins/title.py +116 -0
  600. noeta-1.0.0rc1/noeta/plugins/todos/__init__.py +197 -0
  601. noeta-1.0.0rc1/noeta/plugins/todos/descriptions/task_create.md +30 -0
  602. noeta-1.0.0rc1/noeta/plugins/todos/descriptions/task_get.md +16 -0
  603. noeta-1.0.0rc1/noeta/plugins/todos/descriptions/task_list.md +16 -0
  604. noeta-1.0.0rc1/noeta/plugins/todos/descriptions/task_update.md +65 -0
  605. noeta-1.0.0rc1/noeta/plugins/todos/state.py +102 -0
  606. noeta-1.0.0rc1/noeta/plugins/todos/tools.py +381 -0
  607. noeta-1.0.0rc1/noeta/plugins/tool_search/__init__.py +97 -0
  608. noeta-1.0.0rc1/noeta/plugins/tool_search/search.py +229 -0
  609. noeta-1.0.0rc1/noeta/plugins/web/__init__.py +124 -0
  610. noeta-1.0.0rc1/noeta/plugins/web/descriptions/web_search.md +6 -0
  611. noeta-1.0.0rc1/noeta/plugins/web/descriptions/webfetch.md +8 -0
  612. noeta-1.0.0rc1/noeta/plugins/web/descriptions/webfetch_digest.md +6 -0
  613. noeta-1.0.0rc1/noeta/plugins/web/descriptions/webfetch_digest_docs.md +1 -0
  614. noeta-1.0.0rc1/noeta/plugins/web/fetch.py +551 -0
  615. noeta-1.0.0rc1/noeta/plugins/web/render.py +152 -0
  616. noeta-1.0.0rc1/noeta/plugins/web/search.py +208 -0
  617. noeta-1.0.0rc1/noeta/plugins/workflow/__init__.py +401 -0
  618. noeta-1.0.0rc1/noeta/plugins/workflow/descriptions/workflow.md +42 -0
  619. noeta-1.0.0rc1/noeta/plugins/workflow/engine.py +204 -0
  620. noeta-1.0.0rc1/noeta/plugins/workflow/harness.js +299 -0
  621. noeta-1.0.0rc1/noeta/plugins/workflow/opt_in.py +86 -0
  622. noeta-1.0.0rc1/noeta/plugins/workflow/tool.py +212 -0
  623. noeta-1.0.0rc1/noeta/py.typed +0 -0
  624. noeta-1.0.0rc1/noeta/testing/__init__.py +52 -0
  625. noeta-1.0.0rc1/noeta/testing/store_contract.py +473 -0
  626. noeta-1.0.0rc1/noeta/toolkit/__init__.py +4 -0
  627. noeta-1.0.0rc1/noeta/toolkit/allowed_tools.py +77 -0
  628. noeta-1.0.0rc1/noeta/toolkit/arguments.py +87 -0
  629. noeta-1.0.0rc1/noeta/toolkit/background_tasks.py +60 -0
  630. noeta-1.0.0rc1/noeta/toolkit/commands.py +31 -0
  631. noeta-1.0.0rc1/noeta/toolkit/context.py +102 -0
  632. noeta-1.0.0rc1/noeta/toolkit/deltas.py +28 -0
  633. noeta-1.0.0rc1/noeta/toolkit/empty_reply.py +14 -0
  634. noeta-1.0.0rc1/noeta/toolkit/function_tool.py +217 -0
  635. noeta-1.0.0rc1/noeta/toolkit/guidance_lines.py +33 -0
  636. noeta-1.0.0rc1/noeta/toolkit/hook_callbacks.py +118 -0
  637. noeta-1.0.0rc1/noeta/toolkit/hook_env.py +19 -0
  638. noeta-1.0.0rc1/noeta/toolkit/inline_commands.py +182 -0
  639. noeta-1.0.0rc1/noeta/toolkit/interactive.py +82 -0
  640. noeta-1.0.0rc1/noeta/toolkit/json_schema.py +257 -0
  641. noeta-1.0.0rc1/noeta/toolkit/local_env.py +130 -0
  642. noeta-1.0.0rc1/noeta/toolkit/mcp_sources.py +50 -0
  643. noeta-1.0.0rc1/noeta/toolkit/memory_index.py +61 -0
  644. noeta-1.0.0rc1/noeta/toolkit/notices.py +60 -0
  645. noeta-1.0.0rc1/noeta/toolkit/paths.py +102 -0
  646. noeta-1.0.0rc1/noeta/toolkit/permission_modes.py +97 -0
  647. noeta-1.0.0rc1/noeta/toolkit/permission_rules.py +465 -0
  648. noeta-1.0.0rc1/noeta/toolkit/plugin_records.py +248 -0
  649. noeta-1.0.0rc1/noeta/toolkit/protected_paths.py +36 -0
  650. noeta-1.0.0rc1/noeta/toolkit/sandbox.py +452 -0
  651. noeta-1.0.0rc1/noeta/toolkit/shell.py +420 -0
  652. noeta-1.0.0rc1/noeta/toolkit/shell_syntax.py +475 -0
  653. noeta-1.0.0rc1/noeta/toolkit/side_requests.py +45 -0
  654. noeta-1.0.0rc1/noeta/toolkit/signals.py +22 -0
  655. noeta-1.0.0rc1/noeta/toolkit/structured_output.py +49 -0
  656. noeta-1.0.0rc1/noeta/toolkit/tokens.py +85 -0
  657. noeta-1.0.0rc1/noeta/toolkit/tools.py +160 -0
  658. noeta-1.0.0rc1/noeta/toolkit/ultrathink.py +65 -0
  659. noeta-1.0.0rc1/noeta/toolkit/usd_budget.py +127 -0
  660. noeta-1.0.0rc1/noeta/toolkit/worktrees.py +162 -0
  661. noeta-1.0.0rc1/parity/2.1.312/m1.json +12608 -0
  662. noeta-1.0.0rc1/parity/2.1.312/m2.json +1615 -0
  663. noeta-1.0.0rc1/parity/2.1.312/m3.json +3866 -0
  664. noeta-1.0.0rc1/parity/2.1.312/m4.json +154 -0
  665. noeta-1.0.0rc1/parity/2.1.312/m5.json +2874 -0
  666. noeta-1.0.0rc1/parity/2.1.312/script/m1.json +1190 -0
  667. noeta-1.0.0rc1/parity/2.1.312/script/m2.json +238 -0
  668. noeta-1.0.0rc1/parity/2.1.312/script/m3.json +459 -0
  669. noeta-1.0.0rc1/parity/2.1.312/script/m4.json +27 -0
  670. noeta-1.0.0rc1/parity/2.1.312/script/m5.json +315 -0
  671. noeta-1.0.0rc1/parity/2.1.312/texts.json +361 -0
  672. noeta-1.0.0rc1/parity/2.1.312/tools.json +6585 -0
  673. noeta-1.0.0rc1/parity/deviations.md +200 -0
  674. noeta-1.0.0rc1/parity/own-words-allowed.txt +36 -0
  675. noeta-1.0.0rc1/parity/rules/README.md +81 -0
  676. noeta-1.0.0rc1/parity/rules/auto-mode-classifier.md +236 -0
  677. noeta-1.0.0rc1/parity/rules/compaction.md +122 -0
  678. noeta-1.0.0rc1/parity/rules/main-prompt.md +175 -0
  679. noeta-1.0.0rc1/parity/rules/reminders.md +339 -0
  680. noeta-1.0.0rc1/parity/rules/side-requests.md +118 -0
  681. noeta-1.0.0rc1/parity/rules/source_hash.py +50 -0
  682. noeta-1.0.0rc1/parity/rules/subagent.md +146 -0
  683. noeta-1.0.0rc1/parity/rules/tools/Agent.md +73 -0
  684. noeta-1.0.0rc1/parity/rules/tools/AskUserQuestion.md +63 -0
  685. noeta-1.0.0rc1/parity/rules/tools/Bash.md +113 -0
  686. noeta-1.0.0rc1/parity/rules/tools/DeferredToolPlaceholder.md +38 -0
  687. noeta-1.0.0rc1/parity/rules/tools/Edit.md +62 -0
  688. noeta-1.0.0rc1/parity/rules/tools/EnterPlanMode.md +46 -0
  689. noeta-1.0.0rc1/parity/rules/tools/ExitPlanMode.md +50 -0
  690. noeta-1.0.0rc1/parity/rules/tools/ListAgents.md +42 -0
  691. noeta-1.0.0rc1/parity/rules/tools/ListMcpResourcesTool.md +44 -0
  692. noeta-1.0.0rc1/parity/rules/tools/Monitor.md +57 -0
  693. noeta-1.0.0rc1/parity/rules/tools/Read.md +72 -0
  694. noeta-1.0.0rc1/parity/rules/tools/ReadMcpResourceTool.md +46 -0
  695. noeta-1.0.0rc1/parity/rules/tools/ReportFindings.md +50 -0
  696. noeta-1.0.0rc1/parity/rules/tools/ScheduleWakeup.md +66 -0
  697. noeta-1.0.0rc1/parity/rules/tools/Skill.md +55 -0
  698. noeta-1.0.0rc1/parity/rules/tools/SubagentHandback.md +47 -0
  699. noeta-1.0.0rc1/parity/rules/tools/TaskStop.md +41 -0
  700. noeta-1.0.0rc1/parity/rules/tools/ToolSearch.md +53 -0
  701. noeta-1.0.0rc1/parity/rules/tools/WebFetch.md +63 -0
  702. noeta-1.0.0rc1/parity/rules/tools/Workflow.md +54 -0
  703. noeta-1.0.0rc1/parity/rules/tools/Write.md +49 -0
  704. noeta-1.0.0rc1/parity/rules/tools/common.md +18 -0
  705. noeta-1.0.0rc1/parity/rules/tools/mcp-server-tools.md +41 -0
  706. noeta-1.0.0rc1/pyproject.toml +223 -0
  707. noeta-1.0.0rc1/scripts/check-docs.sh +148 -0
  708. noeta-1.0.0rc1/scripts/lint-layout.py +109 -0
  709. noeta-1.0.0rc1/scripts/lint-naming.py +256 -0
  710. noeta-1.0.0rc1/scripts/parity/README.md +119 -0
  711. noeta-1.0.0rc1/scripts/parity/__init__.py +0 -0
  712. noeta-1.0.0rc1/scripts/parity/compare.py +668 -0
  713. noeta-1.0.0rc1/scripts/parity/distill.py +266 -0
  714. noeta-1.0.0rc1/scripts/parity/drive.py +354 -0
  715. noeta-1.0.0rc1/scripts/parity/facts.py +340 -0
  716. noeta-1.0.0rc1/scripts/parity/names.json +95 -0
  717. noeta-1.0.0rc1/scripts/parity/own_words.py +242 -0
  718. noeta-1.0.0rc1/scripts/parity/project.py +150 -0
  719. noeta-1.0.0rc1/scripts/parity/record.py +194 -0
  720. noeta-1.0.0rc1/scripts/parity/replay.py +689 -0
  721. noeta-1.0.0rc1/scripts/parity/scenarios.json +68 -0
  722. noeta-1.0.0rc1/scripts/parity/wire.py +194 -0
  723. noeta-1.0.0rc1/tests/__init__.py +0 -0
  724. noeta-1.0.0rc1/tests/agents/__init__.py +0 -0
  725. noeta-1.0.0rc1/tests/agents/golden/requests.json +3789 -0
  726. noeta-1.0.0rc1/tests/agents/test_agent_files.py +302 -0
  727. noeta-1.0.0rc1/tests/agents/test_bash_mode_line.py +118 -0
  728. noeta-1.0.0rc1/tests/agents/test_plugin_secrets.py +66 -0
  729. noeta-1.0.0rc1/tests/agents/test_request_golden.py +155 -0
  730. noeta-1.0.0rc1/tests/agents/test_subagents.py +134 -0
  731. noeta-1.0.0rc1/tests/backends/__init__.py +0 -0
  732. noeta-1.0.0rc1/tests/backends/execenvs/__init__.py +0 -0
  733. noeta-1.0.0rc1/tests/backends/execenvs/test_container.py +302 -0
  734. noeta-1.0.0rc1/tests/backends/execenvs/test_container_env_values.py +74 -0
  735. noeta-1.0.0rc1/tests/backends/execenvs/test_container_sandbox.py +140 -0
  736. noeta-1.0.0rc1/tests/backends/execenvs/test_local.py +432 -0
  737. noeta-1.0.0rc1/tests/backends/execenvs/test_sandbox.py +892 -0
  738. noeta-1.0.0rc1/tests/backends/providers/__init__.py +0 -0
  739. noeta-1.0.0rc1/tests/backends/providers/_anthropic_helpers.py +133 -0
  740. noeta-1.0.0rc1/tests/backends/providers/_responses_helpers.py +163 -0
  741. noeta-1.0.0rc1/tests/backends/providers/sse.py +199 -0
  742. noeta-1.0.0rc1/tests/backends/providers/test_anthropic.py +787 -0
  743. noeta-1.0.0rc1/tests/backends/providers/test_anthropic_streaming.py +789 -0
  744. noeta-1.0.0rc1/tests/backends/providers/test_anthropic_wire.py +811 -0
  745. noeta-1.0.0rc1/tests/backends/providers/test_common.py +276 -0
  746. noeta-1.0.0rc1/tests/backends/providers/test_cross_adapter.py +247 -0
  747. noeta-1.0.0rc1/tests/backends/providers/test_live.py +152 -0
  748. noeta-1.0.0rc1/tests/backends/providers/test_models.py +575 -0
  749. noeta-1.0.0rc1/tests/backends/providers/test_openai_compat.py +530 -0
  750. noeta-1.0.0rc1/tests/backends/providers/test_openai_compat_body.py +604 -0
  751. noeta-1.0.0rc1/tests/backends/providers/test_openai_compat_streaming.py +468 -0
  752. noeta-1.0.0rc1/tests/backends/providers/test_openai_responses_images.py +215 -0
  753. noeta-1.0.0rc1/tests/backends/providers/test_openai_responses_request.py +616 -0
  754. noeta-1.0.0rc1/tests/backends/providers/test_openai_responses_response.py +554 -0
  755. noeta-1.0.0rc1/tests/backends/providers/test_openai_responses_streaming.py +388 -0
  756. noeta-1.0.0rc1/tests/backends/providers/test_retry.py +427 -0
  757. noeta-1.0.0rc1/tests/backends/providers/test_retry_after.py +49 -0
  758. noeta-1.0.0rc1/tests/backends/providers/test_routing.py +376 -0
  759. noeta-1.0.0rc1/tests/backends/stores/__init__.py +0 -0
  760. noeta-1.0.0rc1/tests/backends/stores/test_postgres.py +257 -0
  761. noeta-1.0.0rc1/tests/backends/stores/test_sqlite_errors.py +108 -0
  762. noeta-1.0.0rc1/tests/backends/stores/test_sqlite_file_mode.py +46 -0
  763. noeta-1.0.0rc1/tests/backends/stores/test_store_contract.py +24 -0
  764. noeta-1.0.0rc1/tests/cli/.gitignore +1 -0
  765. noeta-1.0.0rc1/tests/cli/__init__.py +0 -0
  766. noeta-1.0.0rc1/tests/cli/test_claude_plugins.py +156 -0
  767. noeta-1.0.0rc1/tests/cli/test_commands.py +190 -0
  768. noeta-1.0.0rc1/tests/cli/test_config.py +532 -0
  769. noeta-1.0.0rc1/tests/cli/test_device_id.py +17 -0
  770. noeta-1.0.0rc1/tests/cli/test_frontends_rereview.py +175 -0
  771. noeta-1.0.0rc1/tests/cli/test_frontends_review.py +189 -0
  772. noeta-1.0.0rc1/tests/cli/test_headless_flags.py +189 -0
  773. noeta-1.0.0rc1/tests/cli/test_home_mode.py +49 -0
  774. noeta-1.0.0rc1/tests/cli/test_mcp_command.py +195 -0
  775. noeta-1.0.0rc1/tests/cli/test_misconfiguration.py +90 -0
  776. noeta-1.0.0rc1/tests/cli/test_missing_extras.py +98 -0
  777. noeta-1.0.0rc1/tests/cli/test_multi_provider.py +254 -0
  778. noeta-1.0.0rc1/tests/cli/test_plugin_command.py +175 -0
  779. noeta-1.0.0rc1/tests/cli/test_plugin_files.py +365 -0
  780. noeta-1.0.0rc1/tests/cli/test_plugin_options.py +340 -0
  781. noeta-1.0.0rc1/tests/cli/test_plugin_questions.py +156 -0
  782. noeta-1.0.0rc1/tests/cli/test_serve_defaults.py +53 -0
  783. noeta-1.0.0rc1/tests/cli/test_server_attach.py +104 -0
  784. noeta-1.0.0rc1/tests/cli/test_server_token.py +107 -0
  785. noeta-1.0.0rc1/tests/cli/test_skill_usage_rank.py +35 -0
  786. noeta-1.0.0rc1/tests/cli/test_tui_start.py +75 -0
  787. noeta-1.0.0rc1/tests/cli/test_worker_command.py +124 -0
  788. noeta-1.0.0rc1/tests/cli/test_workspace_trust.py +97 -0
  789. noeta-1.0.0rc1/tests/cluster/__init__.py +0 -0
  790. noeta-1.0.0rc1/tests/cluster/conftest.py +94 -0
  791. noeta-1.0.0rc1/tests/cluster/harness.py +585 -0
  792. noeta-1.0.0rc1/tests/cluster/invariants.py +249 -0
  793. noeta-1.0.0rc1/tests/cluster/scripted/pyproject.toml +27 -0
  794. noeta-1.0.0rc1/tests/cluster/scripted/src/noeta_cluster_scripted/__init__.py +386 -0
  795. noeta-1.0.0rc1/tests/cluster/test_cluster.py +444 -0
  796. noeta-1.0.0rc1/tests/conftest.py +137 -0
  797. noeta-1.0.0rc1/tests/core/__init__.py +0 -0
  798. noeta-1.0.0rc1/tests/core/procs/worker.py +89 -0
  799. noeta-1.0.0rc1/tests/core/test_approval_note.py +278 -0
  800. noeta-1.0.0rc1/tests/core/test_config_signal.py +111 -0
  801. noeta-1.0.0rc1/tests/core/test_connect.py +45 -0
  802. noeta-1.0.0rc1/tests/core/test_continuation.py +265 -0
  803. noeta-1.0.0rc1/tests/core/test_core_record_kinds.py +108 -0
  804. noeta-1.0.0rc1/tests/core/test_crash_and_race.py +529 -0
  805. noeta-1.0.0rc1/tests/core/test_erased.py +96 -0
  806. noeta-1.0.0rc1/tests/core/test_event_redelivery.py +86 -0
  807. noeta-1.0.0rc1/tests/core/test_fs_end_to_end.py +44 -0
  808. noeta-1.0.0rc1/tests/core/test_gate_resolution.py +144 -0
  809. noeta-1.0.0rc1/tests/core/test_images.py +126 -0
  810. noeta-1.0.0rc1/tests/core/test_kept_claims.py +234 -0
  811. noeta-1.0.0rc1/tests/core/test_kill9.py +101 -0
  812. noeta-1.0.0rc1/tests/core/test_loop_behaviors.py +266 -0
  813. noeta-1.0.0rc1/tests/core/test_mcp_names.py +149 -0
  814. noeta-1.0.0rc1/tests/core/test_ordered_approvals.py +210 -0
  815. noeta-1.0.0rc1/tests/core/test_output_ceiling.py +43 -0
  816. noeta-1.0.0rc1/tests/core/test_park_and_children.py +278 -0
  817. noeta-1.0.0rc1/tests/core/test_plugin_pins.py +130 -0
  818. noeta-1.0.0rc1/tests/core/test_prompts.py +117 -0
  819. noeta-1.0.0rc1/tests/core/test_recovery.py +132 -0
  820. noeta-1.0.0rc1/tests/core/test_registry.py +32 -0
  821. noeta-1.0.0rc1/tests/core/test_reminders.py +125 -0
  822. noeta-1.0.0rc1/tests/core/test_request_stale.py +92 -0
  823. noeta-1.0.0rc1/tests/core/test_rereview_core.py +181 -0
  824. noeta-1.0.0rc1/tests/core/test_result_limits.py +129 -0
  825. noeta-1.0.0rc1/tests/core/test_runner.py +286 -0
  826. noeta-1.0.0rc1/tests/core/test_runner_review.py +821 -0
  827. noeta-1.0.0rc1/tests/core/test_snapshots.py +334 -0
  828. noeta-1.0.0rc1/tests/core/test_task_provider.py +36 -0
  829. noeta-1.0.0rc1/tests/core/test_timers.py +308 -0
  830. noeta-1.0.0rc1/tests/core/test_tool_changes.py +229 -0
  831. noeta-1.0.0rc1/tests/core/test_tool_input.py +63 -0
  832. noeta-1.0.0rc1/tests/core/test_tool_post_dedupe.py +64 -0
  833. noeta-1.0.0rc1/tests/core/test_tool_progress.py +60 -0
  834. noeta-1.0.0rc1/tests/core/test_view_folded.py +27 -0
  835. noeta-1.0.0rc1/tests/host/__init__.py +0 -0
  836. noeta-1.0.0rc1/tests/host/procs/delta_worker.py +40 -0
  837. noeta-1.0.0rc1/tests/host/test_acp.py +170 -0
  838. noeta-1.0.0rc1/tests/host/test_acp_config.py +130 -0
  839. noeta-1.0.0rc1/tests/host/test_acp_edits.py +123 -0
  840. noeta-1.0.0rc1/tests/host/test_acp_live.py +74 -0
  841. noeta-1.0.0rc1/tests/host/test_acp_plan.py +91 -0
  842. noeta-1.0.0rc1/tests/host/test_acp_remote.py +168 -0
  843. noeta-1.0.0rc1/tests/host/test_acp_review.py +314 -0
  844. noeta-1.0.0rc1/tests/host/test_agent_aliases.py +40 -0
  845. noeta-1.0.0rc1/tests/host/test_change_config.py +25 -0
  846. noeta-1.0.0rc1/tests/host/test_channels.py +246 -0
  847. noeta-1.0.0rc1/tests/host/test_error_text.py +64 -0
  848. noeta-1.0.0rc1/tests/host/test_find_latest_task.py +27 -0
  849. noeta-1.0.0rc1/tests/host/test_http.py +158 -0
  850. noeta-1.0.0rc1/tests/host/test_http_more.py +430 -0
  851. noeta-1.0.0rc1/tests/host/test_http_web.py +226 -0
  852. noeta-1.0.0rc1/tests/host/test_initial_prompt.py +44 -0
  853. noeta-1.0.0rc1/tests/host/test_live_output_across_processes.py +113 -0
  854. noeta-1.0.0rc1/tests/host/test_live_output_versions.py +58 -0
  855. noeta-1.0.0rc1/tests/host/test_local_app_options.py +21 -0
  856. noeta-1.0.0rc1/tests/host/test_prompt_images.py +120 -0
  857. noeta-1.0.0rc1/tests/host/test_provider_switch.py +133 -0
  858. noeta-1.0.0rc1/tests/host/test_reported_version.py +40 -0
  859. noeta-1.0.0rc1/tests/host/test_rewind.py +233 -0
  860. noeta-1.0.0rc1/tests/host/test_spill.py +149 -0
  861. noeta-1.0.0rc1/tests/host/test_stream_json.py +559 -0
  862. noeta-1.0.0rc1/tests/host/test_stream_json_hooks.py +140 -0
  863. noeta-1.0.0rc1/tests/host/test_summaries.py +142 -0
  864. noeta-1.0.0rc1/tests/host/test_usage.py +80 -0
  865. noeta-1.0.0rc1/tests/images.py +18 -0
  866. noeta-1.0.0rc1/tests/plugins/__init__.py +0 -0
  867. noeta-1.0.0rc1/tests/plugins/ask_user/__init__.py +0 -0
  868. noeta-1.0.0rc1/tests/plugins/ask_user/test_ask_user.py +268 -0
  869. noeta-1.0.0rc1/tests/plugins/ask_user/test_typed_answers.py +90 -0
  870. noeta-1.0.0rc1/tests/plugins/compaction/__init__.py +0 -0
  871. noeta-1.0.0rc1/tests/plugins/compaction/_harness.py +178 -0
  872. noeta-1.0.0rc1/tests/plugins/compaction/test_compaction_layout.py +176 -0
  873. noeta-1.0.0rc1/tests/plugins/compaction/test_compaction_pure.py +410 -0
  874. noeta-1.0.0rc1/tests/plugins/compaction/test_compaction_runtime.py +614 -0
  875. noeta-1.0.0rc1/tests/plugins/compaction/test_long_context.py +705 -0
  876. noeta-1.0.0rc1/tests/plugins/compaction/test_residents_and_todo.py +133 -0
  877. noeta-1.0.0rc1/tests/plugins/compaction/test_task_status.py +72 -0
  878. noeta-1.0.0rc1/tests/plugins/conftest.py +90 -0
  879. noeta-1.0.0rc1/tests/plugins/context/__init__.py +0 -0
  880. noeta-1.0.0rc1/tests/plugins/context/conftest.py +71 -0
  881. noeta-1.0.0rc1/tests/plugins/context/test_coerced_input.py +49 -0
  882. noeta-1.0.0rc1/tests/plugins/context/test_date_change.py +160 -0
  883. noeta-1.0.0rc1/tests/plugins/context/test_environment.py +833 -0
  884. noeta-1.0.0rc1/tests/plugins/context/test_instructions.py +767 -0
  885. noeta-1.0.0rc1/tests/plugins/context/test_memory.py +600 -0
  886. noeta-1.0.0rc1/tests/plugins/context/test_skill_arguments.py +47 -0
  887. noeta-1.0.0rc1/tests/plugins/context/test_skill_discovery.py +713 -0
  888. noeta-1.0.0rc1/tests/plugins/context/test_skills.py +1130 -0
  889. noeta-1.0.0rc1/tests/plugins/fs/__init__.py +0 -0
  890. noeta-1.0.0rc1/tests/plugins/fs/test_changed_reminder.py +386 -0
  891. noeta-1.0.0rc1/tests/plugins/fs/test_edit.py +539 -0
  892. noeta-1.0.0rc1/tests/plugins/fs/test_encodings.py +116 -0
  893. noeta-1.0.0rc1/tests/plugins/fs/test_fs_state.py +197 -0
  894. noeta-1.0.0rc1/tests/plugins/fs/test_mentions.py +361 -0
  895. noeta-1.0.0rc1/tests/plugins/fs/test_notebook_edit.py +115 -0
  896. noeta-1.0.0rc1/tests/plugins/fs/test_output_limit.py +163 -0
  897. noeta-1.0.0rc1/tests/plugins/fs/test_pasted_images.py +163 -0
  898. noeta-1.0.0rc1/tests/plugins/fs/test_read.py +527 -0
  899. noeta-1.0.0rc1/tests/plugins/fs/test_read_formats.py +309 -0
  900. noeta-1.0.0rc1/tests/plugins/fs/test_shell_reads.py +255 -0
  901. noeta-1.0.0rc1/tests/plugins/fs/test_shell_writes.py +72 -0
  902. noeta-1.0.0rc1/tests/plugins/fs/test_write.py +359 -0
  903. noeta-1.0.0rc1/tests/plugins/mcp/__init__.py +0 -0
  904. noeta-1.0.0rc1/tests/plugins/mcp/fake_server.py +154 -0
  905. noeta-1.0.0rc1/tests/plugins/mcp/test_clients.py +454 -0
  906. noeta-1.0.0rc1/tests/plugins/mcp/test_extension.py +659 -0
  907. noeta-1.0.0rc1/tests/plugins/mcp/test_oauth.py +427 -0
  908. noeta-1.0.0rc1/tests/plugins/mcp/test_prompts.py +88 -0
  909. noeta-1.0.0rc1/tests/plugins/mcp/test_results.py +207 -0
  910. noeta-1.0.0rc1/tests/plugins/mcp/test_server_requests.py +320 -0
  911. noeta-1.0.0rc1/tests/plugins/mcp/test_settings.py +221 -0
  912. noeta-1.0.0rc1/tests/plugins/mcp/test_sign_ins.py +74 -0
  913. noeta-1.0.0rc1/tests/plugins/mcp/test_transports.py +358 -0
  914. noeta-1.0.0rc1/tests/plugins/permissions/__init__.py +0 -0
  915. noeta-1.0.0rc1/tests/plugins/permissions/helpers.py +62 -0
  916. noeta-1.0.0rc1/tests/plugins/permissions/test_auto_mode.py +772 -0
  917. noeta-1.0.0rc1/tests/plugins/permissions/test_mode_notes.py +155 -0
  918. noeta-1.0.0rc1/tests/plugins/permissions/test_permissions.py +1228 -0
  919. noeta-1.0.0rc1/tests/plugins/permissions/test_rule_specs.py +56 -0
  920. noeta-1.0.0rc1/tests/plugins/permissions/test_rules.py +209 -0
  921. noeta-1.0.0rc1/tests/plugins/permissions/test_sandbox.py +96 -0
  922. noeta-1.0.0rc1/tests/plugins/permissions/test_scope.py +140 -0
  923. noeta-1.0.0rc1/tests/plugins/permissions/test_shell_paths.py +110 -0
  924. noeta-1.0.0rc1/tests/plugins/plan_mode/__init__.py +0 -0
  925. noeta-1.0.0rc1/tests/plugins/plan_mode/test_alone.py +264 -0
  926. noeta-1.0.0rc1/tests/plugins/plan_mode/test_plan_mode.py +516 -0
  927. noeta-1.0.0rc1/tests/plugins/shell/test_background_runtime.py +373 -0
  928. noeta-1.0.0rc1/tests/plugins/shell/test_background_tools.py +585 -0
  929. noeta-1.0.0rc1/tests/plugins/shell/test_bash.py +786 -0
  930. noeta-1.0.0rc1/tests/plugins/shell/test_hardening.py +130 -0
  931. noeta-1.0.0rc1/tests/plugins/shell/test_monitor_ws.py +189 -0
  932. noeta-1.0.0rc1/tests/plugins/shell/test_sandbox.py +230 -0
  933. noeta-1.0.0rc1/tests/plugins/shell/test_workers_and_logs.py +648 -0
  934. noeta-1.0.0rc1/tests/plugins/shell/test_worktree.py +199 -0
  935. noeta-1.0.0rc1/tests/plugins/subtasks/__init__.py +0 -0
  936. noeta-1.0.0rc1/tests/plugins/subtasks/conftest.py +64 -0
  937. noeta-1.0.0rc1/tests/plugins/subtasks/test_agent_tool.py +998 -0
  938. noeta-1.0.0rc1/tests/plugins/subtasks/test_idle_notice.py +213 -0
  939. noeta-1.0.0rc1/tests/plugins/subtasks/test_notice.py +306 -0
  940. noeta-1.0.0rc1/tests/plugins/test_budget.py +98 -0
  941. noeta-1.0.0rc1/tests/plugins/test_empty_reply.py +310 -0
  942. noeta-1.0.0rc1/tests/plugins/test_findings.py +61 -0
  943. noeta-1.0.0rc1/tests/plugins/test_hooks.py +423 -0
  944. noeta-1.0.0rc1/tests/plugins/test_hooks_client.py +238 -0
  945. noeta-1.0.0rc1/tests/plugins/test_hooks_config.py +470 -0
  946. noeta-1.0.0rc1/tests/plugins/test_hooks_events.py +1173 -0
  947. noeta-1.0.0rc1/tests/plugins/test_hooks_instructions_loaded.py +71 -0
  948. noeta-1.0.0rc1/tests/plugins/test_markdown_commands.py +142 -0
  949. noeta-1.0.0rc1/tests/plugins/test_prompt_keywords.py +179 -0
  950. noeta-1.0.0rc1/tests/plugins/test_quiet_nudge.py +87 -0
  951. noeta-1.0.0rc1/tests/plugins/test_repetition_guard.py +98 -0
  952. noeta-1.0.0rc1/tests/plugins/test_schedule.py +359 -0
  953. noeta-1.0.0rc1/tests/plugins/test_structured_output.py +245 -0
  954. noeta-1.0.0rc1/tests/plugins/test_title.py +83 -0
  955. noeta-1.0.0rc1/tests/plugins/test_todos.py +257 -0
  956. noeta-1.0.0rc1/tests/plugins/test_tool_result_limits.py +19 -0
  957. noeta-1.0.0rc1/tests/plugins/test_workflow.py +570 -0
  958. noeta-1.0.0rc1/tests/plugins/tool_search/test_tool_search.py +315 -0
  959. noeta-1.0.0rc1/tests/plugins/web/test_web_extension.py +624 -0
  960. noeta-1.0.0rc1/tests/snapshot_check.py +45 -0
  961. noeta-1.0.0rc1/tests/test_bench_compare.py +333 -0
  962. noeta-1.0.0rc1/tests/test_eval_usage.py +58 -0
  963. noeta-1.0.0rc1/tests/test_lint_layout.py +53 -0
  964. noeta-1.0.0rc1/tests/test_own_words.py +80 -0
  965. noeta-1.0.0rc1/tests/test_parity_tools.py +418 -0
  966. noeta-1.0.0rc1/tests/toolkit/__init__.py +0 -0
  967. noeta-1.0.0rc1/tests/toolkit/test_function_tool.py +152 -0
  968. noeta-1.0.0rc1/tests/toolkit/test_guidance_lines.py +39 -0
  969. noeta-1.0.0rc1/tests/toolkit/test_json_schema.py +89 -0
  970. noeta-1.0.0rc1/tests/toolkit/test_plugin_records.py +119 -0
  971. noeta-1.0.0rc1/tests/toolkit/test_sandbox.py +158 -0
  972. noeta-1.0.0rc1/tests/toolkit/test_shell_rules.py +129 -0
  973. noeta-1.0.0rc1/tests/toolkit/test_side_requests.py +40 -0
  974. noeta-1.0.0rc1/tests/toolkit/test_usd_budget.py +70 -0
  975. noeta-1.0.0rc1/tests/toolkit/test_worktrees.py +122 -0
  976. noeta-1.0.0rc1/tui/README.md +27 -0
  977. noeta-1.0.0rc1/tui/pyproject.toml +35 -0
  978. noeta-1.0.0rc1/tui/screenshots/README.md +20 -0
  979. noeta-1.0.0rc1/tui/screenshots/approval.svg +207 -0
  980. noeta-1.0.0rc1/tui/screenshots/context.svg +203 -0
  981. noeta-1.0.0rc1/tui/screenshots/slash-menu.svg +204 -0
  982. noeta-1.0.0rc1/tui/screenshots/transcript.svg +203 -0
  983. noeta-1.0.0rc1/tui/screenshots/trust.svg +196 -0
  984. noeta-1.0.0rc1/tui/screenshots/welcome.svg +198 -0
  985. noeta-1.0.0rc1/tui/screenshots/working.svg +203 -0
  986. noeta-1.0.0rc1/tui/src/noeta_tui/__init__.py +24 -0
  987. noeta-1.0.0rc1/tui/src/noeta_tui/app.py +751 -0
  988. noeta-1.0.0rc1/tui/src/noeta_tui/bash_mode.py +61 -0
  989. noeta-1.0.0rc1/tui/src/noeta_tui/files.py +52 -0
  990. noeta-1.0.0rc1/tui/src/noeta_tui/history.py +77 -0
  991. noeta-1.0.0rc1/tui/src/noeta_tui/mentions.py +46 -0
  992. noeta-1.0.0rc1/tui/src/noeta_tui/render.py +363 -0
  993. noeta-1.0.0rc1/tui/src/noeta_tui/slash.py +473 -0
  994. noeta-1.0.0rc1/tui/src/noeta_tui/style.tcss +52 -0
  995. noeta-1.0.0rc1/tui/src/noeta_tui/transcript.py +508 -0
  996. noeta-1.0.0rc1/tui/src/noeta_tui/widgets.py +521 -0
  997. noeta-1.0.0rc1/tui/tests/support.py +134 -0
  998. noeta-1.0.0rc1/tui/tests/test_alignment.py +223 -0
  999. noeta-1.0.0rc1/tui/tests/test_claude_code_shape.py +248 -0
  1000. noeta-1.0.0rc1/tui/tests/test_render.py +104 -0
  1001. noeta-1.0.0rc1/tui/tests/test_review_fixes.py +225 -0
  1002. noeta-1.0.0rc1/tui/tests/test_review_regressions.py +434 -0
  1003. noeta-1.0.0rc1/tui/tests/test_screenshots.py +129 -0
  1004. noeta-1.0.0rc1/tui/tests/test_tui.py +297 -0
  1005. noeta-1.0.0rc1/tui/tests/test_tui_commands.py +222 -0
  1006. noeta-1.0.0rc1/uv.lock +1947 -0
  1007. noeta-1.0.0rc1/web/e2e/app.spec.ts +272 -0
  1008. noeta-1.0.0rc1/web/e2e/provider/pyproject.toml +20 -0
  1009. noeta-1.0.0rc1/web/e2e/provider/src/noeta_web_e2e/__init__.py +163 -0
  1010. noeta-1.0.0rc1/web/index.html +12 -0
  1011. noeta-1.0.0rc1/web/package-lock.json +4721 -0
  1012. noeta-1.0.0rc1/web/package.json +35 -0
  1013. noeta-1.0.0rc1/web/playwright.config.ts +44 -0
  1014. noeta-1.0.0rc1/web/screenshots/01-new-session.png +0 -0
  1015. noeta-1.0.0rc1/web/screenshots/02-streamed-reply.png +0 -0
  1016. noeta-1.0.0rc1/web/screenshots/03-approval-card.png +0 -0
  1017. noeta-1.0.0rc1/web/screenshots/04-bash-card.png +0 -0
  1018. noeta-1.0.0rc1/web/screenshots/05-write-diff.png +0 -0
  1019. noeta-1.0.0rc1/web/screenshots/06-streaming.png +0 -0
  1020. noeta-1.0.0rc1/web/screenshots/07-interrupted.png +0 -0
  1021. noeta-1.0.0rc1/web/screenshots/08-plan-review.png +0 -0
  1022. noeta-1.0.0rc1/web/screenshots/09-todos.png +0 -0
  1023. noeta-1.0.0rc1/web/screenshots/10-subagent.png +0 -0
  1024. noeta-1.0.0rc1/web/screenshots/11-slash-menu.png +0 -0
  1025. noeta-1.0.0rc1/web/screenshots/12-rewind.png +0 -0
  1026. noeta-1.0.0rc1/web/screenshots/13-theme.png +0 -0
  1027. noeta-1.0.0rc1/web/screenshots/14-phone.png +0 -0
  1028. noeta-1.0.0rc1/web/screenshots/15-phone-sessions.png +0 -0
  1029. noeta-1.0.0rc1/web/screenshots/16-search-archive.png +0 -0
  1030. noeta-1.0.0rc1/web/screenshots/README.md +52 -0
  1031. noeta-1.0.0rc1/web/src/App.tsx +463 -0
  1032. noeta-1.0.0rc1/web/src/api/client.test.ts +114 -0
  1033. noeta-1.0.0rc1/web/src/api/client.ts +275 -0
  1034. noeta-1.0.0rc1/web/src/api/types.ts +158 -0
  1035. noeta-1.0.0rc1/web/src/components/Composer.tsx +232 -0
  1036. noeta-1.0.0rc1/web/src/components/Controls.tsx +142 -0
  1037. noeta-1.0.0rc1/web/src/components/DiffView.tsx +40 -0
  1038. noeta-1.0.0rc1/web/src/components/Markdown.tsx +36 -0
  1039. noeta-1.0.0rc1/web/src/components/PendingCard.tsx +219 -0
  1040. noeta-1.0.0rc1/web/src/components/Sidebar.tsx +136 -0
  1041. noeta-1.0.0rc1/web/src/components/TodoPanel.tsx +24 -0
  1042. noeta-1.0.0rc1/web/src/components/ToolCard.tsx +134 -0
  1043. noeta-1.0.0rc1/web/src/components/Transcript.tsx +88 -0
  1044. noeta-1.0.0rc1/web/src/components/components.test.tsx +442 -0
  1045. noeta-1.0.0rc1/web/src/desktop.test.tsx +137 -0
  1046. noeta-1.0.0rc1/web/src/desktop.ts +50 -0
  1047. noeta-1.0.0rc1/web/src/main.tsx +10 -0
  1048. noeta-1.0.0rc1/web/src/state/transcript.test.ts +219 -0
  1049. noeta-1.0.0rc1/web/src/state/transcript.ts +389 -0
  1050. noeta-1.0.0rc1/web/src/state/useTask.ts +65 -0
  1051. noeta-1.0.0rc1/web/src/styles.css +1102 -0
  1052. noeta-1.0.0rc1/web/src/test-setup.ts +1 -0
  1053. noeta-1.0.0rc1/web/tsconfig.json +18 -0
  1054. noeta-1.0.0rc1/web/vite.config.ts +33 -0
@@ -0,0 +1,25 @@
1
+ # EditorConfig — https://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ end_of_line = lf
7
+ insert_final_newline = true
8
+ trim_trailing_whitespace = true
9
+ indent_style = space
10
+
11
+ # Python
12
+ [*.py]
13
+ indent_size = 4
14
+
15
+ # Web sources, config, and data
16
+ [*.{js,jsx,ts,tsx,css,html,json,yml,yaml,toml}]
17
+ indent_size = 2
18
+
19
+ # Markdown — keep trailing whitespace (two-space line breaks are significant)
20
+ [*.md]
21
+ trim_trailing_whitespace = false
22
+
23
+ # Makefiles require real tabs
24
+ [Makefile]
25
+ indent_style = tab
@@ -0,0 +1,23 @@
1
+ # Live model configuration for `make e2e` and `make eval`.
2
+ #
3
+ # Copy this file to `.env` (git-ignored) and fill in the values below:
4
+ #
5
+ # cp .env.example .env
6
+ # make e2e
7
+ #
8
+ # One gateway, one key, one base (the host, without /v1); the live tests reach
9
+ # three endpoints under it:
10
+ # <base>/v1/messages (anthropic)
11
+ # <base>/v1/responses (openai_responses)
12
+ # <base>/v1/chat/completions (openai_compat)
13
+ #
14
+ # Missing any of base/key/model auto-skips every live test (CI never runs them).
15
+ # An already-set environment variable overrides the file, so you can also do:
16
+ # NOETA_LIVE_MODEL=other-model uv run pytest -m live
17
+
18
+ NOETA_LIVE_BASE_URL=https://your-gateway.example.com
19
+ NOETA_LIVE_API_KEY=your-rotated-key
20
+ NOETA_LIVE_MODEL=your-model-id
21
+
22
+ # Optional:
23
+ # NOETA_LIVE_MAX_TOKENS=1024
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: Bug report
3
+ about: Report something that behaves incorrectly in noeta
4
+ title: "[bug] "
5
+ labels: bug
6
+ assignees: ''
7
+ ---
8
+
9
+ ## What happened
10
+
11
+ A clear, concise description of the incorrect behavior.
12
+
13
+ ## Steps to reproduce
14
+
15
+ 1. …
16
+ 2. …
17
+ 3. …
18
+
19
+ Include the smallest command, program or config that triggers it. If it concerns what the
20
+ model was sent or did, the output of `noeta -p --output-format stream-json --verbose` helps.
21
+
22
+ ## Expected behavior
23
+
24
+ What you expected instead. If Claude Code behaves differently, say how: a difference in what
25
+ the model sees is a bug.
26
+
27
+ ## Environment
28
+
29
+ - OS:
30
+ - Python version:
31
+ - noeta version / commit: <!-- e.g. 1.0.0.dev0 @ <sha> -->
32
+ - Install: <!-- uv tool install from the repository / a checkout / pip -->
33
+ - Provider and model: <!-- anthropic | openai_compat | openai_responses, model id -->
34
+ - Store: <!-- sqlite (default) | postgres -->
35
+
36
+ ## Logs
37
+
38
+ Relevant output or tracebacks. Redact API keys, tokens and sensitive task content.
39
+
40
+ ```
41
+ <paste logs here>
42
+ ```
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Report a security vulnerability
4
+ url: https://github.com/initxy/noeta/security/advisories/new
5
+ about: Report vulnerabilities privately, never in a public issue (see SECURITY.md).
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: Feature request
3
+ about: Propose a change or addition to noeta
4
+ title: "[feat] "
5
+ labels: enhancement
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Problem / motivation
10
+
11
+ What are you trying to do, and where does noeta get in the way? Describe the need, not only
12
+ the solution.
13
+
14
+ ## Proposed solution
15
+
16
+ What you would like noeta to do. If Claude Code already does it, say how. If it could be a
17
+ plugin (`docs/guides/plugins.md`), say why it should be built in.
18
+
19
+ ## Alternatives considered
20
+
21
+ Other approaches you weighed and why they fall short. If a decision in `docs/adr/` stands in
22
+ the way, name it.
23
+
24
+ ## Area
25
+
26
+ - [ ] kernel (`noeta/core`)
27
+ - [ ] a plugin (`noeta/plugins/...`)
28
+ - [ ] backends (providers, exec envs, stores)
29
+ - [ ] ways in (HTTP, ACP, stream-json) or the `noeta` command
30
+ - [ ] docs / other
@@ -0,0 +1,32 @@
1
+ ## Summary
2
+
3
+ What this change does and why. Lead with the conclusion.
4
+
5
+ ## Kind
6
+
7
+ - [ ] behavior (with a test that fails before it)
8
+ - [ ] structure only (no behavior change)
9
+ - [ ] docs
10
+
11
+ Structure and behavior never share a pull request (see [CONTRIBUTING.md](../CONTRIBUTING.md)).
12
+
13
+ ## Spec / decision
14
+
15
+ Link the spec in `docs/specs/` this implements, or "none — no open decision". If a decision in
16
+ `docs/adr/` changes, link the new ADR that refines or supersedes it.
17
+
18
+ ## How verified
19
+
20
+ ```bash
21
+ make check # lint, mypy, layering, tests with coverage, examples, doc hygiene
22
+ ```
23
+
24
+ Paste the result. For model-facing text or provider wire changes, also `make eval` /
25
+ `make parity` and the relevant `make e2e` tests. Say what could not be verified and why.
26
+
27
+ ## Checklist
28
+
29
+ - [ ] `make check` passes.
30
+ - [ ] Docs the change makes wrong are fixed in it (`CONTEXT.md`, `docs/`, `CHANGELOG.md` Unreleased).
31
+ - [ ] If this implements a spec: its status, Plan checkboxes and Progress log are up to date.
32
+ - [ ] A human owner has read this change and can answer review questions about it.
@@ -0,0 +1,102 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ # One run per ref; a newer push to a PR cancels the stale run. Runs on main
13
+ # are never cancelled so every merged commit gets a verdict.
14
+ concurrency:
15
+ group: ci-${{ github.ref }}
16
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
17
+
18
+ jobs:
19
+ test:
20
+ name: make check (Python ${{ matrix.python-version }})
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 30
23
+ strategy:
24
+ fail-fast: false
25
+ matrix:
26
+ python-version: ["3.11", "3.12", "3.13"]
27
+ services:
28
+ # The store contract tests run their Postgres parameter when
29
+ # NOETA_TEST_POSTGRES_DSN is set (skipped otherwise).
30
+ postgres:
31
+ image: postgres:16
32
+ env:
33
+ POSTGRES_PASSWORD: postgres
34
+ ports:
35
+ - 5432:5432
36
+ options: >-
37
+ --health-cmd pg_isready
38
+ --health-interval 5s
39
+ --health-timeout 5s
40
+ --health-retries 10
41
+ steps:
42
+ - uses: actions/checkout@v4
43
+
44
+ - name: Install uv
45
+ uses: astral-sh/setup-uv@v6
46
+ with:
47
+ python-version: ${{ matrix.python-version }}
48
+ enable-cache: true
49
+
50
+ - name: Install ripgrep
51
+ # No tool shells out to `rg` any more (search runs through Bash, and the suite does not
52
+ # need it); installed so a `Bash` search in a test finds what a developer machine has.
53
+ run: sudo apt-get update -qq && sudo apt-get install -y -qq ripgrep
54
+
55
+ - name: make check
56
+ env:
57
+ NOETA_TEST_POSTGRES_DSN: postgresql://postgres:postgres@localhost:5432/postgres
58
+ run: make check
59
+
60
+ cluster:
61
+ name: make cluster (workers on Postgres under faults)
62
+ runs-on: ubuntu-latest
63
+ timeout-minutes: 25
64
+ services:
65
+ postgres:
66
+ image: postgres:16
67
+ env:
68
+ POSTGRES_PASSWORD: postgres
69
+ ports:
70
+ - 5432:5432
71
+ options: >-
72
+ --health-cmd pg_isready
73
+ --health-interval 5s
74
+ --health-timeout 5s
75
+ --health-retries 10
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+
79
+ - name: Install uv
80
+ uses: astral-sh/setup-uv@v6
81
+ with:
82
+ python-version: "3.12"
83
+ enable-cache: true
84
+
85
+ - name: Raise max_connections
86
+ # Every worker process keeps its own pool; the default 100 runs out
87
+ # (the harness's own container starts with 400). A service container
88
+ # takes no server flags, so set it and restart.
89
+ run: |
90
+ pg=${{ job.services.postgres.id }}
91
+ docker exec "$pg" psql -U postgres -c "ALTER SYSTEM SET max_connections = 400"
92
+ docker restart "$pg"
93
+ for _ in $(seq 60); do
94
+ docker exec "$pg" pg_isready -U postgres -h 127.0.0.1 && break
95
+ sleep 1
96
+ done
97
+ docker exec "$pg" psql -U postgres -tAc "SHOW max_connections"
98
+
99
+ - name: make cluster
100
+ env:
101
+ NOETA_TEST_POSTGRES_DSN: postgresql://postgres:postgres@localhost:5432/postgres
102
+ run: make cluster
@@ -0,0 +1,85 @@
1
+ # Build the VitePress documentation site and deploy to GitHub Pages.
2
+ #
3
+ # Push to main (docs changes) or manual dispatch: build + deploy.
4
+ # Pull request touching the docs: build only, so a broken page fails the PR
5
+ # instead of the deploy after merge. Nothing is uploaded or deployed.
6
+ # Uses actions/deploy-pages — Pages source must be set to "GitHub Actions"
7
+ # in the repository settings (Settings → Pages → Build and deployment → Source).
8
+
9
+ name: docs
10
+
11
+ on:
12
+ push:
13
+ branches: [main]
14
+ paths:
15
+ - "docs/**"
16
+ - "!docs/specs/**"
17
+ - ".github/workflows/docs.yml"
18
+ pull_request:
19
+ branches: [main]
20
+ paths:
21
+ - "docs/**"
22
+ - "!docs/specs/**"
23
+ - ".github/workflows/docs.yml"
24
+ workflow_dispatch: {}
25
+
26
+ permissions:
27
+ contents: read
28
+
29
+ # Deploys share one queue and are never cancelled mid-flight; PR builds get
30
+ # their own group per ref and a newer push cancels the stale one.
31
+ concurrency:
32
+ group: ${{ github.event_name == 'pull_request' && format('docs-pr-{0}', github.ref) || 'pages' }}
33
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
34
+
35
+ jobs:
36
+ build:
37
+ runs-on: ubuntu-latest
38
+ timeout-minutes: 15
39
+ permissions:
40
+ contents: read
41
+ pages: write # configure-pages reads the site's Pages settings
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+
45
+ - name: Setup Node.js
46
+ uses: actions/setup-node@v4
47
+ with:
48
+ node-version: 20
49
+ cache: npm
50
+ cache-dependency-path: docs/package-lock.json
51
+
52
+ - name: Install dependencies
53
+ run: npm ci
54
+ working-directory: docs
55
+
56
+ - name: Configure Pages
57
+ if: github.event_name != 'pull_request'
58
+ id: pages
59
+ uses: actions/configure-pages@v5
60
+
61
+ - name: Build VitePress site
62
+ run: npm run build
63
+ working-directory: docs
64
+
65
+ - name: Upload artifact
66
+ if: github.event_name != 'pull_request'
67
+ uses: actions/upload-pages-artifact@v3
68
+ with:
69
+ path: docs/.vitepress/dist
70
+
71
+ deploy:
72
+ if: github.event_name != 'pull_request'
73
+ needs: build
74
+ runs-on: ubuntu-latest
75
+ timeout-minutes: 10
76
+ permissions:
77
+ pages: write
78
+ id-token: write
79
+ environment:
80
+ name: github-pages
81
+ url: ${{ steps.deployment.outputs.page_url }}
82
+ steps:
83
+ - name: Deploy to GitHub Pages
84
+ id: deployment
85
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,73 @@
1
+ # Publish `noeta` to PyPI when a `v*` tag is pushed. Procedure: docs/releasing.md.
2
+ # Auth is PyPI Trusted Publishing (OIDC); no token is stored anywhere.
3
+
4
+ name: Release
5
+
6
+ on:
7
+ push:
8
+ tags: ["v*"]
9
+ workflow_dispatch: {}
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ concurrency:
15
+ group: release-${{ github.ref }}
16
+ cancel-in-progress: false
17
+
18
+ jobs:
19
+ # The suite on the exact commit being published: a tag can point anywhere.
20
+ test:
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 30
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: astral-sh/setup-uv@v6
26
+ with:
27
+ python-version: "3.12"
28
+ - name: Install ripgrep
29
+ run: sudo apt-get update -qq && sudo apt-get install -y -qq ripgrep
30
+ - run: make check
31
+
32
+ build:
33
+ runs-on: ubuntu-latest
34
+ timeout-minutes: 10
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ - name: Changelog gate — the tagged version must have a dated section
38
+ if: startsWith(github.ref, 'refs/tags/v')
39
+ run: |
40
+ VERSION="${GITHUB_REF_NAME#v}"
41
+ if ! grep -Eq "^## \[${VERSION}\] - [0-9]{4}-[0-9]{2}-[0-9]{2}$" CHANGELOG.md; then
42
+ echo "::error::CHANGELOG.md has no dated '## [${VERSION}] - YYYY-MM-DD' section; see docs/releasing.md"
43
+ exit 1
44
+ fi
45
+ - uses: astral-sh/setup-uv@v6
46
+ with:
47
+ python-version: "3.12"
48
+ - name: Build
49
+ run: |
50
+ uv build
51
+ ls -l dist/
52
+ - name: The wheel's version is the tag's
53
+ if: startsWith(github.ref, 'refs/tags/v')
54
+ run: |
55
+ VERSION="${GITHUB_REF_NAME#v}"
56
+ ls dist/noeta-"${VERSION}"-*.whl
57
+ - uses: actions/upload-artifact@v4
58
+ with:
59
+ name: dist
60
+ path: dist/
61
+
62
+ publish:
63
+ needs: [test, build]
64
+ if: startsWith(github.ref, 'refs/tags/v')
65
+ runs-on: ubuntu-latest
66
+ timeout-minutes: 10
67
+ permissions:
68
+ id-token: write # mint the short-lived PyPI OIDC token
69
+ steps:
70
+ - uses: actions/download-artifact@v4
71
+ with: { name: dist, path: dist/ }
72
+ - uses: astral-sh/setup-uv@v6
73
+ - run: uv publish --trusted-publishing always dist/*
@@ -0,0 +1,73 @@
1
+ # Claude Code local config of contributors (not part of noeta)
2
+ .claude/
3
+
4
+ # Live-test secrets (never committed)
5
+ .env
6
+
7
+ # Python
8
+ __pycache__/
9
+ *.py[cod]
10
+ *$py.class
11
+ *.so
12
+ *.egg-info/
13
+ .venv/
14
+ venv/
15
+ env/
16
+ .pytest_cache/
17
+ .mypy_cache/
18
+ .ruff_cache/
19
+ .import_linter_cache/
20
+ .tox/
21
+ htmlcov/
22
+ .coverage
23
+ .coverage.*
24
+ dist/
25
+ build/
26
+ site/
27
+ *.egg
28
+ node_modules/
29
+
30
+ # web/ test output
31
+ web/test-results/
32
+ web/playwright-report/
33
+
34
+ # desktop/ build and test output
35
+ desktop/build/
36
+ desktop/release/
37
+ desktop/test-results/
38
+ desktop/playwright-report/
39
+
40
+ # IDE / Editor
41
+ .idea/
42
+ .vscode/
43
+ *.swp
44
+ *.swo
45
+ *~
46
+
47
+ # OS
48
+ .DS_Store
49
+ Thumbs.db
50
+
51
+ # Local demo / scratch artifacts
52
+ *.sqlite
53
+ *.sqlite-shm
54
+ *.sqlite-wal
55
+ *.tmp.xml
56
+ *.tmp
57
+
58
+ # Local host config that may hold an api_key — ignored so a local copy can
59
+ # never be committed.
60
+ /noeta.config.json
61
+
62
+ # prompt-regression eval run outputs
63
+ evals/results/
64
+ bench/jobs/
65
+ bench/datasets/
66
+ bench/logs/
67
+
68
+ # make parity output (the replay capture and the report it writes)
69
+ parity/out/
70
+ parity/report.md
71
+
72
+ # Claude Code's wording, even hashed, stays out of the repository
73
+ parity/*/cc-windows.bin
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,81 @@
1
+ ## Communication
2
+
3
+ - Keep answers concise and direct; lead with the conclusion and the next step.
4
+ - Don't add unrelated explanation; when unsure, state your assumptions and the risks.
5
+ - Don't narrate what you're about to do or recap what you just did; report only what changes what the reader does next.
6
+ - Conversation may happen in whatever language the other side uses; everything committed to the repo (see Language) is English.
7
+
8
+ ## Language
9
+
10
+ - All repository artifacts are written in English: docs (`CONTEXT.md`, `docs/adr/`, `docs/specs/`), code comments, and identifiers. The one exception is the docs site: every page in `docs/` that the site serves (`docs/.vitepress/config.ts` lists them) has a Chinese page at the same path under `docs/zh/`, written as Chinese rather than translated, and a change to one updates both.
11
+ - Keep technical terms in their canonical English form and spell them consistently throughout: code identifiers (function / class / file / variable names), API / library / tool / command names, file paths, and fixed architecture terms (module, interface, seam, adapter, deep module, etc.). Don't invent alternate names or switch between synonyms.
12
+ - Write clear, idiomatic English prose — not word-for-word translation from another language.
13
+ - Pick one spelling per term and use it everywhere; don't mix variants.
14
+ - Naming is enforced by `scripts/lint-naming.py` (in `make check`); the banned names and the canonical `Task` / `root_task_id` are in `CONTEXT.md`'s `Naming:` entries.
15
+
16
+ ## Context / ADR
17
+
18
+ - Read `CONTEXT.md` first whenever you touch domain concepts, system boundaries, or stable conventions. A package with its own `AGENTS.md` keeps its module-only concepts there.
19
+ - Read `docs/adr/` (start at `docs/adr/index.md`) first whenever a long-term architecture trade-off is involved; never rely on an ADR marked `superseded`, and read the ADRs listed under its `Refined by`.
20
+ - Code is the single source of truth for "what is." When docs and code disagree, trust the code and fix the docs.
21
+ - One fact, one home: never state the same fact in two docs — link instead. The docs site is the home of explanations for users; `CONTEXT.md` and ADRs are for contributors and the site links to them. A change that invalidates a `CONTEXT.md` entry or ADR updates it in the same task.
22
+ - Write docs lean: a `CONTEXT.md` or `AGENTS.md` line exists only if code can't tell an agent the same thing quickly; point at code by repo path instead of restating it. An ADR only for a shipped decision that is costly to reverse; changing one is a new ADR that refines or supersedes it, never an amendment in place. `scripts/check-docs.sh` holds the budgets and formats — trim, don't raise them. When unsure, don't write it.
23
+ - Code comments carry only constraints the code can't show — never a `docs/specs/` reference (one-shot artifacts). Code needn't cite ADRs; where a comment names one it is plain prose, not a contract.
24
+ - Archived specs (`docs/specs/archive/`) are construction history — never read them as a description of the current system.
25
+
26
+ ## Task flow
27
+
28
+ - Before starting, run `make check`. Red that isn't yours → report it before anything else.
29
+ - When the idea isn't clear yet, shape before code: ask one question at a time, each with a recommended answer and its reasoning; look up what code and docs can answer instead of asking. Converged = no open decision that would change the implementation path, boundary, or acceptance criteria. ("Just recommend" → answer straight, flagging the assumptions.)
30
+ - Shaping red lines: no implementation code and no spec before the design converges; a finished spec doesn't slide into implementation — starting is a separate decision.
31
+ - Record decisions in the spec's `Decisions` as they settle — not yet in `CONTEXT.md` or `docs/adr/`; those are distilled at review wrap-up from what survived. One-off details are not persisted.
32
+ - Write the spec per `docs/specs/TEMPLATE.md` at `docs/specs/<YYYY-MM-DD>-<slug>.md`: `active` if implementation starts now, `proposed` if queued. A terminal status (`done` / `superseded` / `dropped`) and the move into `docs/specs/archive/` are one action.
33
+ - A change with no open decision (a bug fix with clear expected behavior, a small change inside one module) needs no spec: implement directly and put the why in the commit message.
34
+ - Implement against the spec: flip it `active` (set `owner` when others may work in parallel); tick Plan tasks as they complete; log progress, decision changes, and friction in its Progress log. For large tasks with clean boundaries, split work across subagents while the main agent integrates and verifies.
35
+ - For architecture improvements, refactoring direction, and module design, start from the existing decisions (`docs/adr/`) and the engineering constraints below.
36
+ - done = every acceptance criterion met + all automated gates green. Both required.
37
+ - Before merge, review per `docs/reviewing.md`; merging archives the spec and distills long-term knowledge.
38
+ - Resume across sessions from the spec alone; write no separate handoff doc. A spec-less change that spans sessions leaves its state in the branch's commit messages.
39
+
40
+ ## Verbs
41
+
42
+ - install: `make install` (uv sync with every extra; first time)
43
+ - test: `make test`
44
+ - lint: `make lint`
45
+ - build: `make build` (wheel and sdist into `dist/`)
46
+ - e2e: `make e2e` — `-m live` tests against a real model (providers, ACP); needs credentials, never part of `check`
47
+ - eval: `make eval` — prompt-regression scenarios against a real model, compared to `evals/baseline.json`; `make eval-baseline` re-records it; needs credentials, never part of `check`
48
+ - parity: `make parity` — noeta replayed offline through Claude Code's recorded scenarios, every request difference in `parity/report.md` (`scripts/parity/README.md`); never part of `check`
49
+ - cluster: `make cluster` — worker processes on one Postgres (a throwaway `postgres:16` container, or `NOETA_TEST_POSTGRES_DSN`) under random SIGKILL / SIGSTOP with a scripted provider (`tests/cluster`); a known gap is an `xfail(strict=True)` there; `NOETA_CLUSTER_SEED` replays a run; never part of `check`
50
+ - check: `make check` — ruff, mypy --strict, `scripts/lint-naming.py`, `scripts/lint-layout.py` (placement), `lint-imports` (layering), pytest with coverage ≥ 85, `make example` (the example plugins), `scripts/check-docs.sh`
51
+ - docs: `make docs` — the docs site (VitePress in `docs/`, diagrams in `docs/diagrams/`, `npm run diagrams` restyles them); needs node, never part of `check`; `make docs-dev` previews it
52
+ - frontends: `make frontends` — each front end's own checks (`web/`: npm typecheck, vitest, Playwright against a real `noeta serve` on a scripted provider); needs node and a browser, never part of `check`
53
+ - release: tag push per `docs/releasing.md` — approval gate
54
+
55
+ ## Gates
56
+
57
+ - Automated gates (required for done): `make check`. CI's test job runs the same target; CI-only on top: the Postgres parameters of the store contract tests (`NOETA_TEST_POSTGRES_DSN`), the Python 3.11 / 3.12 / 3.13 matrix, and the `cluster` job (`make cluster` against a Postgres service container).
58
+ - `make check` can't judge model-facing prompt text or provider wire behavior. A change there also runs `make eval` (no scenario may regress; re-record the baseline when a scenario changes) and the relevant `make e2e` tests.
59
+ - Approval gates (the maintainer signs off before running): release, data migration or deletion on a host's store.
60
+
61
+ ## Engineering constraints
62
+
63
+ - Feature work changes behavior; maintenance work changes structure. Never mix them in one diff.
64
+ - Prefer existing patterns in the repo, keep changes focused, and avoid unrelated refactors.
65
+ - Architecturally, prefer deep modules: a small interface hiding a substantial implementation.
66
+ - The interface is the test surface; don't introduce a seam without a real need to substitute the implementation.
67
+ - Put new code where `CONTEXT.md`: Where code goes says, and respect the layering (`CONTEXT.md`: Layers): the kernel carries no capability; a plugin imports only `noeta.core` and `noeta.toolkit`. `lint-imports` and `scripts/lint-layout.py` enforce it.
68
+ - Name things for what they do, never a metaphor — in code, doc terms, and file slugs alike.
69
+ - Run verification matched to the risk; if you can't verify, say why.
70
+
71
+ ## Release
72
+
73
+ - A merged behavior change to `noeta/` should be followed by a release; the published package must not lag `main`.
74
+ - Bumps are patch by default — minor/major is the maintainer's explicit call.
75
+ - Follow `docs/releasing.md`. Human sign-off = pushing the `vX.Y.Z` tag.
76
+
77
+ ## Maintenance
78
+
79
+ - After a large feature merges, run a scoped gc over the changed area; periodically run a global gc — both per `docs/gc.md`.
80
+ - When `make check` prints `gc due`, finish the task first, then tell the user and offer a scoped gc.
81
+ - Every gc change leaves behavior unchanged; never mix gc into a feature diff.