taskuary 0.3.2.2__tar.gz → 0.3.2.3__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 (211) hide show
  1. {taskuary-0.3.2.2/taskuary.egg-info → taskuary-0.3.2.3}/PKG-INFO +24 -2
  2. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/README.md +23 -1
  3. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/pyproject.toml +1 -1
  4. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/artifacts.py +64 -1
  5. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/cli.py +12 -0
  6. taskuary-0.3.2.3/taskuary/demo.py +480 -0
  7. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/ingest.py +9 -6
  8. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/llm.py +10 -0
  9. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/server.py +20 -1
  10. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/store.py +23 -24
  11. taskuary-0.3.2.2/taskuary/web/assets/GeneralWorkspace-Bt02JQzu.js → taskuary-0.3.2.3/taskuary/web/assets/GeneralWorkspace-HLQ4Jry6.js +1 -1
  12. taskuary-0.3.2.2/taskuary/web/assets/index-DGVnbkfG.js → taskuary-0.3.2.3/taskuary/web/assets/index-BjUFr2Di.js +580 -101
  13. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/index.html +1 -1
  14. {taskuary-0.3.2.2 → taskuary-0.3.2.3/taskuary.egg-info}/PKG-INFO +24 -2
  15. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/SOURCES.txt +4 -2
  16. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_core.py +13 -0
  17. taskuary-0.3.2.3/tests/test_demo.py +148 -0
  18. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_triage_dataset.py +10 -3
  19. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_verdict_paths.py +27 -25
  20. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/LICENSE +0 -0
  21. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/setup.cfg +0 -0
  22. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/__init__.py +0 -0
  23. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/agents.py +0 -0
  24. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/aisetup.py +0 -0
  25. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/assistant.py +0 -0
  26. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/aws.py +0 -0
  27. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/azure.py +0 -0
  28. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/blackboard.py +0 -0
  29. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/browserview.py +0 -0
  30. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/calendar.py +0 -0
  31. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/categories.py +0 -0
  32. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/channels.py +0 -0
  33. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/ci.py +0 -0
  34. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/climodels.py +0 -0
  35. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/clis.py +0 -0
  36. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/coder.py +0 -0
  37. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/compose.py +0 -0
  38. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/config.py +0 -0
  39. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/context.py +0 -0
  40. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/counsel.py +0 -0
  41. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/db.py +0 -0
  42. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/desktop.py +0 -0
  43. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/devtools.py +0 -0
  44. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/digest.py +0 -0
  45. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/docsync.py +0 -0
  46. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/evalset.py +0 -0
  47. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/general.py +0 -0
  48. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/github.py +0 -0
  49. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/handraise.py +0 -0
  50. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/histgen.py +0 -0
  51. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/hooks.py +0 -0
  52. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/imapmail.py +0 -0
  53. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/imessage.py +0 -0
  54. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/intacct.py +0 -0
  55. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/interview.py +0 -0
  56. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/knowledge.py +0 -0
  57. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/learn.py +0 -0
  58. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/learnedgraph.py +0 -0
  59. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/logs.py +0 -0
  60. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/mcp.py +0 -0
  61. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/messengers.py +0 -0
  62. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/msauth.py +0 -0
  63. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/mssql.py +0 -0
  64. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/outbound.py +0 -0
  65. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/phone.py +0 -0
  66. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/pm.py +0 -0
  67. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/policy.py +0 -0
  68. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/problems.py +0 -0
  69. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/promptmap.py +0 -0
  70. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/proof.py +0 -0
  71. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/proposals.py +0 -0
  72. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/rank.py +0 -0
  73. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/reports.py +0 -0
  74. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/research.py +0 -0
  75. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/reshape.py +0 -0
  76. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/responder.py +0 -0
  77. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/routing.py +0 -0
  78. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/scopes.py +0 -0
  79. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/semantic.py +0 -0
  80. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/senders.py +0 -0
  81. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/setup.py +0 -0
  82. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/sharepoint.py +0 -0
  83. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/sheets.py +0 -0
  84. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/coder.md +0 -0
  85. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/counsel.md +0 -0
  86. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/digest.md +0 -0
  87. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/learned.md +0 -0
  88. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/soul.md +0 -0
  89. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/style.md +0 -0
  90. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/templates/triage.md +0 -0
  91. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/terminal.py +0 -0
  92. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/testing.py +0 -0
  93. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/toil.py +0 -0
  94. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/triage.py +0 -0
  95. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/verdicts.py +0 -0
  96. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/voice.py +0 -0
  97. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/wabridge.py +0 -0
  98. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/waitroom.py +0 -0
  99. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/assets/GeneralWorkspace-D46ydeAJ.css +0 -0
  100. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/assets/index-6GBZ9nXN.css +0 -0
  101. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/favicon.ico +0 -0
  102. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/web/favicon.png +0 -0
  103. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/webguard.py +0 -0
  104. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/whatsapp/bridge.mjs +0 -0
  105. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/whatsapp/package.json +0 -0
  106. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/whoami.py +0 -0
  107. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary/witness.py +0 -0
  108. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/dependency_links.txt +0 -0
  109. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/entry_points.txt +0 -0
  110. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/requires.txt +0 -0
  111. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/taskuary.egg-info/top_level.txt +0 -0
  112. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_agent_environment.py +0 -0
  113. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_agent_source.py +0 -0
  114. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_agent_wall.py +0 -0
  115. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_aisetup.py +0 -0
  116. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_answers.py +0 -0
  117. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_api.py +0 -0
  118. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_assistant.py +0 -0
  119. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_async_triage.py +0 -0
  120. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_audit_chain.py +0 -0
  121. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_aws_region.py +0 -0
  122. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_blackboard.py +0 -0
  123. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_browser_session.py +0 -0
  124. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_browserview.py +0 -0
  125. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_calendar.py +0 -0
  126. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_calendar_today.py +0 -0
  127. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_categories.py +0 -0
  128. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_cc_triage.py +0 -0
  129. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_chat_queue.py +0 -0
  130. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_climodels.py +0 -0
  131. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_clis.py +0 -0
  132. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_cloud.py +0 -0
  133. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_cloud_sources.py +0 -0
  134. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_compose.py +0 -0
  135. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_compose_sources.py +0 -0
  136. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_config.py +0 -0
  137. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_context.py +0 -0
  138. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_counsel.py +0 -0
  139. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_cwlogs_paging.py +0 -0
  140. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_desktop.py +0 -0
  141. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_devtools.py +0 -0
  142. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_diff_review.py +0 -0
  143. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_digest_brief.py +0 -0
  144. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_docs_and_llm.py +0 -0
  145. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_docs_flow.py +0 -0
  146. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_duplicate_connectors.py +0 -0
  147. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_factory.py +0 -0
  148. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_feed_working.py +0 -0
  149. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_general.py +0 -0
  150. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_github_auto.py +0 -0
  151. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_handraise.py +0 -0
  152. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_harvest.py +0 -0
  153. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_histgen.py +0 -0
  154. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_imapmail.py +0 -0
  155. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_imessage.py +0 -0
  156. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_intacct.py +0 -0
  157. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_kind_dispatch.py +0 -0
  158. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_knowledge.py +0 -0
  159. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_learnedgraph.py +0 -0
  160. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_local_file.py +0 -0
  161. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_mail_folders.py +0 -0
  162. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_mark_read.py +0 -0
  163. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_mcp.py +0 -0
  164. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_messengers.py +0 -0
  165. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_msauth.py +0 -0
  166. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_mssql.py +0 -0
  167. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_noop_ending.py +0 -0
  168. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_not_coding.py +0 -0
  169. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_note_retrieval.py +0 -0
  170. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_outbound_reports.py +0 -0
  171. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_pm.py +0 -0
  172. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_poll_overlap.py +0 -0
  173. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_poll_sources.py +0 -0
  174. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_pr_comments.py +0 -0
  175. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_problems.py +0 -0
  176. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_promptmap_and_catalog.py +0 -0
  177. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_proof_ci_proposals.py +0 -0
  178. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_pypi_downloads.py +0 -0
  179. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_rank.py +0 -0
  180. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_reply_channels.py +0 -0
  181. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_reply_voice.py +0 -0
  182. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_report_alerts.py +0 -0
  183. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_report_triage.py +0 -0
  184. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_research.py +0 -0
  185. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_reviews.py +0 -0
  186. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_scopes.py +0 -0
  187. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_seeded_reports.py +0 -0
  188. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_semantic.py +0 -0
  189. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_send_targets.py +0 -0
  190. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_setup.py +0 -0
  191. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_sheets_sharepoint.py +0 -0
  192. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_someone_else_replied.py +0 -0
  193. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_soul_interview.py +0 -0
  194. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_store_app_cli.py +0 -0
  195. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_store_hotpaths.py +0 -0
  196. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_sync_clock.py +0 -0
  197. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_task_identity.py +0 -0
  198. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_terminal.py +0 -0
  199. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_toil.py +0 -0
  200. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_urgent_and_handoff.py +0 -0
  201. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_verdict_sticks.py +0 -0
  202. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_vision.py +0 -0
  203. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_voice.py +0 -0
  204. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_wabridge.py +0 -0
  205. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_waitroom.py +0 -0
  206. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_watermark.py +0 -0
  207. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_web_entrypoint.py +0 -0
  208. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_webguard.py +0 -0
  209. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_whatsapp_images.py +0 -0
  210. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_whoami.py +0 -0
  211. {taskuary-0.3.2.2 → taskuary-0.3.2.3}/tests/test_witness.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskuary
3
- Version: 0.3.2.2
3
+ Version: 0.3.2.3
4
4
  Summary: Automate your job - the local-first operating system for your work: AI triage in, coding agents out.
5
5
  License: MIT
6
6
  Project-URL: Homepage, https://github.com/ldbumble/taskuary
@@ -64,10 +64,19 @@ and replies wait for your approval. Nothing sends or ships without you.
64
64
 
65
65
  ![The Taskuary Studio: work arrives, triage decides what needs action, and agents take seats to work it.](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/hero.gif)
66
66
 
67
- Taskuary is early—currently **v0.3.2.2**—and moving fast. The funnel, review queue,
67
+ Taskuary is early—currently **v0.3.2.3**—and moving fast. The funnel, review queue,
68
68
  agent sessions, and reports pipeline are in daily use; breaking changes are still possible
69
69
  before 1.0.
70
70
 
71
+ <p align="center">
72
+ <a href="https://taskuary.com/demo/"><img
73
+ src="https://img.shields.io/badge/%E2%96%B6%20Try%20it%20now-no%20install%2C%20in%20your%20browser-2f4858?style=for-the-badge&labelColor=1f2a22"
74
+ alt="Try Taskuary now, in your browser"></a>
75
+ </p>
76
+
77
+ <p align="center"><sub>The real app over invented work — timeline, triage, a coding session mid-run,
78
+ reports with charts. Nothing to install and nothing connects to anything.</sub></p>
79
+
71
80
  ## One timeline for incoming work
72
81
 
73
82
  Outlook, Gmail, Teams, Slack, Telegram, WhatsApp, GitHub, Jira, alerts, and reports all
@@ -141,6 +150,19 @@ On first run, connect an AI provider or local Ollama model, add at least one inb
141
150
  channel, then choose the coding CLI that should receive tasks. The setup wizards test each
142
151
  connection before it goes live.
143
152
 
153
+ ## Try it without installing anything
154
+
155
+ ```bash
156
+ taskuary --demo # or: docker compose --profile demo up
157
+ ```
158
+
159
+ A full Taskuary over invented work — a morning's mail and chats already triaged with the
160
+ reasons attached, drafts waiting in Review, agents on the board with their transcripts
161
+ playing, the wall they leave each other notes on. The AI answers from a script and every door
162
+ to the outside world is shut at the API layer (`taskuary/demo.py`): nothing sends, no
163
+ connection can be made or edited, no tool runs, and no CLI starts. Nobody's real data is in
164
+ it — Dana Whitfield and Northwind Facilities are invented.
165
+
144
166
  ## Installs
145
167
 
146
168
  ![Daily installs of taskuary from PyPI, mirror traffic excluded](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/downloads.svg)
@@ -13,10 +13,19 @@ and replies wait for your approval. Nothing sends or ships without you.
13
13
 
14
14
  ![The Taskuary Studio: work arrives, triage decides what needs action, and agents take seats to work it.](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/hero.gif)
15
15
 
16
- Taskuary is early—currently **v0.3.2.2**—and moving fast. The funnel, review queue,
16
+ Taskuary is early—currently **v0.3.2.3**—and moving fast. The funnel, review queue,
17
17
  agent sessions, and reports pipeline are in daily use; breaking changes are still possible
18
18
  before 1.0.
19
19
 
20
+ <p align="center">
21
+ <a href="https://taskuary.com/demo/"><img
22
+ src="https://img.shields.io/badge/%E2%96%B6%20Try%20it%20now-no%20install%2C%20in%20your%20browser-2f4858?style=for-the-badge&labelColor=1f2a22"
23
+ alt="Try Taskuary now, in your browser"></a>
24
+ </p>
25
+
26
+ <p align="center"><sub>The real app over invented work — timeline, triage, a coding session mid-run,
27
+ reports with charts. Nothing to install and nothing connects to anything.</sub></p>
28
+
20
29
  ## One timeline for incoming work
21
30
 
22
31
  Outlook, Gmail, Teams, Slack, Telegram, WhatsApp, GitHub, Jira, alerts, and reports all
@@ -90,6 +99,19 @@ On first run, connect an AI provider or local Ollama model, add at least one inb
90
99
  channel, then choose the coding CLI that should receive tasks. The setup wizards test each
91
100
  connection before it goes live.
92
101
 
102
+ ## Try it without installing anything
103
+
104
+ ```bash
105
+ taskuary --demo # or: docker compose --profile demo up
106
+ ```
107
+
108
+ A full Taskuary over invented work — a morning's mail and chats already triaged with the
109
+ reasons attached, drafts waiting in Review, agents on the board with their transcripts
110
+ playing, the wall they leave each other notes on. The AI answers from a script and every door
111
+ to the outside world is shut at the API layer (`taskuary/demo.py`): nothing sends, no
112
+ connection can be made or edited, no tool runs, and no CLI starts. Nobody's real data is in
113
+ it — Dana Whitfield and Northwind Facilities are invented.
114
+
93
115
  ## Installs
94
116
 
95
117
  ![Daily installs of taskuary from PyPI, mirror traffic excluded](https://raw.githubusercontent.com/ldbumble/taskuary/master/docs/downloads.svg)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "taskuary"
7
- version = "0.3.2.2"
7
+ version = "0.3.2.3"
8
8
  description = "Automate your job - the local-first operating system for your work: AI triage in, coding agents out."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -9,7 +9,7 @@ Both writers are hand-rolled on the standard library on purpose: xlsx is a zip o
9
9
  XML parts, and a bar chart is a few dozen rects. Neither is worth a dependency that has to be
10
10
  frozen into the one-file exe.
11
11
  """
12
- import json, re, zipfile
12
+ import json, math, re, zipfile
13
13
  from datetime import datetime
14
14
  from xml.sax.saxutils import escape
15
15
 
@@ -145,6 +145,65 @@ def chart_columns(rows: list) -> tuple:
145
145
  return ((labels[0] if labels else None), (vals[0] if vals else None))
146
146
 
147
147
 
148
+ INK, GRID, MUTED, LINE = '#1f2430', '#e7e3da', '#8a94a6', '#4f46e5'
149
+
150
+ _DATE = re.compile(r'^\s*(\d{4}-\d{2}-\d{2}|\d{1,2}/\d{1,2}(/\d{2,4})?|\d{4}-\d{2}|[A-Z][a-z]{2} \d{1,2})')
151
+
152
+ def _dated(labels: list) -> bool:
153
+ """Is the label column a run of dates? A report over time is the one shape horizontal bars
154
+ get wrong - fourteen days of tickets became fourteen stacked bars, which reads as fourteen
155
+ unrelated things rather than one line going up."""
156
+ return len(labels) >= 5 and all(_DATE.match(str(l or '')) for l in labels)
157
+
158
+
159
+ def _ticks(top: float, n: int = 4) -> list:
160
+ """Round gridline values at or above the data, so the axis reads 0/50/100 and never 0/47/94."""
161
+ if top <= 0: return [0.0, 1.0]
162
+ step = 10.0 ** math.floor(math.log10(top / n))
163
+ for mult in (1, 2, 2.5, 5, 10):
164
+ if step * mult * n >= top: step *= mult; break
165
+ return [step * i for i in range(int(math.ceil(top / step)) + 1)]
166
+
167
+
168
+ def _line_svg(pts: list, title: str, val: str, lab: str) -> str:
169
+ """One measure over time: a 2px line, a light band under it, gridlines behind, and the last
170
+ value labelled where the eye already is. One series, so no legend - the title names it."""
171
+ W, H, L, R, T, B = 760, 260, 56, 74, 34, 34
172
+ ticks = _ticks(max(v for _l, v in pts))
173
+ top = ticks[-1] or 1.0
174
+ px = lambda i: L + (W - L - R) * (i / max(1, len(pts) - 1))
175
+ py = lambda v: H - B - (H - T - B) * (v / top)
176
+ pl = ' '.join(f'{px(i):.1f},{py(v):.1f}' for i, (_l, v) in enumerate(pts))
177
+ out = [f'<svg xmlns="http://www.w3.org/2000/svg" width="{W}" height="{H}" viewBox="0 0 {W} {H}" '
178
+ f'font-family="Segoe UI, Helvetica, Arial, sans-serif">',
179
+ f'<rect width="{W}" height="{H}" fill="#ffffff"/>',
180
+ f'<text x="{L - 40}" y="20" font-size="13" font-weight="700" fill="{INK}">{escape(title or val)}</text>',
181
+ f'<text x="{W - 12}" y="20" font-size="10" fill="{MUTED}" text-anchor="end">'
182
+ f'{escape(val)} by {escape(lab or "row")} · {len(pts)} points</text>']
183
+ for t in ticks:
184
+ y = py(t)
185
+ out += [f'<line x1="{L}" y1="{y:.1f}" x2="{W - R}" y2="{y:.1f}" stroke="{GRID}" stroke-width="1"/>',
186
+ f'<text x="{L - 8}" y="{y + 3.5:.1f}" font-size="10" fill="{MUTED}" text-anchor="end">'
187
+ f'{escape(f"{t:,.10g}")}</text>']
188
+ out.append(f'<polygon points="{L},{H - B} {pl} {W - R},{H - B}" fill="{LINE}" fill-opacity="0.08"/>')
189
+ out.append(f'<polyline points="{pl}" fill="none" stroke="{LINE}" stroke-width="2" '
190
+ f'stroke-linejoin="round" stroke-linecap="round"/>')
191
+ # every point is a target, but only the ends are named - a number on all fourteen is noise
192
+ for i, (_l, v) in enumerate(pts):
193
+ out.append(f'<circle cx="{px(i):.1f}" cy="{py(v):.1f}" r="{4 if i in (0, len(pts) - 1) else 2.4}" '
194
+ f'fill="{LINE}" stroke="#ffffff" stroke-width="1.5"/>')
195
+ lv = pts[-1][1]
196
+ out.append(f'<text x="{W - R + 8}" y="{py(lv) + 4:.1f}" font-size="11.5" font-weight="700" fill="{INK}">'
197
+ f'{escape(f"{lv:,.2f}".rstrip("0").rstrip("."))}</text>')
198
+ every = max(1, len(pts) // 7)
199
+ for i, (l, _v) in enumerate(pts):
200
+ if i % every and i != len(pts) - 1: continue
201
+ out.append(f'<text x="{px(i):.1f}" y="{H - B + 16}" font-size="10" fill="{MUTED}" '
202
+ f'text-anchor="middle">{escape(str(l)[-5:])}</text>')
203
+ out.append('</svg>')
204
+ return ''.join(out)
205
+
206
+
148
207
  # Taskuary's own indigo, and a chart that reads in both the panel and a screenshot of it.
149
208
  def to_svg_chart(rows: list, path, title: str = '', want_val: str = None, want_lab: str = None) -> str:
150
209
  """Horizontal bars: label, bar, value. Horizontal because report labels are names and dates,
@@ -159,6 +218,10 @@ def to_svg_chart(rows: list, path, title: str = '', want_val: str = None, want_l
159
218
  pts = [(str(r.get(lab, ''))[:42] if lab else f'#{i + 1}', _num(r.get(val)) or 0.0)
160
219
  for i, r in enumerate(rows)][:MAX_BARS]
161
220
  if not pts: return ''
221
+ if _dated([l for l, _v in pts]):
222
+ svg = _line_svg(pts, title or val, val, lab or 'row')
223
+ if path is not None: path.write_text(svg, encoding='utf-8')
224
+ return svg if path is None else f'{val} by {lab or "row"}'
162
225
  top = max(abs(v) for _l, v in pts) or 1.0
163
226
  W, LW, RH, PAD = 760, 210, 22, 18
164
227
  H = PAD * 2 + 26 + RH * len(pts)
@@ -46,6 +46,11 @@ def main():
46
46
  # THE WALL (blackboard.py). An agent working in a terminal has a shell and no API token, so
47
47
  # this is how it talks to the next agent: two flags, no arguments it has to be told - the
48
48
  # session puts its own name, task and checkout in the environment.
49
+ # try-it-out in one command: a throwaway home, a world of invented work, and every door
50
+ # to the outside nailed shut (demo.py). This is what /demo on the website runs.
51
+ ap.add_argument('--demo', action='store_true',
52
+ help='run a DEMO instance: invented data, a scripted AI, replayed coding '
53
+ 'sessions, and nothing that can reach a real system')
49
54
  ap.add_argument('--board', action='store_true',
50
55
  help='print the agent wall for this checkout - what the agents before you left here')
51
56
  ap.add_argument('--all', action='store_true',
@@ -56,6 +61,13 @@ def main():
56
61
  help='working | note | blocked | ready | done - "ready" is how the next agent '
57
62
  'learns the tree is safe to build on')
58
63
  args = ap.parse_args()
64
+ if args.demo:
65
+ import os, tempfile
66
+ from . import demo
67
+ os.environ[demo.FLAG] = '1'
68
+ # a throwaway home, so a demo can never be pointed at somebody's real database by accident
69
+ os.environ.setdefault('TASKUARY_HOME', tempfile.mkdtemp(prefix='taskuary-demo-'))
70
+ print(f'demo mode: invented data in {os.environ["TASKUARY_HOME"]}, nothing can reach a real system')
59
71
  if args.board or args.note:
60
72
  import os, sys
61
73
  from . import blackboard as bb