vis-agent 0.2.2__tar.gz → 0.2.4__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 (107) hide show
  1. vis_agent-0.2.4/PKG-INFO +63 -0
  2. vis_agent-0.2.4/README.md +39 -0
  3. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/activity.json +2 -2
  4. vis_agent-0.2.4/contracts/agents.json +11 -0
  5. vis_agent-0.2.4/contracts/diff.json +5 -0
  6. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/activity-cases.json +2 -2
  7. vis_agent-0.2.4/contracts/fixtures/diff.json +16 -0
  8. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/live-primitives.json +4 -0
  9. vis_agent-0.2.4/contracts/fixtures/plans.json +117 -0
  10. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/gateway.json +130 -0
  11. vis_agent-0.2.4/contracts/improve.json +12 -0
  12. vis_agent-0.2.4/contracts/plans.json +16 -0
  13. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/activity.json +7 -19
  14. vis_agent-0.2.4/contracts/schema/agents.json +219 -0
  15. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/config.json +25 -0
  16. vis_agent-0.2.4/contracts/schema/diff.json +102 -0
  17. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/gateway.json +198 -0
  18. vis_agent-0.2.4/contracts/schema/improve.json +312 -0
  19. vis_agent-0.2.4/contracts/schema/plans.json +45 -0
  20. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/toggle.json +4 -0
  21. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/view.json +40 -0
  22. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/view.json +1 -0
  23. {vis_agent-0.2.2 → vis_agent-0.2.4}/pyproject.toml +4 -1
  24. vis_agent-0.2.4/src/blockether/vis/__init__.py +6 -0
  25. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/_contracts.py +1 -0
  26. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/_outside.py +94 -2
  27. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/activity.py +55 -21
  28. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/engine/__init__.py +9 -3
  29. vis_agent-0.2.4/src/blockether/vis/engine/_agent.py +185 -0
  30. vis_agent-0.2.4/src/blockether/vis/engine/_agents.py +33 -0
  31. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/engine/_client.py +649 -147
  32. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/engine/_council.py +125 -28
  33. vis_agent-0.2.4/src/blockether/vis/engine/_extensions.py +268 -0
  34. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/engine/_local.py +67 -44
  35. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/extension.py +180 -58
  36. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/extension_package.py +416 -83
  37. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/views.py +55 -4
  38. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_activity.py +54 -0
  39. vis_agent-0.2.4/tests/test_agent.py +272 -0
  40. vis_agent-0.2.4/tests/test_agent_extension_lifecycle.py +224 -0
  41. vis_agent-0.2.4/tests/test_agent_extensions.py +344 -0
  42. vis_agent-0.2.4/tests/test_agents.py +353 -0
  43. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_catalog.py +1 -1
  44. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_client.py +52 -1
  45. vis_agent-0.2.4/tests/test_client_extensions_engine.py +250 -0
  46. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_contracts.py +5 -5
  47. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_council.py +10 -2
  48. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_declarations.py +7 -23
  49. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_engine.py +287 -85
  50. vis_agent-0.2.4/tests/test_engine_docstrings.py +54 -0
  51. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_extension_package.py +505 -43
  52. vis_agent-0.2.4/tests/test_extension_reference.py +63 -0
  53. vis_agent-0.2.4/tests/test_gateway_performance.py +358 -0
  54. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_live_primitives.py +86 -0
  55. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_local.py +47 -0
  56. vis_agent-0.2.4/tests/test_method_typing.py +87 -0
  57. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_monitor_recipe.py +1 -1
  58. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_namespace.py +4 -2
  59. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_outside.py +255 -0
  60. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_providers.py +2 -2
  61. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_registration.py +11 -6
  62. vis_agent-0.2.4/tests/test_sdk_guide.py +708 -0
  63. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_views.py +25 -0
  64. vis_agent-0.2.2/PKG-INFO +0 -33
  65. vis_agent-0.2.2/README.md +0 -11
  66. vis_agent-0.2.2/src/blockether/vis/__init__.py +0 -6
  67. {vis_agent-0.2.2 → vis_agent-0.2.4}/.gitignore +0 -0
  68. {vis_agent-0.2.2 → vis_agent-0.2.4}/LICENSE +0 -0
  69. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/config.json +0 -0
  70. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/content.json +0 -0
  71. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/council.json +0 -0
  72. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/activity-arguments.json +0 -0
  73. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/activity-copy.json +0 -0
  74. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/activity-groups.json +0 -0
  75. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/activity-repl.json +0 -0
  76. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/activity-results.json +0 -0
  77. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/activity-tables.json +0 -0
  78. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/activity.json +0 -0
  79. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/session-health.json +0 -0
  80. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/fixtures/view.json +0 -0
  81. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/provider.json +0 -0
  82. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/python-host.json +0 -0
  83. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/common.json +0 -0
  84. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/content.json +0 -0
  85. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/council.json +0 -0
  86. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/provider.json +0 -0
  87. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/python-host.json +0 -0
  88. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/surface.json +0 -0
  89. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/symbol.json +0 -0
  90. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/schema/test-runner.json +0 -0
  91. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/surface.json +0 -0
  92. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/symbol.json +0 -0
  93. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/test-runner.json +0 -0
  94. {vis_agent-0.2.2 → vis_agent-0.2.4}/contracts/toggle.json +0 -0
  95. {vis_agent-0.2.2 → vis_agent-0.2.4}/examples/greeter/tests/test_greeter.py +0 -0
  96. {vis_agent-0.2.2 → vis_agent-0.2.4}/hatch_build.py +0 -0
  97. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/_wire.py +0 -0
  98. {vis_agent-0.2.2 → vis_agent-0.2.4}/src/blockether/vis/py.typed +0 -0
  99. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/conftest.py +0 -0
  100. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_authoring.py +0 -0
  101. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_catalog_recipe.py +0 -0
  102. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_ci_report_recipe.py +0 -0
  103. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_code_quality_recipe.py +0 -0
  104. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_goals.py +0 -0
  105. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_live_wait.py +0 -0
  106. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_symbol_contract.py +0 -0
  107. {vis_agent-0.2.2 → vis_agent-0.2.4}/tests/test_testing.py +0 -0
@@ -0,0 +1,63 @@
1
+ Metadata-Version: 2.5
2
+ Name: vis-agent
3
+ Version: 0.2.4
4
+ Summary: The Vis Python SDK — author extensions and control local or remote engines.
5
+ Project-URL: Homepage, https://vis.blockether.com
6
+ Project-URL: Documentation, https://vis.blockether.com
7
+ Project-URL: Source, https://github.com/Blockether/vis
8
+ Project-URL: Issues, https://github.com/Blockether/vis/issues
9
+ Author: Blockether
10
+ License-Expression: Apache-2.0
11
+ License-File: LICENSE
12
+ Keywords: agent,automation,extension,human-in-the-loop,vis
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Software Development :: Build Tools
17
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
+ Requires-Python: >=3.11
19
+ Requires-Dist: jsonschema<5,>=4.23
20
+ Requires-Dist: packaging>=24
21
+ Provides-Extra: docs
22
+ Requires-Dist: pdoc==16.0.0; extra == 'docs'
23
+ Description-Content-Type: text/markdown
24
+
25
+ # vis-agent
26
+
27
+ Python SDK for Vis extensions and agent sessions.
28
+
29
+ ```sh
30
+ pip install vis-agent
31
+ ```
32
+
33
+ Requires Python 3.11+. Install the Vis executable and configure a provider
34
+ separately for local use.
35
+
36
+ - [Python SDK guide](https://vis.blockether.com/python-sdk.html) — run a local
37
+ agent, continue a conversation or connect to a shared gateway. `Agent` is
38
+ available in SDK `0.2.3` and newer.
39
+ - [Python API reference](https://vis.blockether.com/python-sdk-api/) — browse
40
+ classes, methods, signatures and types generated from the SDK source.
41
+ - [Extension guide](https://vis.blockether.com/extending.html) — add tools to Vis.
42
+ - [Documentation](https://vis.blockether.com) — browse all guides and reference pages.
43
+
44
+ The online API reference follows `main`, so it can include unreleased APIs that
45
+ are not yet available in the latest PyPI package. The SDK guide marks those APIs.
46
+
47
+ ## Generate the API reference locally
48
+
49
+ From `packages/vis-agent` in a Vis checkout, create a virtual environment and
50
+ install the documentation dependencies:
51
+
52
+ ```sh
53
+ python3 -m venv .venv
54
+ . .venv/bin/activate
55
+ python -m pip install -e '.[docs]'
56
+ python -m pdoc blockether.vis '!blockether\.vis\._' \
57
+ --docformat google --no-show-source -o ../../target/python-sdk-api
58
+ ```
59
+
60
+ Open `../../target/python-sdk-api/index.html` in your browser. [pdoc](https://pdoc.dev/)
61
+ generates the reference from public Python symbols, type annotations and
62
+ docstrings; you do not need to start Vis or configure a model provider. The docs
63
+ workflow regenerates and publishes it when SDK changes reach `main`.
@@ -0,0 +1,39 @@
1
+ # vis-agent
2
+
3
+ Python SDK for Vis extensions and agent sessions.
4
+
5
+ ```sh
6
+ pip install vis-agent
7
+ ```
8
+
9
+ Requires Python 3.11+. Install the Vis executable and configure a provider
10
+ separately for local use.
11
+
12
+ - [Python SDK guide](https://vis.blockether.com/python-sdk.html) — run a local
13
+ agent, continue a conversation or connect to a shared gateway. `Agent` is
14
+ available in SDK `0.2.3` and newer.
15
+ - [Python API reference](https://vis.blockether.com/python-sdk-api/) — browse
16
+ classes, methods, signatures and types generated from the SDK source.
17
+ - [Extension guide](https://vis.blockether.com/extending.html) — add tools to Vis.
18
+ - [Documentation](https://vis.blockether.com) — browse all guides and reference pages.
19
+
20
+ The online API reference follows `main`, so it can include unreleased APIs that
21
+ are not yet available in the latest PyPI package. The SDK guide marks those APIs.
22
+
23
+ ## Generate the API reference locally
24
+
25
+ From `packages/vis-agent` in a Vis checkout, create a virtual environment and
26
+ install the documentation dependencies:
27
+
28
+ ```sh
29
+ python3 -m venv .venv
30
+ . .venv/bin/activate
31
+ python -m pip install -e '.[docs]'
32
+ python -m pdoc blockether.vis '!blockether\.vis\._' \
33
+ --docformat google --no-show-source -o ../../target/python-sdk-api
34
+ ```
35
+
36
+ Open `../../target/python-sdk-api/index.html` in your browser. [pdoc](https://pdoc.dev/)
37
+ generates the reference from public Python symbols, type annotations and
38
+ docstrings; you do not need to start Vis or configure a model provider. The docs
39
+ workflow regenerates and publishes it when SDK changes reach `main`.
@@ -46,7 +46,7 @@
46
46
  "lifecycle": "The engine allocates invocation identity and entry sequence, records running before execution, and exactly one succeeded, failed or cancelled result. Presentation cannot control the operation.",
47
47
  "counts": "Counts describe observed invocations, including omitted rows. Group rows are presentation, not additional invocations. omitted.by_classification counts omitted evidence by signal. Readers form one group per exact operation across an Activity block, not just adjacent runs. operation_groups supplies known labels; unknown operations use their exact names. Groups follow first-entry order and members retain sequence order; grouping is not a global chronology. A group keeps its first row identity (the first child for an engine shell group). Labels, presenters, presentations and states never determine membership. Shell polling children remain evidence of one command, not more commands.",
48
48
  "arguments": "Within each operation group, readers may collapse rows with the same argument_key and show ×N. The engine supplies this optional opaque 64-character lowercase hexadecimal equality key for complete portable arguments within a block, salted per block. Map order is irrelevant; sequence order and value types are significant. Oversized or unsupported arguments have no key and stay separate. Never infer equality from redacted or truncated display text. Keep first-invocation disclosure identity, all outcomes and child evidence; counts still describe actual invocations. A shell group inherits its launch key, never a poll key.",
49
- "bounds": "Redact credential-bearing structured fields before summarizing; enforce admission limits per event and presentation. Retain all admitted invocations and details durably without a total count or byte cap. Limit each history-bearing response to max_page_rows invocations and max_page_bytes, never shedding details. Row ids are globally unique within a projection. Legacy omitted counts describe already-lost historical records, never records still available through paging.",
50
- "declaration": "Symbols publish human-facing presentations: understandable sentence-case English headlines, a one-line summary, content blocks and optional sections of the same headline/summary/content shape. Headline and summary remain visible when collapsed; only content is disclosed. Declare show_start=false for quick operations that need only an end result; the default true shows running progress. Internal start/end events still preserve ordering, timing, failures and cancellation. End-only content stays hidden until settlement. Up to 8 sections, 32 blocks in total and 32 KiB per replacement; each headline and summary is at most 512 UTF-8 bytes. Content includes headings, Markdown, tables, code, diffs, attachment references and progress. The engine alone owns identity, timing and outcome; presentation failures never alter tool results."
49
+ "bounds": "Redact credential-bearing structured fields before summarizing. Retain complete valid presentation content and all admitted invocations durably without a total count or byte cap. History-bearing responses contain at most max_page_rows invocations and target max_page_bytes; one indivisible invocation may exceed the byte target and is never discarded. Row ids are globally unique within a projection. Legacy omitted counts describe already-lost historical records, never records still available through paging.",
50
+ "declaration": "Symbols publish human-facing presentations: understandable sentence-case English headlines, a one-line summary, content blocks and optional sections of the same headline/summary/content shape. Headline and summary remain visible when collapsed; only content is disclosed. Declare show_start=false for quick operations that need only an end result; the default true shows running progress. Internal start/end events still preserve ordering, timing, failures and cancellation. End-only content stays hidden until settlement. Content and non-nested sections are retained in full without block-count or byte ceilings; each headline and summary is at most 512 UTF-8 bytes. Content includes headings, Markdown, tables, code, diffs, attachment references and progress. The engine alone owns identity, timing and outcome; presentation failures never alter tool results."
51
51
  }
52
52
  }
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 1,
3
+ "limits": {
4
+ "depth": 2,
5
+ "team_children": 32,
6
+ "active_children": 8,
7
+ "default_iterations": 32,
8
+ "max_iterations": 200,
9
+ "task_chars": 8192
10
+ }
11
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "version": 1,
3
+ "media_type": "application/vnd.vis.diff+json",
4
+ "revision_request": "Review every comment on this exact diff version. Check that it is still the latest version before acting. Apply requested fixes only within the already authorized implementation scope, run affected checks and attach the updated diff and implementation record. Do not treat this review as approval of new scope or permission to commit, push or deploy."
5
+ }
@@ -1803,8 +1803,8 @@
1803
1803
  }
1804
1804
  },
1805
1805
  {
1806
- "name": "sections-share-block-bound",
1807
- "valid": false,
1806
+ "name": "sections-retain-all-blocks",
1807
+ "valid": true,
1808
1808
  "projection": {
1809
1809
  "state": "running",
1810
1810
  "counts": {
@@ -0,0 +1,16 @@
1
+ {
2
+ "schema_version": 1,
3
+ "patch": "diff --git a/search.clj b/search.clj\n--- a/search.clj\n+++ b/search.clj\n@@ -1 +1 @@\n-(search title)\n+(search title {:archived true})\n",
4
+ "source": {
5
+ "type": "draft",
6
+ "backend": "worktree",
7
+ "label": "session-search",
8
+ "base_revision": "0123456789abcdef"
9
+ },
10
+ "comments": [
11
+ {
12
+ "quote": "+(search title {:archived true})",
13
+ "body": "Keep archived sessions optional."
14
+ }
15
+ ]
16
+ }
@@ -6,6 +6,10 @@
6
6
  ],
7
7
  "id": "live-primitives",
8
8
  "nodes": [
9
+ {
10
+ "id": "section-break",
11
+ "type": "divider"
12
+ },
9
13
  {
10
14
  "id": "h1",
11
15
  "type": "heading",
@@ -0,0 +1,117 @@
1
+ {
2
+ "documents": [
3
+ {
4
+ "filename": "PLAN-search.md",
5
+ "text": "# Search\n\n**Feature:** search\n**Status:** ready\n\n## Spec\nFind sessions.\n",
6
+ "expected": {
7
+ "kind": "plan",
8
+ "feature": "search",
9
+ "status": "ready"
10
+ },
11
+ "actions": [
12
+ "approve"
13
+ ]
14
+ },
15
+ {
16
+ "filename": "PLAN-search.md",
17
+ "text": "# Search\n**Feature:** search\n**Status:** accepted\n",
18
+ "expected": {
19
+ "kind": "plan",
20
+ "feature": "search",
21
+ "status": "accepted"
22
+ },
23
+ "actions": [
24
+ "approve"
25
+ ]
26
+ },
27
+ {
28
+ "filename": "IMPLEMENTATION-search.md",
29
+ "text": "# Search\n**Feature:** search\n**Status:** implementing\n",
30
+ "expected": {
31
+ "kind": "implementation",
32
+ "feature": "search",
33
+ "status": "implementing"
34
+ },
35
+ "actions": []
36
+ },
37
+ {
38
+ "filename": "PLAN-search.md",
39
+ "text": "# Search\n**Feature:** search\n**Status:** in-review\n",
40
+ "expected": {
41
+ "kind": "plan",
42
+ "feature": "search",
43
+ "status": "in-review"
44
+ },
45
+ "actions": []
46
+ },
47
+ {
48
+ "filename": "notes.md",
49
+ "text": "# Search\n**Feature:** search\n**Status:** ready\n",
50
+ "expected": null,
51
+ "actions": []
52
+ },
53
+ {
54
+ "filename": "PLAN-search.md",
55
+ "text": "# Search\n**Feature:** other\n**Status:** ready\n",
56
+ "expected": null,
57
+ "actions": []
58
+ },
59
+ {
60
+ "filename": "PLAN-search.md",
61
+ "text": "# Search\n**Feature:** search\n**Status:** ready\n**Status:** accepted\n",
62
+ "expected": null,
63
+ "actions": []
64
+ },
65
+ {
66
+ "filename": "PLAN-search.md",
67
+ "text": "# Search\n## Spec\n**Feature:** search\n**Status:** ready\n",
68
+ "expected": null,
69
+ "actions": []
70
+ }
71
+ ],
72
+ "annotations": [
73
+ {
74
+ "body": "# Plan\n\n## Resolved comments\n\n- **Whole document** — Earlier remark\n - Resolved in v2: Kept.",
75
+ "comments": [
76
+ {
77
+ "quote": "",
78
+ "body": "Keep the review separate."
79
+ },
80
+ {
81
+ "quote": "A “passage”\n here",
82
+ "body": "A\n decision."
83
+ }
84
+ ],
85
+ "rendered": "# Plan\n\n## Resolved comments\n\n- **Whole document** — Earlier remark\n - Resolved in v2: Kept.\n\n## Comments\n\n- **Whole document** — Keep the review separate.\n- **“A \"passage\" here”** — A decision.\n"
86
+ },
87
+ {
88
+ "body": "# Plan\n\n",
89
+ "comments": [
90
+ {
91
+ "quote": "x",
92
+ "body": " "
93
+ }
94
+ ],
95
+ "rendered": "# Plan\n"
96
+ },
97
+ {
98
+ "body": "# Plan",
99
+ "comments": [],
100
+ "rendered": "# Plan\n"
101
+ }
102
+ ],
103
+ "unrecognized": [
104
+ "# Plan\n\n## Comments\n\nOrdinary prose.\n",
105
+ "# Plan\n\n## Resolved comments\n\nDecisions.\n"
106
+ ],
107
+ "quotes": [
108
+ {
109
+ "input": " A “quote”\n with spaces ",
110
+ "expected": "A \"quote\" with spaces"
111
+ },
112
+ {
113
+ "input": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
114
+ "expected": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa…aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
115
+ }
116
+ ]
117
+ }
@@ -30,6 +30,50 @@
30
30
  "semantics": "Authenticated requests carrying client_id refresh an existing lease; idle connected clients send a bounded GET keepalive. Failure invalidates the client until it is closed and connected anew. Closing releases only its lease, never the gateway or sessions."
31
31
  },
32
32
  "routes": [
33
+ {
34
+ "audience": "sdk",
35
+ "operations": {
36
+ "put": {
37
+ "request": "json",
38
+ "response": "json"
39
+ },
40
+ "delete": {
41
+ "request": "none",
42
+ "response": "json"
43
+ }
44
+ },
45
+ "path": "/v1/sessions/:sid/client-extensions"
46
+ },
47
+ {
48
+ "audience": "sdk",
49
+ "operations": {
50
+ "get": {
51
+ "request": "none",
52
+ "response": "json"
53
+ }
54
+ },
55
+ "path": "/v1/sessions/:sid/client-calls"
56
+ },
57
+ {
58
+ "audience": "sdk",
59
+ "operations": {
60
+ "post": {
61
+ "request": "json",
62
+ "response": "json"
63
+ }
64
+ },
65
+ "path": "/v1/sessions/:sid/client-calls/:call_id/result"
66
+ },
67
+ {
68
+ "audience": "sdk",
69
+ "operations": {
70
+ "post": {
71
+ "request": "json",
72
+ "response": "json"
73
+ }
74
+ },
75
+ "path": "/v1/sessions/:sid/client-calls/:call_id/activity"
76
+ },
33
77
  {
34
78
  "audience": "public",
35
79
  "operations": {
@@ -644,6 +688,40 @@
644
688
  },
645
689
  "path": "/v1/sessions/:sid/council"
646
690
  },
691
+ {
692
+ "audience": "sdk",
693
+ "operations": {
694
+ "get": {
695
+ "request": "none",
696
+ "response": "json"
697
+ },
698
+ "post": {
699
+ "request": "json",
700
+ "response": "json"
701
+ }
702
+ },
703
+ "path": "/v1/sessions/:sid/agents"
704
+ },
705
+ {
706
+ "audience": "sdk",
707
+ "operations": {
708
+ "post": {
709
+ "request": "json",
710
+ "response": "json"
711
+ }
712
+ },
713
+ "path": "/v1/sessions/:sid/agents/cancel"
714
+ },
715
+ {
716
+ "audience": "sdk",
717
+ "operations": {
718
+ "post": {
719
+ "request": "json",
720
+ "response": "json"
721
+ }
722
+ },
723
+ "path": "/v1/sessions/:sid/agents/route"
724
+ },
647
725
  {
648
726
  "audience": "sdk",
649
727
  "operations": {
@@ -1096,6 +1174,58 @@
1096
1174
  },
1097
1175
  "path": "/v1/sessions/actions/search"
1098
1176
  },
1177
+ {
1178
+ "audience": "sdk",
1179
+ "operations": {
1180
+ "get": {
1181
+ "request": "none",
1182
+ "response": "json"
1183
+ },
1184
+ "post": {
1185
+ "request": "json",
1186
+ "response": "json"
1187
+ }
1188
+ },
1189
+ "path": "/v1/improve"
1190
+ },
1191
+ {
1192
+ "audience": "sdk",
1193
+ "operations": {
1194
+ "get": {
1195
+ "request": "none",
1196
+ "response": "json"
1197
+ },
1198
+ "patch": {
1199
+ "request": "json",
1200
+ "response": "json"
1201
+ }
1202
+ },
1203
+ "path": "/v1/improve/settings"
1204
+ },
1205
+ {
1206
+ "audience": "sdk",
1207
+ "operations": {
1208
+ "post": {
1209
+ "request": "none",
1210
+ "response": "json"
1211
+ }
1212
+ },
1213
+ "path": "/v1/improve/review"
1214
+ },
1215
+ {
1216
+ "audience": "sdk",
1217
+ "operations": {
1218
+ "get": {
1219
+ "request": "none",
1220
+ "response": "json"
1221
+ },
1222
+ "patch": {
1223
+ "request": "json",
1224
+ "response": "json"
1225
+ }
1226
+ },
1227
+ "path": "/v1/improve/:id"
1228
+ },
1099
1229
  {
1100
1230
  "audience": "sdk",
1101
1231
  "operations": {
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 1,
3
+ "statuses": [
4
+ "open",
5
+ "closed"
6
+ ],
7
+ "max_page_size": 200,
8
+ "analysis_format": "markdown",
9
+ "source_policy": "Council content and provenance are immutable; workflow content is separate editable analysis.",
10
+ "hierarchy_policy": "Parents and descendants share a project. Closing closes all descendants atomically. Reopening opens ancestors. Project moves include descendants.",
11
+ "review_policy": "Automatic reviews require every touched record version and a still-current settings gate in the write transaction. They do not authorize code execution or remediation."
12
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "version": 1,
3
+ "filename_pattern": "^(PLAN|IMPLEMENTATION)-([a-z0-9]+(?:-[a-z0-9]+)*)\\.md$",
4
+ "statuses": [
5
+ "draft",
6
+ "in-review",
7
+ "ready",
8
+ "accepted",
9
+ "implementing",
10
+ "done"
11
+ ],
12
+ "actions": {
13
+ "revise": "Revise this document, resolve every human comment and attach the next version under the same filename. Do not implement or change project files.",
14
+ "approve": "I approve this specification and its implementation plan. Start implementation now. Check that this is the latest version, its status is ready or accepted, and no questions or comments remain before editing. If not, stop and explain what needs review. Otherwise start implementation of this exact reviewed scope, keep the versioned implementation record current and follow existing verification and permission rules."
15
+ }
16
+ }
@@ -679,7 +679,6 @@
679
679
  },
680
680
  "content": {
681
681
  "type": "array",
682
- "maxItems": 32,
683
682
  "items": {
684
683
  "oneOf": [
685
684
  {
@@ -690,8 +689,7 @@
690
689
  "const": "heading"
691
690
  },
692
691
  "text": {
693
- "type": "string",
694
- "maxLength": 16384
692
+ "type": "string"
695
693
  }
696
694
  },
697
695
  "required": [
@@ -707,8 +705,7 @@
707
705
  "const": "text"
708
706
  },
709
707
  "text": {
710
- "type": "string",
711
- "maxLength": 16384
708
+ "type": "string"
712
709
  }
713
710
  },
714
711
  "required": [
@@ -724,8 +721,7 @@
724
721
  "const": "markdown"
725
722
  },
726
723
  "text": {
727
- "type": "string",
728
- "maxLength": 16384
724
+ "type": "string"
729
725
  }
730
726
  },
731
727
  "required": [
@@ -741,8 +737,7 @@
741
737
  "const": "code"
742
738
  },
743
739
  "text": {
744
- "type": "string",
745
- "maxLength": 16384
740
+ "type": "string"
746
741
  },
747
742
  "language": {
748
743
  "type": "string",
@@ -762,8 +757,7 @@
762
757
  "const": "diff"
763
758
  },
764
759
  "text": {
765
- "type": "string",
766
- "maxLength": 16384
760
+ "type": "string"
767
761
  },
768
762
  "language": {
769
763
  "type": "string",
@@ -785,21 +779,16 @@
785
779
  "columns": {
786
780
  "type": "array",
787
781
  "minItems": 1,
788
- "maxItems": 16,
789
782
  "items": {
790
- "type": "string",
791
- "maxLength": 256
783
+ "type": "string"
792
784
  }
793
785
  },
794
786
  "rows": {
795
787
  "type": "array",
796
- "maxItems": 200,
797
788
  "items": {
798
789
  "type": "array",
799
- "maxItems": 16,
800
790
  "items": {
801
- "type": "string",
802
- "maxLength": 256
791
+ "type": "string"
803
792
  }
804
793
  }
805
794
  }
@@ -983,7 +972,6 @@
983
972
  },
984
973
  "sections": {
985
974
  "type": "array",
986
- "maxItems": 8,
987
975
  "items": {
988
976
  "$ref": "#/$defs/section"
989
977
  }