agents-city 0.1.0

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