agents-city 0.3.0-beta.21

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 (440) hide show
  1. package/.claude-plugin/marketplace.json +16 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.es.md +2021 -0
  5. package/README.md +1999 -0
  6. package/benchmarks/committee/README.md +39 -0
  7. package/benchmarks/committee/metrics.py +51 -0
  8. package/benchmarks/committee/run.py +64 -0
  9. package/benchmarks/committee/traces/01-single.json +8 -0
  10. package/benchmarks/committee/traces/02-mesh.json +16 -0
  11. package/benchmarks/committee/traces/03-chair.json +15 -0
  12. package/benchmarks/latency/README.md +35 -0
  13. package/benchmarks/latency/fake-claude-cli.mjs +119 -0
  14. package/benchmarks/latency/fake-native-server.mjs +340 -0
  15. package/benchmarks/latency/fake-tui.py +91 -0
  16. package/benchmarks/latency/live.py +380 -0
  17. package/benchmarks/stress/README.md +20 -0
  18. package/benchmarks/stress/run.py +487 -0
  19. package/bin/agents +4 -0
  20. package/bin/agents-city.js +116 -0
  21. package/bin/benchmark +17 -0
  22. package/bin/bus +6 -0
  23. package/bin/cities +3 -0
  24. package/bin/city +86 -0
  25. package/bin/committee +6 -0
  26. package/bin/demo +200 -0
  27. package/bin/exit +5 -0
  28. package/bin/hall +73 -0
  29. package/bin/hall.html +426 -0
  30. package/bin/logs +3 -0
  31. package/bin/report.py +14 -0
  32. package/bin/reset +3 -0
  33. package/bin/road +3 -0
  34. package/bin/seat +10 -0
  35. package/bin/serve.py +1428 -0
  36. package/bin/setup.py +753 -0
  37. package/bin/skills +3 -0
  38. package/bin/test +131 -0
  39. package/bin/test-adapter.py +183 -0
  40. package/bin/test-admision.py +99 -0
  41. package/bin/test-avatar.py +58 -0
  42. package/bin/test-benchmark.py +40 -0
  43. package/bin/test-broker.py +334 -0
  44. package/bin/test-cage.py +206 -0
  45. package/bin/test-card.py +402 -0
  46. package/bin/test-channel.py +379 -0
  47. package/bin/test-cities.py +453 -0
  48. package/bin/test-claude-runtime.py +252 -0
  49. package/bin/test-committee.py +340 -0
  50. package/bin/test-contracts.py +544 -0
  51. package/bin/test-crecimiento.py +164 -0
  52. package/bin/test-demo.py +308 -0
  53. package/bin/test-doctor.py +106 -0
  54. package/bin/test-domains.py +151 -0
  55. package/bin/test-evidencia.py +50 -0
  56. package/bin/test-exit.py +128 -0
  57. package/bin/test-hall-protocol.py +93 -0
  58. package/bin/test-launch.py +169 -0
  59. package/bin/test-live-feed.py +508 -0
  60. package/bin/test-pairing.py +99 -0
  61. package/bin/test-parcels.py +283 -0
  62. package/bin/test-runtime-failures.py +252 -0
  63. package/bin/test-runtime-ui.py +488 -0
  64. package/bin/test-runtime.py +268 -0
  65. package/bin/test-rutas.py +80 -0
  66. package/bin/test-seat.py +1386 -0
  67. package/bin/test-security.py +150 -0
  68. package/bin/test-serve.py +1057 -0
  69. package/bin/test-stress.py +64 -0
  70. package/bin/test-widgets.py +143 -0
  71. package/bin/test-workspace.py +188 -0
  72. package/bin/testlib.py +95 -0
  73. package/bin/tokens.py +14 -0
  74. package/bus/scripts/deploy.sh +60 -0
  75. package/bus/scripts/mint-token.sh +68 -0
  76. package/bus/scripts/setup-dev.sh +79 -0
  77. package/bus/scripts/test-channel.ts +8 -0
  78. package/bus/scripts/test-hub.ts +266 -0
  79. package/bus/scripts/test-local.sh +40 -0
  80. package/bus/scripts/test-queue.ts +132 -0
  81. package/bus/worker/package-lock.json +1971 -0
  82. package/bus/worker/package.json +17 -0
  83. package/bus/worker/src/index.ts +485 -0
  84. package/bus/worker/tsconfig.json +13 -0
  85. package/bus/worker/wrangler.toml +32 -0
  86. package/city/oven/README.md +59 -0
  87. package/city/oven/collect.py +43 -0
  88. package/city/oven/oven.html +4 -0
  89. package/city/scripts/history.py +120 -0
  90. package/city/scripts/seed.py +442 -0
  91. package/city/web/assets/modelos/License.txt +28 -0
  92. package/city/web/assets/modelos/PROCEDENCIA.txt +3 -0
  93. package/city/web/assets/modelos/building-a.glb +0 -0
  94. package/city/web/assets/modelos/building-b.glb +0 -0
  95. package/city/web/assets/modelos/building-c.glb +0 -0
  96. package/city/web/assets/modelos/building-d.glb +0 -0
  97. package/city/web/assets/modelos/building-e.glb +0 -0
  98. package/city/web/assets/modelos/building-f.glb +0 -0
  99. package/city/web/assets/modelos/building-g.glb +0 -0
  100. package/city/web/assets/modelos/building-h.glb +0 -0
  101. package/city/web/assets/sprites/building-a.png +0 -0
  102. package/city/web/assets/sprites/building-b.png +0 -0
  103. package/city/web/assets/sprites/building-c.png +0 -0
  104. package/city/web/assets/sprites/building-d.png +0 -0
  105. package/city/web/assets/sprites/building-e.png +0 -0
  106. package/city/web/assets/sprites/building-f.png +0 -0
  107. package/city/web/assets/sprites/building-g.png +0 -0
  108. package/city/web/assets/sprites/building-h.png +0 -0
  109. package/city/web/assets/sprites/building-i.png +0 -0
  110. package/city/web/assets/sprites/building-j.png +0 -0
  111. package/city/web/assets/sprites/building-k.png +0 -0
  112. package/city/web/assets/sprites/building-l.png +0 -0
  113. package/city/web/assets/sprites/building-m.png +0 -0
  114. package/city/web/assets/sprites/building-n.png +0 -0
  115. package/city/web/assets/sprites/building-skyscraper-a.png +0 -0
  116. package/city/web/assets/sprites/building-skyscraper-b.png +0 -0
  117. package/city/web/assets/sprites/building-skyscraper-c.png +0 -0
  118. package/city/web/assets/sprites/building-skyscraper-d.png +0 -0
  119. package/city/web/assets/sprites/building-skyscraper-e.png +0 -0
  120. package/city/web/assets/sprites/catalogo.json +47 -0
  121. package/city/web/assets/sprites/detail-awning-wide.png +0 -0
  122. package/city/web/assets/sprites/detail-awning.png +0 -0
  123. package/city/web/assets/sprites/detail-overhang-wide.png +0 -0
  124. package/city/web/assets/sprites/detail-overhang.png +0 -0
  125. package/city/web/assets/sprites/detail-parasol-a.png +0 -0
  126. package/city/web/assets/sprites/detail-parasol-b.png +0 -0
  127. package/city/web/assets/sprites/low-detail-building-a.png +0 -0
  128. package/city/web/assets/sprites/low-detail-building-b.png +0 -0
  129. package/city/web/assets/sprites/low-detail-building-c.png +0 -0
  130. package/city/web/assets/sprites/low-detail-building-d.png +0 -0
  131. package/city/web/assets/sprites/low-detail-building-e.png +0 -0
  132. package/city/web/assets/sprites/low-detail-building-f.png +0 -0
  133. package/city/web/assets/sprites/low-detail-building-g.png +0 -0
  134. package/city/web/assets/sprites/low-detail-building-h.png +0 -0
  135. package/city/web/assets/sprites/low-detail-building-i.png +0 -0
  136. package/city/web/assets/sprites/low-detail-building-j.png +0 -0
  137. package/city/web/assets/sprites/low-detail-building-k.png +0 -0
  138. package/city/web/assets/sprites/low-detail-building-l.png +0 -0
  139. package/city/web/assets/sprites/low-detail-building-m.png +0 -0
  140. package/city/web/assets/sprites/low-detail-building-n.png +0 -0
  141. package/city/web/assets/sprites/low-detail-building-wide-a.png +0 -0
  142. package/city/web/assets/sprites/low-detail-building-wide-b.png +0 -0
  143. package/city/web/assets/sprites/medidas.json +248 -0
  144. package/city/web/dist/city.js +939 -0
  145. package/city/web/dist/index.html +294 -0
  146. package/city/web/dist/modelos/License.txt +28 -0
  147. package/city/web/dist/modelos/PROCEDENCIA.txt +3 -0
  148. package/city/web/dist/modelos/building-a.glb +0 -0
  149. package/city/web/dist/modelos/building-b.glb +0 -0
  150. package/city/web/dist/modelos/building-c.glb +0 -0
  151. package/city/web/dist/modelos/building-d.glb +0 -0
  152. package/city/web/dist/modelos/building-e.glb +0 -0
  153. package/city/web/dist/modelos/building-f.glb +0 -0
  154. package/city/web/dist/modelos/building-g.glb +0 -0
  155. package/city/web/dist/modelos/building-h.glb +0 -0
  156. package/city/web/dist/sprites/building-a.png +0 -0
  157. package/city/web/dist/sprites/building-b.png +0 -0
  158. package/city/web/dist/sprites/building-c.png +0 -0
  159. package/city/web/dist/sprites/building-d.png +0 -0
  160. package/city/web/dist/sprites/building-e.png +0 -0
  161. package/city/web/dist/sprites/building-f.png +0 -0
  162. package/city/web/dist/sprites/building-g.png +0 -0
  163. package/city/web/dist/sprites/building-h.png +0 -0
  164. package/city/web/dist/sprites/building-i.png +0 -0
  165. package/city/web/dist/sprites/building-j.png +0 -0
  166. package/city/web/dist/sprites/building-k.png +0 -0
  167. package/city/web/dist/sprites/building-l.png +0 -0
  168. package/city/web/dist/sprites/building-m.png +0 -0
  169. package/city/web/dist/sprites/building-n.png +0 -0
  170. package/city/web/dist/sprites/building-skyscraper-a.png +0 -0
  171. package/city/web/dist/sprites/building-skyscraper-b.png +0 -0
  172. package/city/web/dist/sprites/building-skyscraper-c.png +0 -0
  173. package/city/web/dist/sprites/building-skyscraper-d.png +0 -0
  174. package/city/web/dist/sprites/building-skyscraper-e.png +0 -0
  175. package/city/web/dist/sprites/catalogo.json +47 -0
  176. package/city/web/dist/sprites/detail-awning-wide.png +0 -0
  177. package/city/web/dist/sprites/detail-awning.png +0 -0
  178. package/city/web/dist/sprites/detail-overhang-wide.png +0 -0
  179. package/city/web/dist/sprites/detail-overhang.png +0 -0
  180. package/city/web/dist/sprites/detail-parasol-a.png +0 -0
  181. package/city/web/dist/sprites/detail-parasol-b.png +0 -0
  182. package/city/web/dist/sprites/low-detail-building-a.png +0 -0
  183. package/city/web/dist/sprites/low-detail-building-b.png +0 -0
  184. package/city/web/dist/sprites/low-detail-building-c.png +0 -0
  185. package/city/web/dist/sprites/low-detail-building-d.png +0 -0
  186. package/city/web/dist/sprites/low-detail-building-e.png +0 -0
  187. package/city/web/dist/sprites/low-detail-building-f.png +0 -0
  188. package/city/web/dist/sprites/low-detail-building-g.png +0 -0
  189. package/city/web/dist/sprites/low-detail-building-h.png +0 -0
  190. package/city/web/dist/sprites/low-detail-building-i.png +0 -0
  191. package/city/web/dist/sprites/low-detail-building-j.png +0 -0
  192. package/city/web/dist/sprites/low-detail-building-k.png +0 -0
  193. package/city/web/dist/sprites/low-detail-building-l.png +0 -0
  194. package/city/web/dist/sprites/low-detail-building-m.png +0 -0
  195. package/city/web/dist/sprites/low-detail-building-n.png +0 -0
  196. package/city/web/dist/sprites/low-detail-building-wide-a.png +0 -0
  197. package/city/web/dist/sprites/low-detail-building-wide-b.png +0 -0
  198. package/city/web/dist/sprites/medidas.json +248 -0
  199. package/city/web/dist-hall/hall.js +264 -0
  200. package/city/web/index.html +294 -0
  201. package/city/web/package.json +18 -0
  202. package/city/web/sella.py +21 -0
  203. package/city/web/src/activity-actors.ts +47 -0
  204. package/city/web/src/activity.ts +172 -0
  205. package/city/web/src/ayuntamiento.ts +580 -0
  206. package/city/web/src/draw.ts +640 -0
  207. package/city/web/src/game-speech.ts +79 -0
  208. package/city/web/src/hall.ts +1867 -0
  209. package/city/web/src/main.ts +2225 -0
  210. package/city/web/src/oven.ts +124 -0
  211. package/city/web/src/people.ts +244 -0
  212. package/city/web/src/presencia.ts +193 -0
  213. package/city/web/src/puertas.ts +180 -0
  214. package/city/web/src/repo-roles.ts +59 -0
  215. package/city/worker/package.json +16 -0
  216. package/city/worker/schema.sql +117 -0
  217. package/city/worker/src/index.ts +702 -0
  218. package/city/worker/src/square.ts +218 -0
  219. package/city/worker/wrangler.toml +58 -0
  220. package/demo/ada.md +50 -0
  221. package/demo/bruno.md +62 -0
  222. package/demo/camila.md +56 -0
  223. package/demo/city/ada.md +40 -0
  224. package/demo/city/city.yml +8 -0
  225. package/demo/city/parcels.yml +15 -0
  226. package/demo/city/roads.json +4 -0
  227. package/demo/city/units.yml +10 -0
  228. package/demo/clinica/city.yml +8 -0
  229. package/demo/clinica/parcels.yml +15 -0
  230. package/demo/clinica/roads.json +4 -0
  231. package/demo/clinica/units.yml +9 -0
  232. package/demo/clinica/vera.md +46 -0
  233. package/demo/dante.md +54 -0
  234. package/demo/despacho/city.yml +8 -0
  235. package/demo/despacho/marta.md +46 -0
  236. package/demo/despacho/parcels.yml +15 -0
  237. package/demo/despacho/roads.json +4 -0
  238. package/demo/despacho/units.yml +9 -0
  239. package/demo/elsa.md +50 -0
  240. package/demo/farid.md +52 -0
  241. package/demo/greta.md +50 -0
  242. package/demo/hugo.md +49 -0
  243. package/demo/iris.md +49 -0
  244. package/demo/jonas.md +51 -0
  245. package/demo/kira.md +51 -0
  246. package/demo/luca.md +49 -0
  247. package/demo/parcels.yml +92 -0
  248. package/demo/seed.py +20 -0
  249. package/demo/show.py +161 -0
  250. package/demo/stories.py +824 -0
  251. package/demo/units.yml +33 -0
  252. package/docs/agents-first.md +99 -0
  253. package/docs/glossary.md +55 -0
  254. package/docs/map-live-layers.md +73 -0
  255. package/docs/security.md +231 -0
  256. package/docs/self-host.md +151 -0
  257. package/docs/testing.md +205 -0
  258. package/package.json +73 -0
  259. package/plugin/.claude-plugin/plugin.json +62 -0
  260. package/plugin/.mcp.json +15 -0
  261. package/plugin/channel/activity-cli.ts +16 -0
  262. package/plugin/channel/adapter-prompts.ts +113 -0
  263. package/plugin/channel/adapter.js +4292 -0
  264. package/plugin/channel/adapter.ts +133 -0
  265. package/plugin/channel/bus.js +20188 -0
  266. package/plugin/channel/bus.ts +131 -0
  267. package/plugin/channel/city-config.ts +125 -0
  268. package/plugin/channel/claude-channel.ts +58 -0
  269. package/plugin/channel/cli-args.ts +75 -0
  270. package/plugin/channel/client.js +4200 -0
  271. package/plugin/channel/client.ts +38 -0
  272. package/plugin/channel/committee/activity.ts +256 -0
  273. package/plugin/channel/committee/collection.ts +154 -0
  274. package/plugin/channel/committee/decision.ts +175 -0
  275. package/plugin/channel/committee/floor.ts +135 -0
  276. package/plugin/channel/committee/guards.ts +30 -0
  277. package/plugin/channel/committee/history.ts +38 -0
  278. package/plugin/channel/committee/render.ts +102 -0
  279. package/plugin/channel/committee/service.ts +72 -0
  280. package/plugin/channel/committee/storage.ts +92 -0
  281. package/plugin/channel/committee/types.ts +163 -0
  282. package/plugin/channel/committee/view.ts +63 -0
  283. package/plugin/channel/committee-cli.ts +109 -0
  284. package/plugin/channel/delivery-metrics.ts +61 -0
  285. package/plugin/channel/delivery-queue.ts +118 -0
  286. package/plugin/channel/hub/activity-controller.ts +72 -0
  287. package/plugin/channel/hub/activity-feed.ts +169 -0
  288. package/plugin/channel/hub/committee-controller.ts +60 -0
  289. package/plugin/channel/hub/connections.ts +48 -0
  290. package/plugin/channel/hub/diagnostics.ts +67 -0
  291. package/plugin/channel/hub/envelope-validity.ts +109 -0
  292. package/plugin/channel/hub/envelopes.ts +66 -0
  293. package/plugin/channel/hub/lifecycle.ts +91 -0
  294. package/plugin/channel/hub/local-roads.ts +89 -0
  295. package/plugin/channel/hub/remote-roads.ts +165 -0
  296. package/plugin/channel/hub/road-controller.ts +99 -0
  297. package/plugin/channel/hub-client.ts +149 -0
  298. package/plugin/channel/local-hub.js +5995 -0
  299. package/plugin/channel/local-hub.ts +349 -0
  300. package/plugin/channel/map-reporter.ts +48 -0
  301. package/plugin/channel/package-lock.json +1731 -0
  302. package/plugin/channel/package.json +19 -0
  303. package/plugin/channel/protocol.ts +98 -0
  304. package/plugin/channel/road-cli.ts +18 -0
  305. package/plugin/channel/run.sh +15 -0
  306. package/plugin/channel/runtime/claude.ts +458 -0
  307. package/plugin/channel/runtime/codex-config.ts +77 -0
  308. package/plugin/channel/runtime/codex.ts +669 -0
  309. package/plugin/channel/runtime/command.ts +62 -0
  310. package/plugin/channel/runtime/factory.ts +15 -0
  311. package/plugin/channel/runtime/json-rpc.ts +154 -0
  312. package/plugin/channel/runtime/kimi.ts +277 -0
  313. package/plugin/channel/runtime/opencode.ts +248 -0
  314. package/plugin/channel/runtime/process.ts +84 -0
  315. package/plugin/channel/runtime/types.ts +45 -0
  316. package/plugin/channel/runtime-files.ts +73 -0
  317. package/plugin/channel/runtime-gateway.js +6396 -0
  318. package/plugin/channel/runtime-gateway.ts +358 -0
  319. package/plugin/channel/runtime-metrics.ts +52 -0
  320. package/plugin/channel/runtime-subscription.ts +180 -0
  321. package/plugin/channel/terminal-delivery.ts +131 -0
  322. package/plugin/channel/untrusted.ts +60 -0
  323. package/plugin/commands/committee.md +31 -0
  324. package/plugin/commands/exit.md +32 -0
  325. package/plugin/commands/goals.md +20 -0
  326. package/plugin/commands/join.md +18 -0
  327. package/plugin/commands/notice.md +20 -0
  328. package/plugin/commands/propose.md +19 -0
  329. package/plugin/commands/round.md +17 -0
  330. package/plugin/commands/session.md +22 -0
  331. package/plugin/commands/settings.md +25 -0
  332. package/plugin/commands/setup.md +21 -0
  333. package/plugin/commands/team.md +23 -0
  334. package/plugin/domains/custom.md +27 -0
  335. package/plugin/domains/finance.md +31 -0
  336. package/plugin/domains/healthcare.md +34 -0
  337. package/plugin/domains/legal.md +31 -0
  338. package/plugin/domains/marketing.md +33 -0
  339. package/plugin/domains/operations.md +31 -0
  340. package/plugin/domains/research.md +32 -0
  341. package/plugin/domains/sales.md +30 -0
  342. package/plugin/domains/software.md +37 -0
  343. package/plugin/hooks/activity.sh +6 -0
  344. package/plugin/hooks/digging.sh +68 -0
  345. package/plugin/hooks/growth.sh +42 -0
  346. package/plugin/hooks/hooks.json +106 -0
  347. package/plugin/hooks/notice-on-pr.sh +35 -0
  348. package/plugin/hooks/notice-on-stop.sh +80 -0
  349. package/plugin/hooks/notice-pending.sh +58 -0
  350. package/plugin/hooks/solo-en-ciudad.sh +23 -0
  351. package/plugin/hooks/tokens.sh +47 -0
  352. package/plugin/roles/examples/account-executive.md +25 -0
  353. package/plugin/roles/examples/ai-manager.md +34 -0
  354. package/plugin/roles/examples/associate.md +24 -0
  355. package/plugin/roles/examples/brand-lead.md +20 -0
  356. package/plugin/roles/examples/cfo.md +20 -0
  357. package/plugin/roles/examples/city-lead.md +25 -0
  358. package/plugin/roles/examples/clinical-director.md +26 -0
  359. package/plugin/roles/examples/clinical-ops.md +25 -0
  360. package/plugin/roles/examples/clinician.md +25 -0
  361. package/plugin/roles/examples/compliance.md +27 -0
  362. package/plugin/roles/examples/content.md +24 -0
  363. package/plugin/roles/examples/controller.md +27 -0
  364. package/plugin/roles/examples/cpto.md +41 -0
  365. package/plugin/roles/examples/customer-success.md +25 -0
  366. package/plugin/roles/examples/data-engineer.md +37 -0
  367. package/plugin/roles/examples/data.md +60 -0
  368. package/plugin/roles/examples/dev.md +37 -0
  369. package/plugin/roles/examples/devops.md +39 -0
  370. package/plugin/roles/examples/enablement.md +24 -0
  371. package/plugin/roles/examples/ethics.md +24 -0
  372. package/plugin/roles/examples/fin-analytics.md +27 -0
  373. package/plugin/roles/examples/health-compliance.md +25 -0
  374. package/plugin/roles/examples/health-data.md +26 -0
  375. package/plugin/roles/examples/knowledge.md +25 -0
  376. package/plugin/roles/examples/lifecycle.md +26 -0
  377. package/plugin/roles/examples/llm-engineer.md +34 -0
  378. package/plugin/roles/examples/managing-partner.md +20 -0
  379. package/plugin/roles/examples/methods.md +23 -0
  380. package/plugin/roles/examples/operations-lead.md +23 -0
  381. package/plugin/roles/examples/ops.md +24 -0
  382. package/plugin/roles/examples/patient-safety.md +26 -0
  383. package/plugin/roles/examples/performance.md +27 -0
  384. package/plugin/roles/examples/po.md +36 -0
  385. package/plugin/roles/examples/process-owner.md +23 -0
  386. package/plugin/roles/examples/product-design.md +39 -0
  387. package/plugin/roles/examples/program-manager.md +24 -0
  388. package/plugin/roles/examples/quality.md +25 -0
  389. package/plugin/roles/examples/research-director.md +24 -0
  390. package/plugin/roles/examples/research-ops.md +25 -0
  391. package/plugin/roles/examples/researcher.md +25 -0
  392. package/plugin/roles/examples/revenue-lead.md +25 -0
  393. package/plugin/roles/examples/revops.md +26 -0
  394. package/plugin/roles/examples/seo.md +27 -0
  395. package/plugin/roles/examples/specialist.md +24 -0
  396. package/plugin/scripts/admision.py +165 -0
  397. package/plugin/scripts/apaga.py +232 -0
  398. package/plugin/scripts/avatar.py +211 -0
  399. package/plugin/scripts/broker.py +531 -0
  400. package/plugin/scripts/cage.py +252 -0
  401. package/plugin/scripts/capabilities.py +197 -0
  402. package/plugin/scripts/card.py +312 -0
  403. package/plugin/scripts/cities.py +520 -0
  404. package/plugin/scripts/city-env.sh +90 -0
  405. package/plugin/scripts/city-runtime.sh +87 -0
  406. package/plugin/scripts/city-session.sh +526 -0
  407. package/plugin/scripts/city_env.py +67 -0
  408. package/plugin/scripts/crecimiento.py +140 -0
  409. package/plugin/scripts/deliberations.py +48 -0
  410. package/plugin/scripts/doctor.py +172 -0
  411. package/plugin/scripts/domains.py +201 -0
  412. package/plugin/scripts/evidencia.py +64 -0
  413. package/plugin/scripts/find-repos.sh +111 -0
  414. package/plugin/scripts/gh.py +159 -0
  415. package/plugin/scripts/hall_protocol.py +147 -0
  416. package/plugin/scripts/hook_activity.py +139 -0
  417. package/plugin/scripts/launch.py +94 -0
  418. package/plugin/scripts/logs.py +98 -0
  419. package/plugin/scripts/pairing.py +185 -0
  420. package/plugin/scripts/parcels.py +132 -0
  421. package/plugin/scripts/read-card.py +51 -0
  422. package/plugin/scripts/report.py +201 -0
  423. package/plugin/scripts/reset.py +180 -0
  424. package/plugin/scripts/roads.py +230 -0
  425. package/plugin/scripts/roles.py +274 -0
  426. package/plugin/scripts/runtime_log.py +69 -0
  427. package/plugin/scripts/runtime_processes.py +132 -0
  428. package/plugin/scripts/rutas.py +83 -0
  429. package/plugin/scripts/seat.py +1349 -0
  430. package/plugin/scripts/tokens.py +194 -0
  431. package/plugin/scripts/trust-repos.py +59 -0
  432. package/plugin/scripts/ui.py +280 -0
  433. package/plugin/scripts/units.py +80 -0
  434. package/plugin/scripts/workspace.py +364 -0
  435. package/plugin/skills/city/SKILL.md +191 -0
  436. package/templates/blank.md +39 -0
  437. package/templates/finance.md +44 -0
  438. package/templates/legal.md +45 -0
  439. package/templates/marketing.md +48 -0
  440. package/templates/product.md +45 -0
package/bin/hall.html ADDED
@@ -0,0 +1,426 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>Agents City — town hall</title>
7
+ <link rel="icon" href="data:,">
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@500;600;700&family=Newsreader:opsz,wght@6..72,400;6..72,500&family=IBM+Plex+Mono:wght@400;500&display=swap">
11
+ <style>
12
+ /* The map's palette and its three typefaces. The hall manages the city the map
13
+ draws; they must not look like two products. Single visual world on purpose. */
14
+ :root{
15
+ --suelo:#131a24; --suelo2:#1b2431; --suelo3:#222d3c; --linea:#26313f; --linea2:#38495f;
16
+ --tinta:#e8e2d4; --tinta2:#9aa7b8; --tinta3:#6b7889;
17
+ --lampara:#f5c451; --carta:#e2604f; --verde:#4ec98a;
18
+ --hud:"Chakra Petch",system-ui,sans-serif; --texto:"Newsreader",Georgia,serif;
19
+ --mono:"IBM Plex Mono",ui-monospace,monospace;
20
+ }
21
+ *{box-sizing:border-box}
22
+ html,body{height:100%}
23
+ body{margin:0;background:var(--suelo);color:var(--tinta);font-family:var(--texto);
24
+ overflow:hidden;font-size:15px;-webkit-font-smoothing:antialiased}
25
+ h1,h2,h3{font-family:var(--hud);margin:0}
26
+ button,input,select{font:inherit;color:inherit}
27
+
28
+ /* The live rail's width is a variable so the divider can be dragged: the
29
+ fallback keeps today's behaviour until somebody grabs it. */
30
+ #app{display:grid;grid-template-columns:250px minmax(420px,1fr) var(--live-ancho,minmax(420px,500px));height:100%}
31
+ @media(max-width:1180px){#app{grid-template-columns:210px minmax(360px,1fr) var(--live-ancho,390px)}}
32
+ @media(max-width:900px){#app{grid-template-columns:minmax(0,1fr) var(--live-ancho,320px);grid-template-rows:auto 1fr}
33
+ nav{grid-column:1/-1;border-right:none;border-bottom:1px solid var(--linea);padding:10px 0}
34
+ nav .marca,nav .pie{display:none}nav ol{display:flex;overflow-x:auto;gap:4px}}
35
+ @media(max-width:680px){#app{grid-template-columns:1fr;grid-template-rows:auto 1fr}
36
+ #livePanel{display:none}}
37
+
38
+ /* ── rail ───────────────────────────────────────────────────────────────── */
39
+ nav{background:var(--suelo2);border-right:1px solid var(--linea);padding:20px 0 16px;
40
+ display:flex;flex-direction:column;gap:20px;overflow-y:auto}
41
+ .marca{padding:0 18px}
42
+ .badge{display:inline-flex;align-items:center;gap:7px;font-family:var(--hud);font-size:10px;
43
+ letter-spacing:.14em;text-transform:uppercase;color:var(--lampara);
44
+ border:1px solid #4a4127;background:#241f14;padding:4px 9px;border-radius:2px}
45
+ .badge::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--lampara)}
46
+ .marca h2{font-size:19px;margin:9px 0 0}
47
+ .marca p{margin:4px 0 0;font-size:12px;color:var(--tinta3);line-height:1.45}
48
+ nav ol{list-style:none;margin:0;padding:0 10px;display:flex;flex-direction:column;gap:2px}
49
+ nav li{display:flex;gap:10px;align-items:baseline;padding:9px 10px;border-radius:3px;
50
+ font-family:var(--hud);font-size:13.5px;color:var(--tinta2);cursor:pointer;white-space:nowrap}
51
+ nav li:hover{background:var(--suelo3)}
52
+ nav li.aqui{color:var(--tinta);background:var(--suelo3);box-shadow:inset 2px 0 0 var(--lampara)}
53
+ nav li .n{font-family:var(--mono);font-size:10px;color:var(--tinta3);margin-left:auto}
54
+ nav .pie{margin-top:auto;padding:14px 18px 0;border-top:1px solid var(--linea);
55
+ display:flex;flex-direction:column;gap:8px}
56
+ nav .pie a{font-family:var(--hud);font-size:12px;color:var(--tinta3);text-decoration:none}
57
+ nav .pie a:hover{color:var(--lampara)}
58
+ #ciudades select{width:100%;background:var(--suelo);border:1px solid var(--linea2);
59
+ border-radius:3px;padding:6px 8px;font-family:var(--hud);font-size:12px;color:var(--tinta)}
60
+ nav .pie .dato{font-family:var(--mono);font-size:10.5px;color:var(--tinta3);
61
+ word-break:break-all;line-height:1.5}
62
+
63
+ /* ── panel ──────────────────────────────────────────────────────────────── */
64
+ main{display:flex;flex-direction:column;min-height:0;min-width:0}
65
+ .cuerpo{flex:1;overflow-y:auto;padding:32px 40px 60px;min-height:0}
66
+ .cuerpo>.dentro{max-width:860px;display:flex;flex-direction:column;gap:26px}
67
+ h1{font-size:26px;line-height:1.12}
68
+ .prosa{font-size:14.5px;line-height:1.6;color:var(--tinta2);max-width:64ch;margin:0}
69
+ .prosa b{color:var(--tinta);font-weight:500}
70
+ .sub{font-family:var(--hud);font-size:10px;font-weight:600;letter-spacing:.15em;
71
+ text-transform:uppercase;color:var(--tinta3)}
72
+
73
+ /* stats + lights */
74
+ .cifras{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:1px;
75
+ background:var(--linea);border:1px solid var(--linea)}
76
+ .cifra{background:var(--suelo2);padding:13px 14px}
77
+ .cifra b{display:block;font-family:var(--mono);font-size:24px;font-weight:500;
78
+ font-variant-numeric:tabular-nums}
79
+ .cifra span{font-family:var(--hud);font-size:9px;letter-spacing:.11em;
80
+ text-transform:uppercase;color:var(--tinta3)}
81
+ .luces{display:flex;flex-wrap:wrap;gap:8px}
82
+ .luz{display:inline-flex;align-items:center;gap:7px;font-family:var(--hud);font-size:11.5px;
83
+ color:var(--tinta2);border:1px solid var(--linea);background:var(--suelo2);
84
+ padding:6px 11px;border-radius:3px}
85
+ .luz::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--carta);flex:0 0 auto}
86
+ .luz.on::before{background:var(--verde)}
87
+ .luz.neutra::before{background:var(--tinta3)}
88
+
89
+ /* to-do hints */
90
+ .tareas{display:flex;flex-direction:column;border:1px solid var(--linea);border-radius:4px;
91
+ overflow:hidden}
92
+ .tarea{display:flex;align-items:center;gap:12px;background:var(--suelo2);
93
+ border-bottom:1px solid var(--linea);padding:12px 15px;font-size:13.5px;color:var(--tinta2)}
94
+ .tarea:last-child{border-bottom:none}
95
+ .tarea b{color:var(--tinta);font-weight:500}
96
+ .tarea .ir{margin-left:auto;flex:0 0 auto}
97
+ .tarea.hecha{color:var(--tinta3)}
98
+ .tarea.hecha::before{content:"✓";color:var(--verde);font-family:var(--mono)}
99
+ .tarea:not(.hecha)::before{content:"·";color:var(--lampara);font-family:var(--mono);font-size:18px}
100
+
101
+ /* buttons, inputs */
102
+ .bt{font-family:var(--hud);font-size:12.5px;font-weight:600;letter-spacing:.03em;
103
+ padding:8px 16px;border-radius:3px;cursor:pointer;border:1px solid var(--linea2);
104
+ background:var(--suelo3);color:var(--tinta2)}
105
+ .bt:hover:not(:disabled){color:var(--tinta);border-color:var(--tinta3)}
106
+ .bt:focus-visible{outline:1px solid var(--lampara);outline-offset:2px}
107
+ .bt.ppal{background:var(--lampara);border-color:var(--lampara);color:#1a1408}
108
+ .bt.ppal:hover:not(:disabled){background:#ffd469;border-color:#ffd469}
109
+ .bt:disabled{opacity:.4;cursor:not-allowed}
110
+ .bt.mini{padding:4px 10px;font-size:11px}
111
+ input[type=text],select{background:var(--suelo);border:1px solid var(--linea2);
112
+ border-radius:3px;padding:7px 10px;font-family:var(--hud);font-size:13px;min-width:0}
113
+ input[type=text]:focus,select:focus{outline:none;border-color:var(--lampara)}
114
+ .mono{font-family:var(--mono)!important;font-size:12px!important}
115
+
116
+ /* the copyable command */
117
+ .orden{display:flex;align-items:center;gap:10px;background:var(--suelo2);
118
+ border:1px solid var(--linea);border-radius:4px;padding:11px 14px}
119
+ .orden code{flex:1;font-family:var(--mono);font-size:12.5px;color:var(--tinta);
120
+ background:none;border:none;padding:0;overflow-x:auto;white-space:nowrap}
121
+ .orden .et2{font-family:var(--hud);font-size:9.5px;letter-spacing:.12em;
122
+ text-transform:uppercase;color:var(--tinta3);flex:0 0 auto}
123
+
124
+ /* role cards */
125
+ .rolejilla{display:grid;grid-template-columns:repeat(auto-fill,minmax(196px,1fr));gap:9px}
126
+ .rol{text-align:left;background:var(--suelo2);border:1px solid var(--linea);border-radius:4px;
127
+ padding:12px 13px;cursor:pointer;display:flex;flex-direction:column;gap:5px}
128
+ .rol:hover{border-color:var(--tinta3)}
129
+ .rol.on{border-color:var(--lampara);background:var(--suelo3)}
130
+ .rol h3{font-size:13.5px}
131
+ .rol .de{font-family:var(--mono);font-size:10px;color:var(--tinta3)}
132
+ .rol p{margin:0;font-size:11.5px;line-height:1.45;color:var(--tinta2)}
133
+
134
+ /* folder list */
135
+ .lista{border:1px solid var(--linea);border-radius:4px;overflow:hidden;background:var(--suelo2)}
136
+ .lista .barra{display:flex;align-items:center;gap:10px;padding:9px 12px;
137
+ border-bottom:1px solid var(--linea);background:var(--suelo3)}
138
+ .lista .barra input{flex:1}
139
+ .lista .barra .mini2{font-family:var(--hud);font-size:11px;color:var(--tinta3);
140
+ background:none;border:none;cursor:pointer;padding:4px 6px}
141
+ .lista .barra .mini2:hover{color:var(--lampara)}
142
+ .filas{max-height:46vh;overflow-y:auto}
143
+ .fila{display:flex;align-items:baseline;gap:10px;padding:8px 13px;cursor:pointer;
144
+ border-bottom:1px solid rgba(38,49,63,.5);font-size:13px}
145
+ .fila:last-child{border-bottom:none}
146
+ .fila:hover{background:var(--suelo3)}
147
+ .fila .caja{font-family:var(--mono);font-size:12px;color:var(--tinta3)}
148
+ .fila.on .caja{color:var(--lampara)}
149
+ .fila .et{font-family:var(--hud);font-size:13px;color:var(--tinta2)}
150
+ .fila.on .et{color:var(--tinta)}
151
+ .fila .de{font-family:var(--mono);font-size:10.5px;color:var(--tinta3);margin-left:auto;
152
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:12px}
153
+ .agenteRoles{border:1px solid var(--linea);border-radius:4px;overflow:hidden;background:var(--suelo2)}
154
+ .agenteRol{display:grid;grid-template-columns:minmax(180px,1fr) minmax(220px,1fr);gap:14px;
155
+ align-items:center;padding:10px 13px;border-bottom:1px solid rgba(38,49,63,.5)}
156
+ .agenteRol:last-child{border-bottom:none}
157
+ .agenteRol code{display:block;font-family:var(--mono);font-size:12px;color:var(--tinta)}
158
+ .agenteRol span{display:block;margin-top:3px;font-family:var(--hud);font-size:10px;
159
+ letter-spacing:.06em;text-transform:uppercase;color:var(--tinta3)}
160
+ .agenteRol select{width:100%}
161
+ @media(max-width:640px){.agenteRol{grid-template-columns:1fr}}
162
+
163
+ /* forms */
164
+ .campos{display:flex;flex-direction:column;gap:13px}
165
+ .campo label{display:block;font-family:var(--hud);font-size:10.5px;letter-spacing:.1em;
166
+ text-transform:uppercase;color:var(--tinta3);margin-bottom:5px}
167
+ .campo input{width:100%}
168
+ .campo .pista{margin:4px 0 0;font-size:11.5px;color:var(--tinta3);font-style:italic}
169
+ .dos{display:grid;grid-template-columns:1fr 1fr;gap:13px}
170
+ @media(max-width:640px){.dos{grid-template-columns:1fr}}
171
+
172
+ /* districts + parcels */
173
+ .tr{display:flex;align-items:center;gap:10px;background:var(--suelo2);
174
+ border-bottom:1px solid var(--linea);padding:9px 13px}
175
+ .tabla{border:1px solid var(--linea);border-radius:4px;overflow:hidden}
176
+ .tabla .tr:last-child{border-bottom:none}
177
+ .tr .id{font-family:var(--mono);font-size:11px;color:var(--tinta3);flex:0 0 120px;
178
+ overflow:hidden;text-overflow:ellipsis}
179
+ .pips{display:flex;gap:4px}
180
+ .pip{width:16px;height:16px;border-radius:2px;border:1px solid transparent;cursor:pointer;padding:0}
181
+ .pip.on{border-color:var(--tinta);box-shadow:0 0 0 1px var(--suelo) inset}
182
+ .tr .x{background:none;border:none;color:var(--tinta3);cursor:pointer;font-size:15px;padding:2px 5px}
183
+ .tr .x:hover{color:var(--carta)}
184
+ .repoBloque{border:1px solid var(--linea);border-radius:4px;overflow:hidden;margin-bottom:11px}
185
+ .repoCab{display:flex;align-items:center;gap:10px;background:var(--suelo3);
186
+ padding:9px 13px;font-family:var(--mono);font-size:12.5px}
187
+ .repoCab .lab{margin-left:auto;display:flex;align-items:center;gap:6px;
188
+ font-family:var(--hud);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;
189
+ color:var(--tinta3);cursor:pointer}
190
+ .parcela{display:grid;grid-template-columns:1fr 1fr 150px 26px;gap:9px;align-items:center;
191
+ background:var(--suelo2);border-top:1px solid var(--linea);padding:8px 13px}
192
+ @media(max-width:720px){.parcela{grid-template-columns:1fr 1fr}}
193
+
194
+ /* seat and support agents */
195
+ .gente{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:10px}
196
+ /* ── the agents' character sheets ──────────────────────────────────────────
197
+ A card per agent, every number real. Kind tints mirror the avatar rings. */
198
+ .fichasRPG{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
199
+ .fichaRPG{background:var(--suelo2);border:1px solid var(--linea);border-radius:8px;
200
+ padding:14px 15px;display:flex;flex-direction:column;gap:9px}
201
+ .fichaRPG.rpgSeat{border-color:#65552d}
202
+ .rpgCab{display:flex;align-items:center;gap:10px}
203
+ .rpgCara{width:40px;height:40px;border-radius:9px;flex:none}
204
+ .rpgCab h3{margin:0;font-size:15px}
205
+ .rpgTags{display:flex;flex-wrap:wrap;gap:6px;margin-top:3px;align-items:center}
206
+ .kindChip{font:600 9px var(--hud);letter-spacing:.08em;text-transform:uppercase;
207
+ padding:2px 7px;border-radius:8px;color:#0f172a}
208
+ .kindChip.code{background:#3b82f6}.kindChip.knowledge{background:#8b5cf6;color:#f4efe5}
209
+ .kindChip.coordinator{background:#f59e0b}
210
+ .rpgRol,.rpgRun,.rpgHogar{font:10.5px var(--mono);color:var(--tinta3)}
211
+ .rpgRun{color:var(--tinta2)}
212
+ .rpgFila{display:grid;grid-template-columns:52px minmax(0,1fr) auto;gap:8px;align-items:center}
213
+ .rpgFila label,.rpgSkills label{font:600 9px var(--hud);letter-spacing:.09em;
214
+ text-transform:uppercase;color:var(--tinta3)}
215
+ .barra{height:7px;background:var(--suelo);border:1px solid var(--linea2);
216
+ border-radius:4px;overflow:hidden;display:block}
217
+ .barra .llena{display:block;height:100%;background:var(--lampara);border-radius:3px}
218
+ .barra.defecto .llena{background:repeating-linear-gradient(45deg,var(--linea2) 0 4px,transparent 4px 8px)}
219
+ .rpgSel{font:11px var(--hud);background:var(--suelo);color:var(--tinta2);
220
+ border:1px solid var(--linea2);border-radius:4px;padding:3px 5px;max-width:110px}
221
+ .rpgSel:disabled{opacity:.45}
222
+ .rpgDato{font:10.5px var(--mono);color:var(--tinta3);min-width:0}
223
+ .rpgSkills{display:flex;flex-wrap:wrap;gap:5px;align-items:center}
224
+ .rpgSkills code{font-size:10px}
225
+ .rpgQuitar{border:0;background:none;color:var(--tinta3);cursor:pointer;
226
+ font-size:11px;padding:0 0 0 4px;vertical-align:baseline}
227
+ .rpgQuitar:hover{color:var(--carta)}
228
+ /* The engine's traffic light: derived, never guessed. */
229
+ .cliDot{display:inline-block;width:8px;height:8px;border-radius:50%;
230
+ margin-right:5px;vertical-align:baseline;background:var(--tinta3)}
231
+ .cliDot.on{background:var(--verde);box-shadow:0 0 0 2px rgba(78,201,138,.15)}
232
+ .cliDot.idle{background:var(--lampara)}
233
+ .cliDot.off{background:var(--carta)}
234
+ .rpgTest{margin-left:6px}
235
+ .rpgBotones{display:flex;gap:6px;margin-left:auto}
236
+ .rpgMini{border:1px solid var(--linea2);background:var(--suelo);color:var(--tinta3);
237
+ font:10px var(--mono);padding:3px 7px;border-radius:4px;cursor:pointer}
238
+ .rpgMini:hover{color:var(--lampara);border-color:#65552d}
239
+ .rpgSubir input{display:none}
240
+ /* The instruction editor: one file, one reader, saved where the agent lives. */
241
+ #editorIns{position:fixed;inset:0;background:rgba(6,10,15,.72);z-index:60;
242
+ display:flex;align-items:center;justify-content:center}
243
+ #editorIns[hidden]{display:none}
244
+ .edCaja{width:min(760px,92vw);height:min(560px,84vh);background:var(--suelo2);
245
+ border:1px solid var(--linea2);border-radius:8px;display:flex;flex-direction:column}
246
+ .edCab{display:flex;align-items:center;gap:10px;padding:12px 14px;
247
+ border-bottom:1px solid var(--linea)}
248
+ .edCab b{font-family:var(--mono);font-size:13px}
249
+ #edLector{font:10px var(--mono);color:var(--tinta3)}
250
+ #edCerrar{margin-left:auto;border:0;background:none;color:var(--tinta3);
251
+ font-size:18px;cursor:pointer}
252
+ #edTexto{flex:1;resize:none;background:var(--suelo);color:var(--tinta);
253
+ border:0;padding:14px;font:12.5px/1.55 var(--mono);outline:none}
254
+ .edPie{display:flex;align-items:center;gap:10px;padding:10px 14px;
255
+ border-top:1px solid var(--linea)}
256
+ #edRuta{font:10px var(--mono);color:var(--tinta3);margin-right:auto;
257
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
258
+ .persona{background:var(--suelo2);border:1px solid var(--linea);border-radius:4px;
259
+ padding:13px 15px;display:flex;flex-direction:column;gap:7px}
260
+ .persona h3{font-size:14px}
261
+ .persona .ag{font-family:var(--mono);font-size:11px;color:var(--lampara)}
262
+ .persona .rp{font-size:11.5px;color:var(--tinta3);line-height:1.5}
263
+ .persona .ob{font-size:12px;color:var(--tinta2);border-top:1px solid var(--linea);
264
+ padding-top:8px;line-height:1.45}
265
+ .persona .ob.falta{color:var(--tinta3);font-style:italic}
266
+
267
+ /* toast */
268
+ #toast{position:fixed;bottom:22px;right:22px;background:var(--suelo3);color:var(--tinta);
269
+ border:1px solid var(--linea2);border-left:2px solid var(--verde);border-radius:4px;
270
+ padding:11px 16px;font-family:var(--hud);font-size:13px;opacity:0;pointer-events:none;
271
+ transition:opacity .25s;z-index:9;max-width:340px}
272
+ #toast.mal{border-left-color:var(--carta)}
273
+ #toast.ver{opacity:1}
274
+ .cargando{font-family:var(--mono);font-size:12px;color:var(--tinta3)}
275
+ .cargando::after{content:"";display:inline-block;width:6px;height:6px;margin-left:7px;
276
+ border-radius:50%;background:var(--lampara);animation:latido 1s ease-in-out infinite}
277
+ @keyframes latido{0%,100%{opacity:.25}50%{opacity:1}}
278
+ @media(prefers-reduced-motion:reduce){.cargando::after{animation:none}#toast{transition:none}}
279
+
280
+ /* ── live city feed ────────────────────────────────────────────────────── */
281
+ #livePanel{background:#101720;border-left:1px solid var(--linea);min-width:0;min-height:0;
282
+ display:flex;flex-direction:column;overflow:hidden;position:relative}
283
+ /* The divider you can grab: the rail's left edge. Wide enough for a mouse,
284
+ invisible until hovered so it does not read as chrome. */
285
+ #liveResize{position:absolute;left:0;top:0;bottom:0;width:9px;cursor:col-resize;z-index:6}
286
+ #liveResize::after{content:'';position:absolute;left:0;top:0;bottom:0;width:2px;background:transparent;
287
+ transition:background .12s}
288
+ #liveResize:hover::after,#app.liveResizing #liveResize::after{background:var(--lampara)}
289
+ /* While dragging, the map iframe must not swallow the pointer. */
290
+ #app.liveResizing{cursor:col-resize;user-select:none}
291
+ #app.liveResizing iframe{pointer-events:none}
292
+ #livePanel header{padding:17px 17px 13px;border-bottom:1px solid var(--linea);background:var(--suelo2)}
293
+ .liveTop{display:flex;align-items:center;gap:8px}
294
+ .liveTop h2{font-size:13px;letter-spacing:.08em;text-transform:uppercase}
295
+ .liveDot{width:7px;height:7px;border-radius:50%;background:var(--carta);box-shadow:0 0 0 3px rgba(226,96,79,.12)}
296
+ .liveDot.on{background:var(--verde);box-shadow:0 0 0 3px rgba(78,201,138,.12)}
297
+ #liveState{margin-left:auto;font-family:var(--mono);font-size:9.5px;color:var(--tinta3)}
298
+ #livePanel header p{margin:7px 0 10px;color:var(--tinta3);font-size:11.5px;line-height:1.45}
299
+ .liveControls{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px}
300
+ /* The demo's remote control: only rendered for the packaged Aurora demo. A
301
+ framed row, not two grey buttons — the person who missed the show has to be
302
+ able to FIND the way back without being told where it is. */
303
+ #demoControles{display:flex;align-items:center;gap:7px;margin-top:10px;
304
+ padding:7px 9px;border:1px solid #65552d;border-radius:5px;
305
+ background:rgba(245,196,81,.06)}
306
+ #demoControles span{font-family:var(--mono);font-size:9.5px;letter-spacing:.08em;
307
+ text-transform:uppercase;color:var(--lampara);margin-right:auto}
308
+ #demoControles button{border:1px solid var(--linea2);background:var(--suelo);
309
+ color:var(--tinta2);font-family:var(--hud);font-size:12px;padding:6px 11px;
310
+ border-radius:4px;cursor:pointer}
311
+ #demoControles #demoReplay{background:var(--lampara);color:#131a24;
312
+ border-color:var(--lampara);font-weight:600}
313
+ #demoControles button:hover{filter:brightness(1.12)}
314
+ #liveFilter{width:100%;font-family:var(--hud);font-size:11px;padding:6px 8px;background:var(--suelo)}
315
+ #liveWorkToggle{border:1px solid var(--linea2);background:var(--suelo);color:var(--tinta3);
316
+ border-radius:3px;padding:0 9px;font:600 9.5px var(--hud);text-transform:uppercase;
317
+ letter-spacing:.06em;cursor:pointer;white-space:nowrap}
318
+ #liveWorkToggle:hover,#liveWorkToggle.on{color:var(--lampara);border-color:#65552d}
319
+ #liveContext{display:flex;align-items:center;gap:9px;margin-top:10px;padding-top:10px;
320
+ border-top:1px solid var(--linea)}
321
+ .livePeople{display:flex;padding-left:5px}.livePerson{width:25px;height:25px;margin-left:-5px;
322
+ border-radius:50%;display:grid;place-items:center;border:2px solid var(--suelo2);
323
+ background:hsl(var(--actor-hue) 36% 30%);color:#f3eee4;font:600 8.5px var(--hud)}
324
+ .livePerson svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.8;
325
+ stroke-linecap:round;stroke-linejoin:round}
326
+ .liveContextText{min-width:0;color:var(--tinta3);font:10px/1.35 var(--hud)}
327
+ .liveContextText b{color:var(--tinta2);font-weight:600}
328
+ #liveEvents{list-style:none;margin:0;padding:16px 16px 26px;overflow-y:auto;flex:1;
329
+ display:flex;flex-direction:column;gap:13px;scrollbar-color:var(--linea2) transparent}
330
+ .liveEmpty{margin:auto;padding:30px 18px;text-align:center;color:var(--tinta3);font-size:13px;line-height:1.55}
331
+ .liveTurn{--tono:var(--tinta3);display:grid;grid-template-columns:31px minmax(0,1fr);
332
+ align-items:start;gap:8px;max-width:94%}
333
+ .liveTurn.chair{grid-template-columns:minmax(0,1fr) 31px;align-self:flex-end}
334
+ .liveTurn.chair .liveAvatar{grid-column:2}.liveTurn.chair .liveBubble{grid-column:1;grid-row:1;
335
+ border-radius:9px 3px 9px 9px;background:#27291f;border-color:#49452d}
336
+ .liveTurn.member{align-self:flex-start}.liveTurn.system{align-self:center;max-width:100%}
337
+ .liveTurn.system .liveAvatar{display:none}.liveTurn.system .liveBubble{grid-column:1/-1;background:#171f2a}
338
+ .liveTurn.question{--tono:var(--lampara)}.liveTurn.floor{--tono:#aa93ff}
339
+ .liveTurn.evidence{--tono:#61ace9}.liveTurn.decision{--tono:var(--verde)}
340
+ .liveTurn.verification{--tono:#50ccb1}.liveTurn.error{--tono:var(--carta)}
341
+ .liveAvatar{width:31px;height:31px;border-radius:50%;display:grid;place-items:center;
342
+ background:hsl(var(--actor-hue) 36% 29%);color:#f4efe5;border:1px solid hsl(var(--actor-hue) 38% 39%);
343
+ font:600 9.5px var(--hud);box-shadow:0 0 0 2px #101720}
344
+ .liveAvatar svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.7;
345
+ stroke-linecap:round;stroke-linejoin:round}
346
+ /* Identicon faces: the SVG brings its own ground and kind-tinted ring, so the
347
+ chip stops painting its hue circle and lets the face be the face. */
348
+ .liveAvatar.conCara,.livePerson.conCara{background:transparent;border-color:transparent;
349
+ border-radius:8px;overflow:hidden}
350
+ .liveAvatar img.liveCara{width:31px;height:31px;display:block;border-radius:7px}
351
+ .livePerson img.liveCara{width:23px;height:23px;display:block;border-radius:6px}
352
+ .liveBubble{min-width:0;background:var(--suelo2);border:1px solid var(--linea);
353
+ border-radius:3px 9px 9px 9px;padding:10px 11px 11px;box-shadow:0 4px 14px rgba(0,0,0,.09)}
354
+ .liveMeta{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:9px;color:var(--tinta3)}
355
+ .liveActor{color:var(--tono);font-weight:600}.liveRole{padding:1px 5px;border:1px solid var(--linea2);
356
+ border-radius:8px;font:8.5px var(--hud);text-transform:uppercase;letter-spacing:.04em}
357
+ .liveWhen{margin-left:auto}.liveHeading{display:flex;align-items:center;gap:6px;margin:6px 0 4px}
358
+ .liveHeading>svg{width:14px;height:14px;fill:none;stroke:var(--tono);stroke-width:1.8;
359
+ stroke-linecap:round;stroke-linejoin:round;flex:0 0 auto}
360
+ .liveHeading h3{font:600 11.5px/1.3 var(--hud);color:var(--tinta)}
361
+ .liveBubble>p,.liveFull p{white-space:pre-wrap;margin:0;color:var(--tinta2);font-size:12.5px;
362
+ line-height:1.5;overflow-wrap:anywhere}
363
+ .liveEvidence,.liveFull{margin-top:8px;padding-top:7px;border-top:1px solid var(--linea)}
364
+ .liveEvidence summary,.liveFull summary{cursor:pointer;color:var(--tinta3);font:9.5px var(--hud);
365
+ letter-spacing:.03em}.liveEvidence[open] summary,.liveFull[open] summary{color:var(--tono)}
366
+ .liveEvidence ul{margin:7px 0 0;padding-left:16px;color:var(--tinta3);font-size:11.5px;line-height:1.45}
367
+ .liveEvidence li+li{margin-top:4px}.liveFull p{margin-top:7px;color:var(--tinta3);font-size:11.5px}
368
+ </style>
369
+ </head>
370
+ <body>
371
+ <div id="app">
372
+ <nav>
373
+ <div class="marca">
374
+ <span class="badge">town hall</span>
375
+ <h2>Agents City</h2>
376
+ <p>Manage one autonomous city: its seat, repo agents, roads and map. Everything here is a plain file you can also inspect by hand.</p>
377
+ </div>
378
+ <ol id="rail"></ol>
379
+ <div id="ciudades" style="padding:0 18px"></div>
380
+ <div class="pie">
381
+ <a href="#" id="alWizard">Create another city →</a>
382
+ <span class="dato" id="dondeDatos"></span>
383
+ </div>
384
+ </nav>
385
+ <main>
386
+ <div class="cuerpo"><div class="dentro" id="lienzo"><p class="cargando">reading your city</p></div></div>
387
+ </main>
388
+ <aside id="livePanel" aria-label="Live city activity">
389
+ <div id="liveResize" role="separator" aria-orientation="vertical"
390
+ aria-label="Resize the live panel" title="Drag to resize · double-click to reset"></div>
391
+ <header>
392
+ <div class="liveTop"><span class="liveDot" id="liveDot"></span>
393
+ <h2>City live</h2><span id="liveState">waiting</span></div>
394
+ <p>A moderated conversation over the WebSocket bus. The seat routes each turn;
395
+ private model reasoning is never shown or stored.</p>
396
+ <div class="liveControls">
397
+ <select id="liveFilter" aria-label="Filter live activity by conversation">
398
+ <option value="">all conversations</option>
399
+ </select>
400
+ <button id="liveWorkToggle" type="button" aria-pressed="false">show work</button>
401
+ </div>
402
+ <div id="liveContext" hidden></div>
403
+ </header>
404
+ <ol id="liveEvents" aria-live="polite">
405
+ <li class="liveEmpty">Start the city session. Its visible conversation will appear here as it happens.</li>
406
+ </ol>
407
+ </aside>
408
+ </div>
409
+ <div id="toast"></div>
410
+ <div id="editorIns" hidden>
411
+ <div class="edCaja">
412
+ <div class="edCab"><b id="edTitulo"></b><span id="edLector"></span>
413
+ <button id="edCerrar" type="button" aria-label="Close">×</button></div>
414
+ <textarea id="edTexto" spellcheck="false"></textarea>
415
+ <div class="edPie"><span id="edRuta"></span>
416
+ <button id="edGuardar" type="button" class="bt ppal">Save</button></div>
417
+ </div>
418
+ </div>
419
+
420
+ <script>window.PASE = '__PASE__';</script>
421
+ <!-- The page's code is TypeScript, built by the same esbuild and checked by the
422
+ same tsc --strict as the map's front end: city/web/src/hall.ts. It builds to
423
+ dist-hall/, which the deployed Worker never serves — the hall is local. -->
424
+ <script type="module" src="/hall.js?PASE=__PASE__"></script>
425
+ </body>
426
+ </html>
package/bin/logs ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+ # Durable visible conversation and operational diagnostics for the selected city.
3
+ exec python3 "$(cd "$(dirname "$0")/../plugin/scripts" && pwd)/logs.py" "$@"
package/bin/report.py ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env python3
2
+ """Report growth from where the work actually happens.
3
+
4
+ A one-line wrapper. The reporter itself ships inside the plugin, because that is
5
+ what gets installed on everybody's machine — and growth for a marketing, legal or
6
+ finance city has to be counted where the folders are.
7
+
8
+ ./bin/report.py --push
9
+ """
10
+ import os
11
+ import sys
12
+ os.execv(sys.executable, [sys.executable,
13
+ os.path.join(os.path.dirname(os.path.abspath(__file__)),
14
+ '..', 'plugin', 'scripts', 'report.py'), *sys.argv[1:]])
package/bin/reset ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+ # Reset exactly one managed city, with a recovery copy.
3
+ exec python3 "$(cd "$(dirname "$0")/../plugin/scripts" && pwd)/reset.py" "$@"
package/bin/road ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+ # Open, inspect or close explicit roads between cities.
3
+ exec python3 "$(cd "$(dirname "$0")/../plugin/scripts" && pwd)/roads.py" "$@"
package/bin/seat ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bash
2
+ # Sit down to work: one command, no account, no setup.
3
+ #
4
+ # ./bin/seat --help what it asks and what it writes
5
+ #
6
+ # The logic is in plugin/scripts/seat.py and not here, because that folder is what
7
+ # gets installed on everybody's machine — so `/city:join`, which runs inside Claude
8
+ # from an installed plugin with no clone around it, reaches exactly the same code.
9
+ # One job, one implementation, two doors.
10
+ exec python3 "$(cd "$(dirname "$0")/../plugin/scripts" && pwd)/seat.py" "$@"