@1mancompany/onemancompany 0.7.9 → 0.7.19

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 (401) hide show
  1. package/bin/cli.js +39 -28
  2. package/company/assets/plugins/kanban/plugin.yaml +17 -0
  3. package/company/assets/plugins/kanban/render.js +41 -0
  4. package/company/assets/plugins/kanban/style.css +25 -0
  5. package/company/assets/plugins/kanban/transform.py +49 -0
  6. package/company/assets/plugins/timeline/plugin.yaml +17 -0
  7. package/company/assets/plugins/timeline/render.js +130 -0
  8. package/company/assets/plugins/timeline/style.css +58 -0
  9. package/company/assets/plugins/timeline/transform.py +35 -0
  10. package/company/assets/rooms/all_hands_room.yaml +7 -0
  11. package/company/assets/rooms/meeting_room_a.yaml +7 -0
  12. package/company/assets/rooms/project_room_1.yaml +7 -0
  13. package/company/assets/rooms/project_room_2.yaml +6 -0
  14. package/company/assets/rooms/project_room_3.yaml +6 -0
  15. package/company/assets/tools/README.md +205 -0
  16. package/company/assets/tools/background_removal/background_removal.py +158 -0
  17. package/company/assets/tools/background_removal/tool.yaml +9 -0
  18. package/company/assets/tools/gmail/gmail.py +372 -0
  19. package/company/assets/tools/gmail/mcp_server.py +294 -0
  20. package/company/assets/tools/gmail/templates/meeting_reminder.md +26 -0
  21. package/company/assets/tools/gmail/templates/weekly_report.md +31 -0
  22. package/company/assets/tools/gmail/tool.yaml +25 -0
  23. package/company/assets/tools/image_generation/image_generation.py +281 -0
  24. package/company/assets/tools/image_generation/tool.yaml +26 -0
  25. package/company/assets/tools/launch_template.sh +99 -0
  26. package/company/assets/tools/video_generation/tool.yaml +15 -0
  27. package/company/assets/tools/video_generation/video_generation.py +267 -0
  28. package/company/assets/tools/web_search/tool.yaml +12 -0
  29. package/company/assets/tools/web_search/web_search.py +90 -0
  30. package/company/company_culture.yaml +10 -0
  31. package/company/human_resource/avatars/angry_cactus.png +0 -0
  32. package/company/human_resource/avatars/ceo_boss.png +0 -0
  33. package/company/human_resource/avatars/chef_pig.png +0 -0
  34. package/company/human_resource/avatars/cool_penguin.png +0 -0
  35. package/company/human_resource/avatars/derpy_cat.png +0 -0
  36. package/company/human_resource/avatars/dizzy_ghost.png +0 -0
  37. package/company/human_resource/avatars/hazy_meerkat.png +0 -0
  38. package/company/human_resource/avatars/nerd_fox.png +0 -0
  39. package/company/human_resource/avatars/party_octopus.png +0 -0
  40. package/company/human_resource/avatars/shocked_robot.png +0 -0
  41. package/company/human_resource/avatars/sleepy_panda.png +0 -0
  42. package/company/human_resource/employees/00001/profile.yaml +25 -0
  43. package/company/human_resource/employees/00002/launch.sh +159 -0
  44. package/company/human_resource/employees/00002/manifest.json +88 -0
  45. package/company/human_resource/employees/00002/profile.yaml +26 -0
  46. package/company/human_resource/employees/00002/role_guide.md +28 -0
  47. package/company/human_resource/employees/00002/skills/hiring/SKILL.md +53 -0
  48. package/company/human_resource/employees/00002/skills/ontology/SKILL.md +226 -0
  49. package/company/human_resource/employees/00002/skills/ontology/references/queries.md +211 -0
  50. package/company/human_resource/employees/00002/skills/ontology/references/schema.md +322 -0
  51. package/company/human_resource/employees/00002/skills/ontology/scripts/ontology.py +374 -0
  52. package/company/human_resource/employees/00002/skills/people_management/SKILL.md +18 -0
  53. package/company/human_resource/employees/00002/skills/proactive-agent/SKILL.md +499 -0
  54. package/company/human_resource/employees/00002/skills/reviews/SKILL.md +50 -0
  55. package/company/human_resource/employees/00002/skills/self-improving-agent/README.md +136 -0
  56. package/company/human_resource/employees/00002/skills/self-improving-agent/SKILL.md +408 -0
  57. package/company/human_resource/employees/00002/skills/self-improving-agent/hooks/post-bash.sh +10 -0
  58. package/company/human_resource/employees/00002/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
  59. package/company/human_resource/employees/00002/skills/self-improving-agent/hooks/session-end.sh +4 -0
  60. package/company/human_resource/employees/00002/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
  61. package/company/human_resource/employees/00002/skills/self-improving-agent/references/appendix.md +131 -0
  62. package/company/human_resource/employees/00002/skills/self-improving-agent/templates/correction-template.md +11 -0
  63. package/company/human_resource/employees/00002/skills/self-improving-agent/templates/pattern-template.md +15 -0
  64. package/company/human_resource/employees/00002/skills/self-improving-agent/templates/validation-template.md +14 -0
  65. package/company/human_resource/employees/00002/skills/work-principles/SKILL.md +21 -0
  66. package/company/human_resource/employees/00002/work_principles.md +11 -0
  67. package/company/human_resource/employees/00003/guidance.yaml +16 -0
  68. package/company/human_resource/employees/00003/launch.sh +159 -0
  69. package/company/human_resource/employees/00003/manifest.json +69 -0
  70. package/company/human_resource/employees/00003/profile.yaml +26 -0
  71. package/company/human_resource/employees/00003/role_guide.md +38 -0
  72. package/company/human_resource/employees/00003/skills/ontology/SKILL.md +226 -0
  73. package/company/human_resource/employees/00003/skills/ontology/references/queries.md +211 -0
  74. package/company/human_resource/employees/00003/skills/ontology/references/schema.md +322 -0
  75. package/company/human_resource/employees/00003/skills/ontology/scripts/ontology.py +374 -0
  76. package/company/human_resource/employees/00003/skills/operations/SKILL.md +17 -0
  77. package/company/human_resource/employees/00003/skills/proactive-agent/SKILL.md +499 -0
  78. package/company/human_resource/employees/00003/skills/self-improving-agent/README.md +136 -0
  79. package/company/human_resource/employees/00003/skills/self-improving-agent/SKILL.md +408 -0
  80. package/company/human_resource/employees/00003/skills/self-improving-agent/hooks/post-bash.sh +10 -0
  81. package/company/human_resource/employees/00003/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
  82. package/company/human_resource/employees/00003/skills/self-improving-agent/hooks/session-end.sh +4 -0
  83. package/company/human_resource/employees/00003/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
  84. package/company/human_resource/employees/00003/skills/self-improving-agent/references/appendix.md +131 -0
  85. package/company/human_resource/employees/00003/skills/self-improving-agent/templates/correction-template.md +11 -0
  86. package/company/human_resource/employees/00003/skills/self-improving-agent/templates/pattern-template.md +15 -0
  87. package/company/human_resource/employees/00003/skills/self-improving-agent/templates/validation-template.md +14 -0
  88. package/company/human_resource/employees/00003/skills/strategy/SKILL.md +17 -0
  89. package/company/human_resource/employees/00003/skills/tool_management/SKILL.md +21 -0
  90. package/company/human_resource/employees/00003/skills/work-principles/SKILL.md +10 -0
  91. package/company/human_resource/employees/00003/work_principles.md +11 -0
  92. package/company/human_resource/employees/00004/launch.sh +159 -0
  93. package/company/human_resource/employees/00004/manifest.json +69 -0
  94. package/company/human_resource/employees/00004/profile.yaml +25 -0
  95. package/company/human_resource/employees/00004/role_guide.md +33 -0
  96. package/company/human_resource/employees/00004/skills/ontology/SKILL.md +226 -0
  97. package/company/human_resource/employees/00004/skills/ontology/references/queries.md +211 -0
  98. package/company/human_resource/employees/00004/skills/ontology/references/schema.md +322 -0
  99. package/company/human_resource/employees/00004/skills/ontology/scripts/ontology.py +374 -0
  100. package/company/human_resource/employees/00004/skills/proactive-agent/SKILL.md +499 -0
  101. package/company/human_resource/employees/00004/skills/project_management/SKILL.md +7 -0
  102. package/company/human_resource/employees/00004/skills/self-improving-agent/README.md +136 -0
  103. package/company/human_resource/employees/00004/skills/self-improving-agent/SKILL.md +408 -0
  104. package/company/human_resource/employees/00004/skills/self-improving-agent/hooks/post-bash.sh +10 -0
  105. package/company/human_resource/employees/00004/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
  106. package/company/human_resource/employees/00004/skills/self-improving-agent/hooks/session-end.sh +4 -0
  107. package/company/human_resource/employees/00004/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
  108. package/company/human_resource/employees/00004/skills/self-improving-agent/references/appendix.md +131 -0
  109. package/company/human_resource/employees/00004/skills/self-improving-agent/templates/correction-template.md +11 -0
  110. package/company/human_resource/employees/00004/skills/self-improving-agent/templates/pattern-template.md +15 -0
  111. package/company/human_resource/employees/00004/skills/self-improving-agent/templates/validation-template.md +14 -0
  112. package/company/human_resource/employees/00004/skills/task_analysis/SKILL.md +7 -0
  113. package/company/human_resource/employees/00004/skills/task_routing/SKILL.md +7 -0
  114. package/company/human_resource/employees/00004/skills/work-principles/SKILL.md +14 -0
  115. package/company/human_resource/employees/00004/work_principles.md +11 -0
  116. package/company/human_resource/employees/00005/launch.sh +159 -0
  117. package/company/human_resource/employees/00005/manifest.json +69 -0
  118. package/company/human_resource/employees/00005/profile.yaml +26 -0
  119. package/company/human_resource/employees/00005/role_guide.md +27 -0
  120. package/company/human_resource/employees/00005/skills/client_relations/SKILL.md +7 -0
  121. package/company/human_resource/employees/00005/skills/contract_review/SKILL.md +7 -0
  122. package/company/human_resource/employees/00005/skills/ontology/SKILL.md +226 -0
  123. package/company/human_resource/employees/00005/skills/ontology/references/queries.md +211 -0
  124. package/company/human_resource/employees/00005/skills/ontology/references/schema.md +322 -0
  125. package/company/human_resource/employees/00005/skills/ontology/scripts/ontology.py +374 -0
  126. package/company/human_resource/employees/00005/skills/proactive-agent/SKILL.md +499 -0
  127. package/company/human_resource/employees/00005/skills/sales_management/SKILL.md +7 -0
  128. package/company/human_resource/employees/00005/skills/self-improving-agent/README.md +136 -0
  129. package/company/human_resource/employees/00005/skills/self-improving-agent/SKILL.md +408 -0
  130. package/company/human_resource/employees/00005/skills/self-improving-agent/hooks/post-bash.sh +10 -0
  131. package/company/human_resource/employees/00005/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
  132. package/company/human_resource/employees/00005/skills/self-improving-agent/hooks/session-end.sh +4 -0
  133. package/company/human_resource/employees/00005/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
  134. package/company/human_resource/employees/00005/skills/self-improving-agent/references/appendix.md +131 -0
  135. package/company/human_resource/employees/00005/skills/self-improving-agent/templates/correction-template.md +11 -0
  136. package/company/human_resource/employees/00005/skills/self-improving-agent/templates/pattern-template.md +15 -0
  137. package/company/human_resource/employees/00005/skills/self-improving-agent/templates/validation-template.md +14 -0
  138. package/company/human_resource/employees/00005/skills/work-principles/SKILL.md +13 -0
  139. package/company/human_resource/employees/00005/work_principles.md +11 -0
  140. package/company/human_resource/employees/profile_template.yaml +52 -0
  141. package/company/human_resource/nicknames.txt +1000 -0
  142. package/company/human_resource/piggy.jpg +0 -0
  143. package/company/human_resource/sops/hr_operations_sop.md +42 -0
  144. package/company/human_resource/workflows/hiring_workflow.md +65 -0
  145. package/company/human_resource/workflows/offboarding_workflow.md +45 -0
  146. package/company/human_resource/workflows/onboarding_workflow.md +46 -0
  147. package/company/human_resource/workflows/project_intake_workflow.md +77 -0
  148. package/company/human_resource/workflows/project_retrospective_workflow.md +136 -0
  149. package/company/operations/sops/coo_delegation_sop.md +29 -0
  150. package/company/operations/sops/cso_sales_operations_sop.md +27 -0
  151. package/company/operations/sops/ea_dispatch_authority_sop.md +80 -0
  152. package/company/operations/sops/project_execution_sop.md +51 -0
  153. package/company/operations/sops/project_intake_sop.md +50 -0
  154. package/company/operations/sops/project_management_tracking.md +8 -0
  155. package/company/operations/sops/role_archetype_templates.md +34 -0
  156. package/company/operations/sops/self_verification_sop.md +18 -0
  157. package/company/operations/sops/task_dispatch_and_acceptance_sop.md +20 -0
  158. package/company/operations/sops/task_lifecycle_states.md +33 -0
  159. package/company/operations/sops/workflow_schema.md +66 -0
  160. package/company/sales/playbooks/external_comms/changelog.md +14 -0
  161. package/company/sales/playbooks/external_comms/external_comms_playbook.md +168 -0
  162. package/company/shared_prompts/Anti_Cloud_Acceptance_Training_v1.md +62 -0
  163. package/company/shared_prompts/Risk_Monitoring_and_Early_Warning_Guide.md +60 -0
  164. package/company/shared_prompts/code_engineering_standards.md +5 -0
  165. package/company/shared_prompts/efficiency.md +8 -0
  166. package/company/shared_prompts/frontend_code_engineering_standards.md +3 -0
  167. package/company/shared_prompts/model_downgrade_strategy.md +3 -0
  168. package/company/shared_prompts/oneonone_workspace_policy.md +6 -0
  169. package/company/shared_prompts/roblox_game_design.md.md +29 -0
  170. package/company/shared_prompts/task_flow_tracking_and_anomaly_monitoring.md +3 -0
  171. package/company/shared_prompts/tool_usage.md +39 -0
  172. package/company/shared_prompts/work_approach.md +29 -0
  173. package/config.yaml +19 -0
  174. package/frontend/app.js +9450 -0
  175. package/frontend/assets/office/tilesets/Modern tiles_Free/Interiors_free/32x32/Room_Builder_free_32x32.png +0 -0
  176. package/frontend/assets/office/tilesets/Modern_Office_Revamped_v1.2/1_Room_Builder_Office/Room_Builder_Office_32x32.png +0 -0
  177. package/frontend/assets/office/tilesets/Modern_Office_Revamped_v1.2/Modern_Office_32x32.png +0 -0
  178. package/frontend/assets/office/tilesets/generated/generated_overview.png +0 -0
  179. package/frontend/assets/office/tilesets/generated/generated_tiles_32x32.png +0 -0
  180. package/frontend/assets/office/tilesets/moderninteriors-win/1_Interiors/32x32/Interiors_32x32.png +0 -0
  181. package/frontend/assets/office/tilesets/moderninteriors-win/1_Interiors/32x32/Room_Builder_32x32.png +0 -0
  182. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_01.png +0 -0
  183. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_02.png +0 -0
  184. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_03.png +0 -0
  185. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_04.png +0 -0
  186. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_05.png +0 -0
  187. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_06.png +0 -0
  188. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_07.png +0 -0
  189. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_08.png +0 -0
  190. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_09.png +0 -0
  191. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_10.png +0 -0
  192. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_11.png +0 -0
  193. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_12.png +0 -0
  194. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_13.png +0 -0
  195. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_14.png +0 -0
  196. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_15.png +0 -0
  197. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_16.png +0 -0
  198. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_17.png +0 -0
  199. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_18.png +0 -0
  200. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_19.png +0 -0
  201. package/frontend/assets/office/tilesets/moderninteriors-win/2_Characters/Character_Generator/0_Premade_Characters/32x32/Premade_Character_32x32_20.png +0 -0
  202. package/frontend/ceo-terminal.js +324 -0
  203. package/frontend/conversation.js +219 -0
  204. package/frontend/floor-picker.html +745 -0
  205. package/frontend/index.html +748 -0
  206. package/frontend/office-camera.js +256 -0
  207. package/frontend/office-map.js +178 -0
  208. package/frontend/office-minimap.js +154 -0
  209. package/frontend/office-preview.html +467 -0
  210. package/frontend/office-tileatlas.js +309 -0
  211. package/frontend/office.js +1338 -0
  212. package/frontend/plugin-loader.js +99 -0
  213. package/frontend/resize-handler.js +160 -0
  214. package/frontend/screenshot.js +278 -0
  215. package/frontend/style.css +6256 -0
  216. package/frontend/task-tree-g6.js +924 -0
  217. package/frontend/trace-viewer.css +33 -0
  218. package/frontend/trace-viewer.js +97 -0
  219. package/frontend/types/events.d.ts +174 -0
  220. package/frontend/vendor/canvas2svg.js +394 -0
  221. package/frontend/xterm-log.js +322 -0
  222. package/package.json +9 -3
  223. package/pyproject.toml +74 -0
  224. package/src/onemancompany/__init__.py +0 -0
  225. package/src/onemancompany/agents/__init__.py +0 -0
  226. package/src/onemancompany/agents/base.py +1238 -0
  227. package/src/onemancompany/agents/common_tools.py +1933 -0
  228. package/src/onemancompany/agents/coo_agent.py +928 -0
  229. package/src/onemancompany/agents/cso_agent.py +273 -0
  230. package/src/onemancompany/agents/ea_agent.py +58 -0
  231. package/src/onemancompany/agents/hr_agent.py +450 -0
  232. package/src/onemancompany/agents/onboarding.py +1116 -0
  233. package/src/onemancompany/agents/product_tools.py +312 -0
  234. package/src/onemancompany/agents/product_workspace_tools.py +113 -0
  235. package/src/onemancompany/agents/prompt_builder.py +63 -0
  236. package/src/onemancompany/agents/recruitment.py +748 -0
  237. package/src/onemancompany/agents/termination.py +137 -0
  238. package/src/onemancompany/agents/tool_results.py +59 -0
  239. package/src/onemancompany/agents/tree_tools.py +833 -0
  240. package/src/onemancompany/api/__init__.py +0 -0
  241. package/src/onemancompany/api/routes.py +7401 -0
  242. package/src/onemancompany/api/websocket.py +65 -0
  243. package/src/onemancompany/core/__init__.py +0 -0
  244. package/src/onemancompany/core/agent_loop.py +45 -0
  245. package/src/onemancompany/core/announcements.py +65 -0
  246. package/src/onemancompany/core/async_utils.py +36 -0
  247. package/src/onemancompany/core/auth_apply/__init__.py +74 -0
  248. package/src/onemancompany/core/auth_apply/api_key.py +79 -0
  249. package/src/onemancompany/core/auth_choices.py +118 -0
  250. package/src/onemancompany/core/auth_verify.py +124 -0
  251. package/src/onemancompany/core/automation.py +579 -0
  252. package/src/onemancompany/core/background_tasks.py +377 -0
  253. package/src/onemancompany/core/ceo_executor.py +98 -0
  254. package/src/onemancompany/core/claude_session.py +900 -0
  255. package/src/onemancompany/core/config.py +1134 -0
  256. package/src/onemancompany/core/conversation.py +702 -0
  257. package/src/onemancompany/core/conversation_adapters.py +305 -0
  258. package/src/onemancompany/core/conversation_hooks.py +191 -0
  259. package/src/onemancompany/core/default_vessel.yaml +23 -0
  260. package/src/onemancompany/core/drift_detector.py +91 -0
  261. package/src/onemancompany/core/errors.py +145 -0
  262. package/src/onemancompany/core/event_models.py +161 -0
  263. package/src/onemancompany/core/events.py +70 -0
  264. package/src/onemancompany/core/file_editor.py +206 -0
  265. package/src/onemancompany/core/heartbeat.py +327 -0
  266. package/src/onemancompany/core/interval.py +30 -0
  267. package/src/onemancompany/core/journal.py +111 -0
  268. package/src/onemancompany/core/layout.py +426 -0
  269. package/src/onemancompany/core/llm_trace.py +220 -0
  270. package/src/onemancompany/core/llm_utils.py +56 -0
  271. package/src/onemancompany/core/meeting_minutes.py +82 -0
  272. package/src/onemancompany/core/model_costs.py +89 -0
  273. package/src/onemancompany/core/models.py +333 -0
  274. package/src/onemancompany/core/oauth.py +459 -0
  275. package/src/onemancompany/core/plugin_registry.py +139 -0
  276. package/src/onemancompany/core/product.py +808 -0
  277. package/src/onemancompany/core/product_triggers.py +620 -0
  278. package/src/onemancompany/core/product_workspace.py +248 -0
  279. package/src/onemancompany/core/project_archive.py +1006 -0
  280. package/src/onemancompany/core/resolutions.py +327 -0
  281. package/src/onemancompany/core/routine.py +2736 -0
  282. package/src/onemancompany/core/runtime_context.py +20 -0
  283. package/src/onemancompany/core/safe_execute.py +81 -0
  284. package/src/onemancompany/core/self_hosted.py +27 -0
  285. package/src/onemancompany/core/skill_hooks.py +540 -0
  286. package/src/onemancompany/core/snapshot.py +136 -0
  287. package/src/onemancompany/core/standalone_runner.py +312 -0
  288. package/src/onemancompany/core/state.py +381 -0
  289. package/src/onemancompany/core/store.py +772 -0
  290. package/src/onemancompany/core/subprocess_executor.py +153 -0
  291. package/src/onemancompany/core/sync_tick.py +46 -0
  292. package/src/onemancompany/core/system_cron.py +579 -0
  293. package/src/onemancompany/core/system_tasks.py +66 -0
  294. package/src/onemancompany/core/task_contract.py +41 -0
  295. package/src/onemancompany/core/task_lifecycle.py +200 -0
  296. package/src/onemancompany/core/task_persistence.py +188 -0
  297. package/src/onemancompany/core/task_tree.py +639 -0
  298. package/src/onemancompany/core/task_verification.py +228 -0
  299. package/src/onemancompany/core/tool_limits.py +69 -0
  300. package/src/onemancompany/core/tool_registry.py +382 -0
  301. package/src/onemancompany/core/tree_manager.py +148 -0
  302. package/src/onemancompany/core/update_checker.py +82 -0
  303. package/src/onemancompany/core/vessel.py +3820 -0
  304. package/src/onemancompany/core/vessel_config.py +217 -0
  305. package/src/onemancompany/core/vessel_harness.py +122 -0
  306. package/src/onemancompany/core/workflow_engine.py +347 -0
  307. package/src/onemancompany/default_skills/ontology/SKILL.md +227 -0
  308. package/src/onemancompany/default_skills/ontology/references/queries.md +211 -0
  309. package/src/onemancompany/default_skills/ontology/references/schema.md +322 -0
  310. package/src/onemancompany/default_skills/ontology/scripts/ontology.py +374 -0
  311. package/src/onemancompany/default_skills/proactive-agent/SKILL.md +500 -0
  312. package/src/onemancompany/default_skills/product-review/SKILL.md +39 -0
  313. package/src/onemancompany/default_skills/project-brainstorming/SKILL.md +133 -0
  314. package/src/onemancompany/default_skills/self-improving-agent/README.md +136 -0
  315. package/src/onemancompany/default_skills/self-improving-agent/SKILL.md +409 -0
  316. package/src/onemancompany/default_skills/self-improving-agent/hooks/post-bash.sh +10 -0
  317. package/src/onemancompany/default_skills/self-improving-agent/hooks/pre-tool.sh +10 -0
  318. package/src/onemancompany/default_skills/self-improving-agent/hooks/session-end.sh +4 -0
  319. package/src/onemancompany/default_skills/self-improving-agent/hooks/session-logger.sh +31 -0
  320. package/src/onemancompany/default_skills/self-improving-agent/memory/semantic-patterns.json +288 -0
  321. package/src/onemancompany/default_skills/self-improving-agent/references/appendix.md +131 -0
  322. package/src/onemancompany/default_skills/self-improving-agent/templates/correction-template.md +11 -0
  323. package/src/onemancompany/default_skills/self-improving-agent/templates/pattern-template.md +15 -0
  324. package/src/onemancompany/default_skills/self-improving-agent/templates/validation-template.md +14 -0
  325. package/src/onemancompany/default_skills/task_lifecycle/SKILL.md +35 -0
  326. package/src/onemancompany/main.py +723 -0
  327. package/src/onemancompany/onboard.py +1109 -0
  328. package/src/onemancompany/talent_market/AI_CODER_GUIDE.md +453 -0
  329. package/src/onemancompany/talent_market/README.md +763 -0
  330. package/src/onemancompany/talent_market/__init__.py +0 -0
  331. package/src/onemancompany/talent_market/default_skills/ontology/SKILL.md +226 -0
  332. package/src/onemancompany/talent_market/default_skills/ontology/references/queries.md +211 -0
  333. package/src/onemancompany/talent_market/default_skills/ontology/references/schema.md +322 -0
  334. package/src/onemancompany/talent_market/default_skills/ontology/scripts/ontology.py +374 -0
  335. package/src/onemancompany/talent_market/default_skills/proactive-agent/SKILL.md +499 -0
  336. package/src/onemancompany/talent_market/default_skills/self-improving-agent/README.md +136 -0
  337. package/src/onemancompany/talent_market/default_skills/self-improving-agent/SKILL.md +408 -0
  338. package/src/onemancompany/talent_market/default_skills/self-improving-agent/hooks/post-bash.sh +10 -0
  339. package/src/onemancompany/talent_market/default_skills/self-improving-agent/hooks/pre-tool.sh +10 -0
  340. package/src/onemancompany/talent_market/default_skills/self-improving-agent/hooks/session-end.sh +4 -0
  341. package/src/onemancompany/talent_market/default_skills/self-improving-agent/memory/semantic-patterns.json +288 -0
  342. package/src/onemancompany/talent_market/default_skills/self-improving-agent/references/appendix.md +131 -0
  343. package/src/onemancompany/talent_market/default_skills/self-improving-agent/templates/correction-template.md +11 -0
  344. package/src/onemancompany/talent_market/default_skills/self-improving-agent/templates/pattern-template.md +15 -0
  345. package/src/onemancompany/talent_market/default_skills/self-improving-agent/templates/validation-template.md +14 -0
  346. package/src/onemancompany/talent_market/remote_protocol.py +63 -0
  347. package/src/onemancompany/talent_market/remote_worker_base.py +166 -0
  348. package/src/onemancompany/talent_market/standalone_runner.py +276 -0
  349. package/src/onemancompany/talent_market/talent_spec.py +342 -0
  350. package/src/onemancompany/talent_market/talents/__init__.py +0 -0
  351. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/DESCRIPTION.md +27 -0
  352. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/avatar.svg +4 -0
  353. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/launch.sh +79 -0
  354. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/profile.yaml +28 -0
  355. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/ontology/SKILL.md +226 -0
  356. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/ontology/references/queries.md +211 -0
  357. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/ontology/references/schema.md +322 -0
  358. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/ontology/scripts/ontology.py +374 -0
  359. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/proactive-agent/SKILL.md +499 -0
  360. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/README.md +136 -0
  361. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/SKILL.md +408 -0
  362. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/hooks/post-bash.sh +10 -0
  363. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
  364. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/hooks/session-end.sh +4 -0
  365. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
  366. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/references/appendix.md +131 -0
  367. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/templates/correction-template.md +11 -0
  368. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/templates/pattern-template.md +15 -0
  369. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/skills/self-improving-agent/templates/validation-template.md +14 -0
  370. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/tools/.mcp.json +11 -0
  371. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/tools/bash-executor/TOOL.md +15 -0
  372. package/src/onemancompany/talent_market/talents/general-assistant/general-assistant/tools/filesystem/TOOL.md +15 -0
  373. package/src/onemancompany/talent_market/talents/general-assistant/launch.sh +79 -0
  374. package/src/onemancompany/talent_market/talents/general-assistant/profile.yaml +27 -0
  375. package/src/onemancompany/talent_market/talents/general-assistant/skills/ontology/SKILL.md +226 -0
  376. package/src/onemancompany/talent_market/talents/general-assistant/skills/ontology/references/queries.md +211 -0
  377. package/src/onemancompany/talent_market/talents/general-assistant/skills/ontology/references/schema.md +322 -0
  378. package/src/onemancompany/talent_market/talents/general-assistant/skills/ontology/scripts/ontology.py +374 -0
  379. package/src/onemancompany/talent_market/talents/general-assistant/skills/proactive-agent/SKILL.md +499 -0
  380. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/README.md +136 -0
  381. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/SKILL.md +408 -0
  382. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/hooks/post-bash.sh +10 -0
  383. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/hooks/pre-tool.sh +10 -0
  384. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/hooks/session-end.sh +4 -0
  385. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/memory/semantic-patterns.json +288 -0
  386. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/references/appendix.md +131 -0
  387. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/templates/correction-template.md +11 -0
  388. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/templates/pattern-template.md +15 -0
  389. package/src/onemancompany/talent_market/talents/general-assistant/skills/self-improving-agent/templates/validation-template.md +14 -0
  390. package/src/onemancompany/talent_market/talents/general-assistant/tools/manifest.yaml +12 -0
  391. package/src/onemancompany/talent_market/talents/openclaw/launch.sh +159 -0
  392. package/src/onemancompany/talent_market/talents/openclaw/manifest.json +45 -0
  393. package/src/onemancompany/talent_market/talents/openclaw/profile.yaml +30 -0
  394. package/src/onemancompany/talent_market/talents/openclaw/skills/multi-channel-comms/SKILL.md +34 -0
  395. package/src/onemancompany/tools/__init__.py +3 -0
  396. package/src/onemancompany/tools/mcp/__init__.py +1 -0
  397. package/src/onemancompany/tools/mcp/config_builder.py +94 -0
  398. package/src/onemancompany/tools/mcp/server.py +168 -0
  399. package/src/onemancompany/tools/sandbox/__init__.py +392 -0
  400. package/src/utils/trace_visualizer.py +718 -0
  401. package/uv.lock +2206 -0
package/bin/cli.js CHANGED
@@ -289,11 +289,15 @@ ${green("What gets installed automatically:")}
289
289
  let cliVersion = "unknown";
290
290
  try {
291
291
  const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf-8"));
292
- if (pkg.version) cliVersion = pkg.version;
293
- } catch {}
294
-
295
- // ── Check git ─────────────────────────────────────────────────────────
296
- if (!commandExists("git")) {
292
+ if (pkg.version && /^\d+\.\d+\.\d+$/.test(pkg.version)) cliVersion = pkg.version;
293
+ } catch { warn("Failed to read package version"); }
294
+
295
+ // ── Check prerequisites ────────────────────────────────────────────────
296
+ // Git is only needed if bundled source is missing (fallback clone path)
297
+ const npmPkgRoot = path.join(__dirname, "..");
298
+ const sourceIsBundled = fs.existsSync(path.join(npmPkgRoot, "pyproject.toml"))
299
+ && fs.existsSync(path.join(npmPkgRoot, "src"));
300
+ if (!sourceIsBundled && !commandExists("git")) {
297
301
  fail(
298
302
  "Git is required but not found.\n" +
299
303
  (isWindows
@@ -320,39 +324,46 @@ ${green("What gets installed automatically:")}
320
324
  }
321
325
  }
322
326
 
323
- // ── Clone or update ───────────────────────────────────────────────────
327
+ // ── Install or update ──────────────────────────────────────────────────
328
+ // The npm package bundles the full source. Copy it to installDir.
329
+ // Only fall back to git clone if source is missing (shouldn't happen).
330
+ const SOURCE_ITEMS = ["src", "frontend", "company", "pyproject.toml", "config.yaml", "uv.lock"];
324
331
  const wantUpdate = passthrough.includes("--update");
325
- if (fs.existsSync(path.join(installDir, ".git"))) {
326
- if (wantUpdate) {
327
- info(`Updating existing installation at ${installDir}`);
328
- try {
329
- run("git pull --ff-only", { cwd: installDir });
330
- } catch {
331
- warn("git pull failed continuing with current version");
332
+
333
+ function copyItems(items, destRoot) {
334
+ for (const item of items) {
335
+ const src = path.join(npmPkgRoot, item);
336
+ const dest = path.join(destRoot, item);
337
+ if (fs.existsSync(src)) {
338
+ if (fs.existsSync(dest)) fs.rmSync(dest, { recursive: true, force: true });
339
+ fs.cpSync(src, dest, { recursive: true });
332
340
  }
341
+ }
342
+ }
343
+
344
+ if (fs.existsSync(installDir)) {
345
+ if (wantUpdate && sourceIsBundled) {
346
+ info(`Updating installation to v${cliVersion}...`);
347
+ copyItems(SOURCE_ITEMS, installDir);
348
+ } else if (wantUpdate && !sourceIsBundled) {
349
+ warn("Update requested but bundled source not found — cannot update");
333
350
  } else {
334
351
  info(`Using existing installation at ${installDir}`);
335
352
  }
336
- } else if (fs.existsSync(installDir)) {
337
- info(`Directory ${installDir} exists (not a git repo) — using as-is`);
353
+ } else if (sourceIsBundled) {
354
+ info(`Installing OneManCompany v${cliVersion} into ${installDir}...`);
355
+ fs.mkdirSync(installDir, { recursive: true });
356
+ copyItems(SOURCE_ITEMS, installDir);
338
357
  } else {
358
+ // Fallback: no bundled source (broken package?) — clone from git
339
359
  info(`Cloning OneManCompany into ${installDir}...`);
340
- // Skip LFS files (demo videos etc.) — not needed for running the app
341
360
  const cloneEnv = { ...process.env, GIT_LFS_SKIP_SMUDGE: "1" };
342
361
  run(`git clone --depth 1 ${REPO_URL} "${installDir}"`, { env: cloneEnv });
343
362
  }
344
363
 
345
- // ── Read actual version from repo (may differ from npm package) ──────
346
- let appVersion = cliVersion;
347
- try {
348
- const pyproject = fs.readFileSync(path.join(installDir, "pyproject.toml"), "utf-8");
349
- const verMatch = pyproject.match(/^version\s*=\s*"([^"]+)"/m);
350
- if (verMatch) appVersion = verMatch[1];
351
- } catch {}
352
-
353
364
  // ── Banner (after real version is known) ───────────────────────────
354
365
  console.log();
355
- const verTag = `v${appVersion}`;
366
+ const verTag = `v${cliVersion}`;
356
367
  const title = `OneManCompany — AI Company OS ${verTag}`;
357
368
  const pad = Math.max(0, 44 - title.length);
358
369
  console.log(cyan("╔═══════════════════════════════════════════════╗"));
@@ -531,7 +542,7 @@ ${green("What gets installed automatically:")}
531
542
 
532
543
  if (debugMode) {
533
544
  // ── Foreground mode: show logs, Ctrl+C to kill ──────────────────
534
- info(`Starting OneManCompany v${appVersion} in debug mode (Ctrl+C to stop)...\n`);
545
+ info(`Starting OneManCompany v${cliVersion} in debug mode (Ctrl+C to stop)...\n`);
535
546
  const child = spawn(pythonBin, ["-m", "onemancompany.main", ...launchArgs], {
536
547
  cwd: installDir,
537
548
  stdio: "inherit",
@@ -547,7 +558,7 @@ ${green("What gets installed automatically:")}
547
558
  process.on("SIGTERM", () => { child.kill("SIGTERM"); });
548
559
  } else {
549
560
  // ── Background mode: detach and exit CLI ────────────────────────
550
- info(`Starting OneManCompany v${appVersion} in background...`);
561
+ info(`Starting OneManCompany v${cliVersion} in background...`);
551
562
  const logFile = path.join(installDir, ".onemancompany", "server.log");
552
563
  // Ensure log directory exists
553
564
  const logDir = path.dirname(logFile);
@@ -570,7 +581,7 @@ ${green("What gets installed automatically:")}
570
581
  await new Promise((r) => setTimeout(r, 5000));
571
582
  if (isProcessRunning(child.pid)) {
572
583
  console.log();
573
- console.log(green(` ✓ OneManCompany v${appVersion} is running!`));
584
+ console.log(green(` ✓ OneManCompany v${cliVersion} is running!`));
574
585
  console.log();
575
586
  console.log(` ${cyan("→")} Open ${cyan("http://localhost:8000")} in your browser`);
576
587
  console.log(` ${dim(" Logs:")} ${logFile}`);
@@ -0,0 +1,17 @@
1
+ id: kanban
2
+ name: "Kanban"
3
+ version: "1.0.0"
4
+ description: "Kanban board view"
5
+ author: "OneManCompany"
6
+ builtin: true
7
+ view_type: project_tab
8
+ order: 10
9
+ icon: "📋"
10
+ backend:
11
+ module: transform
12
+ function: transform
13
+ frontend:
14
+ script: render.js
15
+ style: style.css
16
+ render_function: renderKanban
17
+ data_requires: [dispatches, employees]
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Kanban board plugin — render function
3
+ */
4
+ function renderKanban(container, data, ctx) {
5
+ const escHtml = ctx.escHtml;
6
+ const columns = data.columns || {};
7
+ const phases = data.phases || [];
8
+
9
+ // Phase summary
10
+ let phaseHtml = '';
11
+ if (phases.length > 0) {
12
+ phaseHtml = '<div style="margin-bottom:4px;font-size:5px;color:var(--text-dim);">';
13
+ for (const p of phases) {
14
+ const pctDone = p.total > 0 ? Math.round((p.completed / p.total) * 100) : 0;
15
+ phaseHtml += `<span style="margin-right:6px;">P${p.phase}: ${p.completed}/${p.total} (${pctDone}%)</span>`;
16
+ }
17
+ phaseHtml += '</div>';
18
+ }
19
+
20
+ const statusLabels = { pending: 'Pending', in_progress: 'In Progress', completed: 'Completed' };
21
+ let boardHtml = '<div class="kanban-board">';
22
+ for (const status of ['pending', 'in_progress', 'completed']) {
23
+ const cards = columns[status] || [];
24
+ boardHtml += `<div class="kanban-column">`;
25
+ boardHtml += `<div class="kanban-column-title">${statusLabels[status]} (${cards.length})</div>`;
26
+ if (cards.length === 0) {
27
+ boardHtml += `<div style="font-size:4px;color:var(--text-dim);text-align:center;padding:4px;">-</div>`;
28
+ }
29
+ for (const card of cards) {
30
+ boardHtml += `<div class="kanban-card" data-phase="${card.phase}">`;
31
+ boardHtml += `<div class="card-employee">${escHtml(card.employee_name)}</div>`;
32
+ boardHtml += `<div class="card-desc">${escHtml(card.description)}</div>`;
33
+ boardHtml += `<span class="card-phase">P${card.phase}</span>`;
34
+ boardHtml += `</div>`;
35
+ }
36
+ boardHtml += `</div>`;
37
+ }
38
+ boardHtml += '</div>';
39
+
40
+ container.innerHTML = phaseHtml + boardHtml;
41
+ }
@@ -0,0 +1,25 @@
1
+ /* Kanban Board Plugin */
2
+ .kanban-board { display: flex; gap: 6px; min-height: 100px; }
3
+ .kanban-column { flex: 1; background: var(--bg-panel); padding: 6px; border-radius: 3px; }
4
+ .kanban-column-title {
5
+ font-size: 8px; color: var(--text-dim);
6
+ text-align: center; margin-bottom: 6px;
7
+ padding-bottom: 4px; border-bottom: 1px solid var(--border);
8
+ }
9
+ .kanban-card {
10
+ background: var(--bg-dark);
11
+ padding: 4px 5px; margin-bottom: 4px;
12
+ border-radius: 2px; font-size: 7px;
13
+ border-left: 3px solid var(--pixel-cyan);
14
+ }
15
+ .kanban-card .card-employee { color: var(--pixel-cyan); font-weight: bold; }
16
+ .kanban-card .card-desc { color: var(--pixel-white); margin-top: 2px; }
17
+ .kanban-card .card-phase {
18
+ display: inline-block; background: var(--pixel-cyan);
19
+ color: var(--bg-dark); padding: 1px 3px;
20
+ font-size: 6px; border-radius: 2px; margin-top: 2px;
21
+ }
22
+ .kanban-card[data-phase="1"] { border-left-color: #00ddff; }
23
+ .kanban-card[data-phase="2"] { border-left-color: #ffdd00; }
24
+ .kanban-card[data-phase="3"] { border-left-color: #ff4455; }
25
+ .kanban-card[data-phase="4"] { border-left-color: #51cf66; }
@@ -0,0 +1,49 @@
1
+ """Kanban board data transformer."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ def transform(dispatches: list[dict], context: dict) -> dict:
7
+ """Transform dispatches into kanban board columns + phase summary.
8
+
9
+ Returns:
10
+ {"columns": {status: [cards]}, "phases": [{phase, total, completed}]}
11
+ """
12
+ employees = context.get("employees", {})
13
+
14
+ # Group by status
15
+ columns: dict[str, list[dict]] = {"pending": [], "in_progress": [], "completed": []}
16
+ for d in dispatches:
17
+ status = d.get("status", "in_progress")
18
+ emp_id = d.get("employee_id", "")
19
+ emp = employees.get(emp_id, {})
20
+ emp_name = emp.get("nickname") or emp.get("name") or emp_id
21
+
22
+ card = {
23
+ "dispatch_id": d.get("dispatch_id", ""),
24
+ "employee_id": emp_id,
25
+ "employee_name": emp_name,
26
+ "description": d.get("description", "")[:100],
27
+ "phase": d.get("phase", 1),
28
+ "dispatched_at": d.get("dispatched_at"),
29
+ "completed_at": d.get("completed_at"),
30
+ }
31
+ if status in columns:
32
+ columns[status].append(card)
33
+ else:
34
+ columns.setdefault(status, []).append(card)
35
+
36
+ # Phase summary
37
+ phases: dict[int, dict] = {}
38
+ for d in dispatches:
39
+ p = d.get("phase", 1)
40
+ if p not in phases:
41
+ phases[p] = {"total": 0, "completed": 0}
42
+ phases[p]["total"] += 1
43
+ if d.get("status") == "completed":
44
+ phases[p]["completed"] += 1
45
+
46
+ return {
47
+ "columns": columns,
48
+ "phases": [{"phase": p, **v} for p, v in sorted(phases.items())],
49
+ }
@@ -0,0 +1,17 @@
1
+ id: timeline
2
+ name: "Timeline"
3
+ version: "1.0.0"
4
+ description: "Timeline view"
5
+ author: "OneManCompany"
6
+ builtin: true
7
+ view_type: project_tab
8
+ order: 20
9
+ icon: "⏱"
10
+ backend:
11
+ module: transform
12
+ function: transform
13
+ frontend:
14
+ script: render.js
15
+ style: style.css
16
+ render_function: renderTimeline
17
+ data_requires: [dispatches, employees]
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Timeline view plugin — render function
3
+ * Enhanced: task type coloring, status indication, dependency arrows, estimated duration
4
+ */
5
+ function renderTimeline(container, data, ctx) {
6
+ const escHtml = ctx.escHtml;
7
+ const timeline = data.timeline || [];
8
+
9
+ if (timeline.length === 0) {
10
+ container.innerHTML = '<div style="color:var(--text-dim);font-size:6px;padding:8px;">No dispatches with timing data yet</div>';
11
+ return;
12
+ }
13
+
14
+ // Task type color map
15
+ const typeColors = {
16
+ execution: '#00ddff',
17
+ acceptance: '#ffdd00',
18
+ ea_review: '#ff9900',
19
+ rectification: '#ff4455',
20
+ hiring: '#51cf66',
21
+ };
22
+
23
+ const typeLabels = {
24
+ execution: 'Exec',
25
+ acceptance: 'Accept',
26
+ ea_review: 'EA',
27
+ rectification: 'Fix',
28
+ hiring: 'Hire',
29
+ };
30
+
31
+ // Calculate time range
32
+ const starts = timeline.map(t => new Date(t.start).getTime());
33
+ const ends = timeline.map(t => t.end ? new Date(t.end).getTime() : Date.now());
34
+ const minTime = Math.min(...starts);
35
+ const maxTime = Math.max(...ends);
36
+ const range = maxTime - minTime || 1;
37
+
38
+ // Build a dispatch_id -> index map for dependency arrows
39
+ const idxMap = {};
40
+ timeline.forEach((t, i) => { if (t.dispatch_id) idxMap[t.dispatch_id] = i; });
41
+
42
+ let html = '<div class="timeline-view" style="position:relative;">';
43
+
44
+ // SVG overlay for dependency arrows
45
+ const rowHeight = 22; // must match CSS .timeline-row height + margin
46
+ const svgHeight = timeline.length * rowHeight;
47
+ html += `<svg class="timeline-dep-arrows" style="position:absolute;top:0;left:60px;right:35px;height:${svgHeight}px;pointer-events:none;overflow:visible;">`;
48
+
49
+ // Collect arrow data
50
+ const arrows = [];
51
+ timeline.forEach((t, i) => {
52
+ const deps = t.depends_on || [];
53
+ for (const depId of deps) {
54
+ if (depId in idxMap) {
55
+ arrows.push({ from: idxMap[depId], to: i });
56
+ }
57
+ }
58
+ });
59
+
60
+ for (const arrow of arrows) {
61
+ const fromT = timeline[arrow.from];
62
+ const toT = timeline[arrow.to];
63
+ const fromEndMs = fromT.end ? new Date(fromT.end).getTime() : Date.now();
64
+ const toStartMs = new Date(toT.start).getTime();
65
+ const x1Pct = ((fromEndMs - minTime) / range) * 100;
66
+ const x2Pct = ((toStartMs - minTime) / range) * 100;
67
+ const y1 = arrow.from * rowHeight + rowHeight / 2;
68
+ const y2 = arrow.to * rowHeight + rowHeight / 2;
69
+ html += `<line x1="${x1Pct}%" y1="${y1}" x2="${x2Pct}%" y2="${y2}" class="dep-arrow-line"/>`;
70
+ // Arrowhead
71
+ html += `<circle cx="${x2Pct}%" cy="${y2}" r="2" class="dep-arrow-head"/>`;
72
+ }
73
+ html += '</svg>';
74
+
75
+ for (const t of timeline) {
76
+ const startMs = new Date(t.start).getTime();
77
+ const endMs = t.end ? new Date(t.end).getTime() : Date.now();
78
+ const left = ((startMs - minTime) / range) * 100;
79
+ const width = Math.max(((endMs - startMs) / range) * 100, 2);
80
+ const durationMin = Math.round((endMs - startMs) / 60000);
81
+ const durationStr = durationMin < 60 ? `${durationMin}m` : `${Math.round(durationMin / 60)}h`;
82
+
83
+ const taskType = t.task_type || 'execution';
84
+ const color = typeColors[taskType] || '#00ddff';
85
+ const status = t.status || (t.end ? 'completed' : 'in_progress');
86
+
87
+ // Status CSS class
88
+ let statusClass = '';
89
+ if (status === 'in_progress') statusClass = ' timeline-bar--running';
90
+ else if (status === 'pending') statusClass = ' timeline-bar--pending';
91
+
92
+ // Build bar tooltip
93
+ const typeLabel = typeLabels[taskType] || taskType;
94
+ const tooltip = `[${typeLabel}] ${t.description}`;
95
+
96
+ html += `<div class="timeline-row">`;
97
+ html += `<div class="timeline-label" title="${escHtml(t.employee_name)}">${escHtml(t.employee_name)}</div>`;
98
+ html += `<div class="timeline-bar-container">`;
99
+
100
+ // Estimated duration bar (ghost/comparison)
101
+ if (t.estimated_duration_min && t.estimated_duration_min > 0) {
102
+ const estMs = t.estimated_duration_min * 60000;
103
+ const estWidth = Math.max(((estMs) / range) * 100, 2);
104
+ html += `<div class="timeline-bar timeline-bar--estimated" style="left:${left.toFixed(1)}%;width:${estWidth.toFixed(1)}%;background:${color};" title="Estimated: ${t.estimated_duration_min}min"></div>`;
105
+ }
106
+
107
+ // Actual bar
108
+ html += `<div class="timeline-bar${statusClass}" data-type="${taskType}" style="left:${left.toFixed(1)}%;width:${width.toFixed(1)}%;background:${color};" title="${escHtml(tooltip)}"></div>`;
109
+ html += `</div>`;
110
+
111
+ const statusText = status === 'in_progress' ? 'running' : (t.end ? durationStr : 'pending');
112
+ html += `<div class="timeline-duration">${statusText}</div>`;
113
+ html += `</div>`;
114
+ }
115
+ html += '</div>';
116
+
117
+ // Task type legend
118
+ const usedTypes = [...new Set(timeline.map(t => t.task_type || 'execution'))];
119
+ if (usedTypes.length > 0) {
120
+ html += '<div style="font-size:4px;color:var(--text-dim);margin-top:4px;">';
121
+ for (const tt of usedTypes) {
122
+ const c = typeColors[tt] || '#888';
123
+ const label = typeLabels[tt] || tt;
124
+ html += `<span style="margin-right:6px;"><span style="display:inline-block;width:6px;height:4px;background:${c};margin-right:2px;vertical-align:middle;"></span>${label}</span>`;
125
+ }
126
+ html += '</div>';
127
+ }
128
+
129
+ container.innerHTML = html;
130
+ }
@@ -0,0 +1,58 @@
1
+ /* Timeline View Plugin */
2
+ .timeline-view { padding: 6px; position: relative; }
3
+ .timeline-row { display: flex; align-items: center; margin-bottom: 4px; font-size: 8px; height: 18px; }
4
+ .timeline-label { width: 60px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
5
+ .timeline-bar-container { flex: 1; height: 14px; background: var(--bg-panel); position: relative; border-radius: 2px; }
6
+ .timeline-bar {
7
+ position: absolute; height: 100%; border-radius: 2px;
8
+ min-width: 3px;
9
+ }
10
+ .timeline-duration { width: 35px; text-align: right; color: var(--text-dim); font-size: 7px; }
11
+
12
+ /* Task type colors (via data-type attribute) */
13
+ .timeline-bar[data-type="execution"] { background: #00ddff; }
14
+ .timeline-bar[data-type="acceptance"] { background: #ffdd00; }
15
+ .timeline-bar[data-type="ea_review"] { background: #ff9900; }
16
+ .timeline-bar[data-type="rectification"] { background: #ff4455; }
17
+ .timeline-bar[data-type="hiring"] { background: #51cf66; }
18
+
19
+ /* Legacy phase colors (fallback) */
20
+ .timeline-bar[data-phase="1"] { background: #00ddff; }
21
+ .timeline-bar[data-phase="2"] { background: #ffdd00; }
22
+ .timeline-bar[data-phase="3"] { background: #ff4455; }
23
+ .timeline-bar[data-phase="4"] { background: #51cf66; }
24
+
25
+ /* Status: running — pulsing animation */
26
+ .timeline-bar--running {
27
+ animation: timeline-pulse 1.5s ease-in-out infinite;
28
+ }
29
+ @keyframes timeline-pulse {
30
+ 0%, 100% { opacity: 1; }
31
+ 50% { opacity: 0.5; }
32
+ }
33
+
34
+ /* Status: pending — dashed outline, no fill */
35
+ .timeline-bar--pending {
36
+ background: transparent !important;
37
+ border: 1px dashed currentColor;
38
+ opacity: 0.5;
39
+ }
40
+
41
+ /* Estimated duration ghost bar */
42
+ .timeline-bar--estimated {
43
+ opacity: 0.15;
44
+ z-index: 0;
45
+ pointer-events: none;
46
+ }
47
+
48
+ /* Dependency arrows (SVG) */
49
+ .dep-arrow-line {
50
+ stroke: var(--text-dim, #666);
51
+ stroke-width: 1;
52
+ stroke-dasharray: 3 2;
53
+ opacity: 0.6;
54
+ }
55
+ .dep-arrow-head {
56
+ fill: var(--text-dim, #666);
57
+ opacity: 0.6;
58
+ }
@@ -0,0 +1,35 @@
1
+ """Timeline view data transformer."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ def transform(dispatches: list[dict], context: dict) -> dict:
7
+ """Transform dispatches into timeline data.
8
+
9
+ Returns:
10
+ {"timeline": [{dispatch_id, employee_name, description, phase, start, end}]}
11
+ """
12
+ employees = context.get("employees", {})
13
+
14
+ timeline = []
15
+ for d in dispatches:
16
+ if d.get("dispatched_at"):
17
+ emp_id = d.get("employee_id", "")
18
+ emp = employees.get(emp_id, {})
19
+ emp_name = emp.get("nickname") or emp.get("name") or emp_id
20
+ timeline.append({
21
+ "dispatch_id": d.get("dispatch_id", ""),
22
+ "employee_id": emp_id,
23
+ "employee_name": emp_name,
24
+ "description": d.get("description", "")[:60],
25
+ "phase": d.get("phase", 1),
26
+ "start": d.get("dispatched_at"),
27
+ "end": d.get("completed_at"),
28
+ "task_type": d.get("task_type", "execution"),
29
+ "status": d.get("status", "completed"),
30
+ "depends_on": d.get("depends_on", []),
31
+ "estimated_duration_min": d.get("estimated_duration_min", 0),
32
+ "scheduled_start": d.get("scheduled_start"),
33
+ })
34
+
35
+ return {"timeline": timeline}
@@ -0,0 +1,7 @@
1
+ # Large Meeting Hall — dedicated for CEO all-hands meetings
2
+ name: "All-Hands Hall"
3
+ type: "meeting_room"
4
+ description: "A large meeting hall that seats 100 people, equipped with a big screen and sound system. Used for CEO company-wide announcements and guidance; all attendees must absorb and summarize the meeting takeaways afterward. Cannot be used for project or department meetings."
5
+ capacity: 100
6
+ position: [5, 10]
7
+ sprite: "meeting_room"
@@ -0,0 +1,7 @@
1
+ # Meeting Room A — default meeting room setup
2
+ name: "Meeting Room A"
3
+ type: "meeting_room"
4
+ description: "A standard meeting room seating 6 people, equipped with a projector and whiteboard."
5
+ capacity: 6
6
+ position: [1, 8]
7
+ sprite: "meeting_room"
@@ -0,0 +1,7 @@
1
+ # Project Meeting Room 1 — dedicated for project wrap-up meetings
2
+ name: "Project Meeting Room 1"
3
+ type: "meeting_room"
4
+ description: "A project meeting room seating 30 people, used for project wrap-up meetings and retrospectives."
5
+ capacity: 30
6
+ position: [10, 10]
7
+ sprite: "meeting_room"
@@ -0,0 +1,6 @@
1
+ id: project_room_2
2
+ name: Project Meeting Room 2
3
+ capacity: 30
4
+ description: A project meeting room seating 30 people, used for project wrap-up meetings and retrospectives.
5
+ type: room
6
+ status: inactive
@@ -0,0 +1,6 @@
1
+ id: project_room_3
2
+ name: Project Meeting Room 3
3
+ capacity: 30
4
+ description: A project meeting room seating 30 people, used for project wrap-up meetings and retrospectives.
5
+ type: room
6
+ status: inactive