thinqos 3.3.0__tar.gz → 3.3.2__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 (137) hide show
  1. {thinqos-3.3.0 → thinqos-3.3.2}/CHANGELOG.md +14 -0
  2. {thinqos-3.3.0 → thinqos-3.3.2}/PKG-INFO +5 -4
  3. {thinqos-3.3.0 → thinqos-3.3.2}/README.md +4 -3
  4. {thinqos-3.3.0 → thinqos-3.3.2}/pyproject.toml +1 -1
  5. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/cli.py +12 -10
  6. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_7686_self_repair.py +6 -2
  7. {thinqos-3.3.0 → thinqos-3.3.2}/.gitignore +0 -0
  8. {thinqos-3.3.0 → thinqos-3.3.2}/scripts/sync_cognitive_contract.py +0 -0
  9. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/__init__.py +0 -0
  10. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/__main__.py +0 -0
  11. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/accountscope.py +0 -0
  12. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/adapters/__init__.py +0 -0
  13. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/adapters/claude_code.py +0 -0
  14. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/adapters/cline.py +0 -0
  15. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/adapters/cline_tasks.py +0 -0
  16. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/adapters/codex.py +0 -0
  17. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/adapters/grok_build.py +0 -0
  18. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/adapters/vscode_chat_store.py +0 -0
  19. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/adapters/vscode_copilot.py +0 -0
  20. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/attribution.py +0 -0
  21. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/capture_history_policy.py +0 -0
  22. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/client.py +0 -0
  23. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/cline_sweep.py +0 -0
  24. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/connections.py +0 -0
  25. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/denylist.py +0 -0
  26. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/discovery.py +0 -0
  27. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/filelock.py +0 -0
  28. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/hook.py +0 -0
  29. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/importer.py +0 -0
  30. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/incremental.py +0 -0
  31. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/install_marker.py +0 -0
  32. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/installs.py +0 -0
  33. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/logsetup.py +0 -0
  34. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/mcp_transport.py +0 -0
  35. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/primecache.py +0 -0
  36. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/process.py +0 -0
  37. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/questionrecall.py +0 -0
  38. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/recovery.py +0 -0
  39. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/scheduler.py +0 -0
  40. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/secretstore.py +0 -0
  41. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/selfupdate.py +0 -0
  42. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/server_revision.py +0 -0
  43. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/shim.py +0 -0
  44. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/state.py +0 -0
  45. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/taskstate.py +0 -0
  46. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/tls.py +0 -0
  47. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/tool_turns.py +0 -0
  48. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/vscode_chat_sweep.py +0 -0
  49. {thinqos-3.3.0 → thinqos-3.3.2}/src/thinqos_capture/writeredirect.py +0 -0
  50. {thinqos-3.3.0 → thinqos-3.3.2}/tests/conftest.py +0 -0
  51. {thinqos-3.3.0 → thinqos-3.3.2}/tests/fixtures/claude_code_session.jsonl +0 -0
  52. {thinqos-3.3.0 → thinqos-3.3.2}/tests/fixtures/codex_session.jsonl +0 -0
  53. {thinqos-3.3.0 → thinqos-3.3.2}/tests/fixtures/grok_build_summary.json +0 -0
  54. {thinqos-3.3.0 → thinqos-3.3.2}/tests/fixtures/grok_build_updates.jsonl +0 -0
  55. {thinqos-3.3.0 → thinqos-3.3.2}/tests/fixtures/tos_6776_recovery_failures.json +0 -0
  56. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_attribution.py +0 -0
  57. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_capture_completeness.py +0 -0
  58. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_capture_incremental.py +0 -0
  59. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_claude_code_adapter.py +0 -0
  60. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_cli_drain.py +0 -0
  61. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_cli_install_hook.py +0 -0
  62. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_cli_list_forget.py +0 -0
  63. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_cli_run.py +0 -0
  64. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_client_limits.py +0 -0
  65. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_client_version_header.py +0 -0
  66. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_cline_adapter.py +0 -0
  67. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_cline_mcp_registration.py +0 -0
  68. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_cline_sweep.py +0 -0
  69. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_cline_tasks.py +0 -0
  70. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_codex_adapter.py +0 -0
  71. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_codex_capture_staleness.py +0 -0
  72. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_codex_hook_runtime_contract.py +0 -0
  73. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_codex_hook_trust.py +0 -0
  74. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_codex_plugin_setup.py +0 -0
  75. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_codex_rollout_memory.py +0 -0
  76. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_doctor.py +0 -0
  77. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_doctor_queue.py +0 -0
  78. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_drain_partition_split.py +0 -0
  79. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_drain_poison.py +0 -0
  80. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_drain_timeout.py +0 -0
  81. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_env_key_remnant.py +0 -0
  82. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_grok_build_adapter.py +0 -0
  83. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_hook.py +0 -0
  84. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_hook_autodrain.py +0 -0
  85. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_hook_prime.py +0 -0
  86. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_hook_secret_resolution.py +0 -0
  87. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_hook_self_update.py +0 -0
  88. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_hook_stdin.py +0 -0
  89. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_hook_task_state.py +0 -0
  90. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_importer.py +0 -0
  91. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_incremental.py +0 -0
  92. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_install.py +0 -0
  93. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_installer_hardening.py +0 -0
  94. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_liveness.py +0 -0
  95. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_logsetup.py +0 -0
  96. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_mcp_transport.py +0 -0
  97. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_no_retired_tool_names.py +0 -0
  98. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_plugin_autoupdate.py +0 -0
  99. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_plugin_mode.py +0 -0
  100. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_prime_cache.py +0 -0
  101. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_process.py +0 -0
  102. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_queue_policy.py +0 -0
  103. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_scheduler.py +0 -0
  104. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_secretstore.py +0 -0
  105. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_selfupdate.py +0 -0
  106. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_shim.py +0 -0
  107. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_state.py +0 -0
  108. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_state_migration.py +0 -0
  109. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_taskstate.py +0 -0
  110. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tls_cloud_proxy.py +0 -0
  111. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_token_economy.py +0 -0
  112. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tool_turns.py +0 -0
  113. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_2840_completion.py +0 -0
  114. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_2840_repair_round1.py +0 -0
  115. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_2840_repair_round2.py +0 -0
  116. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_4483_account_scope.py +0 -0
  117. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_4485_capture_history_policy.py +0 -0
  118. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_4485_doctor_update_state.py +0 -0
  119. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_4485_prime_refresh_coalescing.py +0 -0
  120. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_4486_question_recall.py +0 -0
  121. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_4486_refresh_retry.py +0 -0
  122. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_4487_install_marker.py +0 -0
  123. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_5043_connections.py +0 -0
  124. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_5043_discovery.py +0 -0
  125. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_5043_install_precedence.py +0 -0
  126. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_5100_key_prompt_links.py +0 -0
  127. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_5102_selfheal.py +0 -0
  128. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_5226_installs_registry.py +0 -0
  129. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_5369_mcp_revision.py +0 -0
  130. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_6776_recovery.py +0 -0
  131. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_6807_plugin_install.py +0 -0
  132. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_tos_7410_prime_refusals.py +0 -0
  133. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_verify.py +0 -0
  134. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_vscode_chat_store.py +0 -0
  135. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_vscode_copilot_adapter.py +0 -0
  136. {thinqos-3.3.0 → thinqos-3.3.2}/tests/test_writeredirect.py +0 -0
  137. {thinqos-3.3.0 → thinqos-3.3.2}/uv.lock +0 -0
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.3.2](https://github.com/AI4Outcomes/thinqos/compare/tools/thinqos-v3.3.1...tools/thinqos-v3.3.2) (2026-10-09)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * release batch 7cf0e98c (TOS-7758) ([#8353](https://github.com/AI4Outcomes/thinqos/issues/8353)) ([e873088](https://github.com/AI4Outcomes/thinqos/commit/e873088f82cd1906f48ec80483d9bf181ca943e0))
9
+
10
+ ## [3.3.1](https://github.com/AI4Outcomes/thinqos/compare/tools/thinqos-v3.3.0...tools/thinqos-v3.3.1) (2026-10-09)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * own Mind introspection and CLI self-repair (TOS-7520, TOS-7686) ([#8334](https://github.com/AI4Outcomes/thinqos/issues/8334)) ([d32842f](https://github.com/AI4Outcomes/thinqos/commit/d32842fe3ca83371f351ccb97b56c0a46e382b70))
16
+
3
17
  ## [3.3.0](https://github.com/AI4Outcomes/thinqos/compare/tools/thinqos-v3.2.1...tools/thinqos-v3.3.0) (2026-10-08)
4
18
 
5
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: thinqos
3
- Version: 3.3.0
3
+ Version: 3.3.2
4
4
  Summary: Connect Claude Code, Codex, Grok Build, VS Code, and Cline to your thinqOS Mind.
5
5
  Project-URL: Homepage, https://thinqos.com
6
6
  Project-URL: Documentation, https://thinqos.com/mcp-memory-server
@@ -162,9 +162,10 @@ target; its app does not use this CLI registration path.
162
162
  `remember`), replay queue, server captures, installed binary, and
163
163
  auto-update status.
164
164
 
165
- - **Mint a key** at `<your-thinqos-install>/api-keys` (*Create* -> copy the
166
- `tq_...`) - `https://app.thinqos.com/api-keys` for the default hosted app, or
167
- your organization's own install if it uses a different one. Already
165
+ - **Mint a key** at `<your-thinqos-install>/api-keys` - `https://app.thinqos.com/api-keys`
166
+ for the default hosted app, or your organization's own install if it uses a
167
+ different one. Sign in if asked and the key page opens with the key-name
168
+ field ready: type a name, press *Create Key*, copy the `tq_...`. Already
168
169
  connected the thinqOS MCP server? Omit `--pat` and the key is read from that
169
170
  registration.
170
171
  - **Not on the default hosted app?** Pass `--base-url <your-install-url>` (or
@@ -142,9 +142,10 @@ target; its app does not use this CLI registration path.
142
142
  `remember`), replay queue, server captures, installed binary, and
143
143
  auto-update status.
144
144
 
145
- - **Mint a key** at `<your-thinqos-install>/api-keys` (*Create* -> copy the
146
- `tq_...`) - `https://app.thinqos.com/api-keys` for the default hosted app, or
147
- your organization's own install if it uses a different one. Already
145
+ - **Mint a key** at `<your-thinqos-install>/api-keys` - `https://app.thinqos.com/api-keys`
146
+ for the default hosted app, or your organization's own install if it uses a
147
+ different one. Sign in if asked and the key page opens with the key-name
148
+ field ready: type a name, press *Create Key*, copy the `tq_...`. Already
148
149
  connected the thinqOS MCP server? Omit `--pat` and the key is read from that
149
150
  registration.
150
151
  - **Not on the default hosted app?** Pass `--base-url <your-install-url>` (or
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "thinqos"
3
- version = "3.3.0"
3
+ version = "3.3.2"
4
4
  description = "Connect Claude Code, Codex, Grok Build, VS Code, and Cline to your thinqOS Mind."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -5533,11 +5533,12 @@ def _registration_missing(client: str) -> bool:
5533
5533
 
5534
5534
  _REGISTRATION_RESTORES_NAME = "registration_restores.json"
5535
5535
 
5536
- #: A registration this tool restored that is missing AGAIN inside this window
5537
- #: was removed on purpose (the editor's own "remove server", say). Restoring it
5538
- #: every ten minutes would be a fight with the user, so it is left alone and
5539
- #: doctor's own "tools are not registered" line carries the repair command.
5540
- _REGISTRATION_RESTORE_COOLDOWN_S: float = 7 * 24 * 60 * 60
5536
+ #: A throttle, not a verdict. Deliberate removal is already covered by the
5537
+ #: gates (``thinqos uninstall`` and ``clients disable`` take the client out of
5538
+ #: the managed set), so a registration that goes missing again is put back. The
5539
+ #: hour only stops a writer that keeps undoing the restore from being rewritten
5540
+ #: on every ten-minute sweep. Dan's call, 2026-10-09: a week was far too long.
5541
+ _REGISTRATION_RESTORE_COOLDOWN_S: float = 60 * 60
5541
5542
 
5542
5543
 
5543
5544
  def _load_registration_restores(state_root: Path) -> dict[str, float] | None:
@@ -5600,10 +5601,11 @@ def reconcile_client_registrations(state_root: Path, *, now: float | None = None
5600
5601
  whose settings file this tool does not create, the file itself), AND
5601
5602
  * the client's config provably has no ``thinqos`` key
5602
5603
  (``_registration_missing``), AND
5603
- * this tool has not already restored that client recently - a
5604
- registration that disappears again was removed deliberately. The record
5605
- of a restore is written BEFORE the restore, so a machine that cannot
5606
- keep that record restores nothing rather than restoring every sweep.
5604
+ * this tool has not already restored that client in the last hour, so a
5605
+ writer that keeps undoing the restore is not rewritten every sweep. The
5606
+ record of a restore is written BEFORE the restore, so a machine that
5607
+ cannot keep that record restores nothing rather than restoring every
5608
+ sweep.
5607
5609
 
5608
5610
  Returns ``{client: outcome}`` for the clients it restored or failed on - an
5609
5611
  empty dict on a healthy machine, which writes nothing. Never raises: a
@@ -5641,7 +5643,7 @@ def reconcile_client_registrations(state_root: Path, *, now: float | None = None
5641
5643
  if not _registration_missing(client):
5642
5644
  continue
5643
5645
  if moment - restores.get(client, 0.0) < _REGISTRATION_RESTORE_COOLDOWN_S:
5644
- logger.info("clients.reconcile_left_alone client=%s reason=removed_again", client)
5646
+ logger.info("clients.reconcile_throttled client=%s", client)
5645
5647
  continue
5646
5648
  if not _save_registration_restores(state_root, {**restores, client: moment}):
5647
5649
  continue
@@ -311,8 +311,12 @@ def test_claude_without_the_plugin_gets_its_registration_back(
311
311
  assert "thinqos" in json.loads(claude_json.read_text(encoding="utf-8"))["mcpServers"]
312
312
 
313
313
 
314
- def test_a_registration_removed_again_is_left_removed(state_root: Path, tmp_path: Path) -> None:
315
- """Restored once; the user removes it in the editor; we do not fight."""
314
+ def test_a_registration_removed_again_is_restored_after_the_hourly_throttle(
315
+ state_root: Path, tmp_path: Path
316
+ ) -> None:
317
+ """Restored once; it vanishes again; the next sweep inside the hour waits,
318
+ the first one after it puts it back. Not a week."""
319
+ assert cli._REGISTRATION_RESTORE_COOLDOWN_S == 3600
316
320
  _connect(state_root, clients={"vscode": True}, managed={"vscode"})
317
321
  mcp = _vscode_mcp(tmp_path)
318
322
  mcp.parent.mkdir(parents=True)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes