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
@@ -0,0 +1,340 @@
1
+ #!/usr/bin/env node
2
+ /** Deterministic native-protocol doubles for the runtime-gateway E2E suite. */
3
+ import { createRequire } from 'module';
4
+ import { appendFileSync, readFileSync } from 'fs';
5
+ import { createServer } from 'http';
6
+
7
+ const require = createRequire(new URL('../../plugin/channel/package.json', import.meta.url));
8
+ const { WebSocketServer } = require('ws');
9
+
10
+ const provider = process.argv[2] || '';
11
+ const port = Number(process.argv[3] || 0);
12
+ const capture = process.argv[4] || '';
13
+ const behaviorPath = process.argv[5] || '';
14
+ if (!['codex', 'opencode', 'kimi'].includes(provider) || !port || !capture) {
15
+ throw new Error('usage: fake-native-server.mjs <codex|opencode|kimi> <port> <capture>');
16
+ }
17
+
18
+ const sse = new Set();
19
+ const sockets = new Set();
20
+ const codexSubscriptions = new Map();
21
+ let codexLoadedListCalls = 0;
22
+ let codexTuiMaterialized = false;
23
+ let codexTurnActive = false;
24
+ let codexTuiConversationSent = false;
25
+ const codexTurns = [];
26
+ const server = createServer(async (request, response) => {
27
+ if (provider === 'opencode') return openCode(request, response);
28
+ if (provider === 'kimi') return kimi(request, response);
29
+ response.writeHead(404).end();
30
+ });
31
+ const websocket = provider === 'codex' || provider === 'kimi' ? new WebSocketServer({ noServer: true }) : null;
32
+
33
+ server.on('upgrade', (request, socket, head) => {
34
+ if (!websocket) return socket.destroy();
35
+ websocket.handleUpgrade(request, socket, head, (ws) => websocket.emit('connection', ws));
36
+ });
37
+
38
+ websocket?.on('connection', (ws) => {
39
+ sockets.add(ws);
40
+ codexSubscriptions.set(ws, new Set());
41
+ ws.on('close', () => {
42
+ sockets.delete(ws);
43
+ codexSubscriptions.delete(ws);
44
+ });
45
+ if (provider === 'kimi') {
46
+ ws.send(JSON.stringify({
47
+ type: 'server_hello', timestamp: new Date().toISOString(),
48
+ payload: {
49
+ ws_connection_id: 'fake', protocol_version: 1, heartbeat_ms: 30_000,
50
+ max_event_buffer_size: 100, capabilities: { event_batching: false, compression: false },
51
+ },
52
+ }));
53
+ }
54
+ ws.on('message', (raw) => {
55
+ const message = JSON.parse(String(raw));
56
+ if (provider === 'codex') codex(ws, message);
57
+ else if (message.type === 'client_hello') {
58
+ ws.send(JSON.stringify({
59
+ type: 'ack', id: message.id, code: 0, msg: 'ok',
60
+ payload: { accepted_subscriptions: ['session_fake'], resync_required: [] },
61
+ }));
62
+ }
63
+ });
64
+ });
65
+
66
+ function codex(ws, message) {
67
+ if (message.id && !message.method && ('result' in message || 'error' in message)) {
68
+ if (String(message.id).startsWith('approval_')) {
69
+ record({ provider, receivedAt: new Date().toISOString(), approval: message });
70
+ }
71
+ return;
72
+ }
73
+ if (!message.id) return;
74
+ if (message.method === 'initialize') return result(ws, message.id, { userAgent: 'fake' });
75
+ if (message.method === 'thread/loaded/list') {
76
+ codexLoadedListCalls += 1;
77
+ const data = behavior() === 'missing-tui-thread' || codexLoadedListCalls === 1
78
+ ? []
79
+ : ['thread_tui'];
80
+ result(ws, message.id, { data, nextCursor: null });
81
+ if (data.length && !codexTuiConversationSent) {
82
+ codexTuiConversationSent = true;
83
+ setTimeout(() => {
84
+ // This is a turn entered through the separate official TUI client.
85
+ // The gateway has only used thread/read at this point, so it is NOT a
86
+ // subscriber and must not receive these notifications. It can recover
87
+ // them only by retrying thread/resume and replaying returned history.
88
+ codexTuiMaterialized = true;
89
+ codexTurns.push({
90
+ id: 'turn_manual', status: 'completed', itemsView: 'full',
91
+ items: [
92
+ { id: 'reasoning_manual', type: 'reasoning', summary: ['PRIVATE_TUI_REASONING'] },
93
+ { id: 'user_manual', type: 'userMessage',
94
+ content: [{ type: 'text', text: 'What is this city for?' }] },
95
+ { id: 'agent_manual', type: 'agentMessage', phase: 'final_answer',
96
+ text: 'This city coordinates its repo agents.' },
97
+ ],
98
+ });
99
+ }, 30);
100
+ }
101
+ return;
102
+ }
103
+ if (message.method === 'thread/read') {
104
+ return result(ws, message.id, {
105
+ thread: {
106
+ id: message.params.threadId,
107
+ cwd: process.env.FAKE_CODEX_TUI_CWD || process.cwd(),
108
+ canAcceptDirectInput: true,
109
+ preview: codexTuiMaterialized ? 'first turn' : '',
110
+ status: { type: codexTurnActive ? 'active' : 'idle' },
111
+ turns: message.params.includeTurns && message.params.threadId === 'thread_tui'
112
+ ? codexTurns : [],
113
+ },
114
+ });
115
+ }
116
+ if (message.method === 'thread/resume') {
117
+ if (message.params.threadId === 'thread_tui' && !codexTuiMaterialized) {
118
+ return rpcError(ws, message.id, 'no rollout found for thread id thread_tui');
119
+ }
120
+ codexSubscriptions.get(ws)?.add(message.params.threadId);
121
+ return result(ws, message.id, {
122
+ thread: {
123
+ id: message.params.threadId,
124
+ cwd: process.env.FAKE_CODEX_TUI_CWD || process.cwd(),
125
+ status: { type: codexTurnActive ? 'active' : 'idle' },
126
+ turns: message.params.threadId === 'thread_tui' ? codexTurns : [],
127
+ },
128
+ cwd: process.env.FAKE_CODEX_TUI_CWD || process.cwd(),
129
+ });
130
+ }
131
+ if (message.method === 'thread/start') {
132
+ codexSubscriptions.get(ws)?.add('thread_fake');
133
+ return result(ws, message.id, { thread: { id: 'thread_fake', turns: [] } });
134
+ }
135
+ if (message.method === 'turn/start') {
136
+ if (behavior() === 'reject-prompt') {
137
+ return rpcError(ws, message.id, 'fake provider rejected the Codex prompt');
138
+ }
139
+ if (message.params.threadId === 'thread_tui') codexTuiMaterialized = true;
140
+ codexTurnActive = true;
141
+ record({ provider, receivedAt: new Date().toISOString(), request: message });
142
+ const turnId = `turn_${message.params.clientUserMessageId}`;
143
+ const threadId = message.params.threadId;
144
+ result(ws, message.id, { turn: { id: turnId } });
145
+ sendCodex(threadId, {
146
+ jsonrpc: '2.0', method: 'turn/started',
147
+ params: { threadId, turn: { id: turnId, status: 'inProgress' } },
148
+ });
149
+ sendCodex(threadId, {
150
+ jsonrpc: '2.0', method: 'item/completed',
151
+ params: {
152
+ threadId, turnId,
153
+ item: { id: `reasoning_${turnId}`, type: 'reasoning',
154
+ summary: ['PRIVATE_FAKE_CODEX_REASONING'] },
155
+ },
156
+ });
157
+ sendCodex(threadId, {
158
+ jsonrpc: '2.0', method: 'item/completed',
159
+ params: {
160
+ threadId, turnId,
161
+ item: { id: `user_${turnId}`, type: 'userMessage', content: message.params.input },
162
+ },
163
+ });
164
+ if (behavior() === 'permission-request') {
165
+ ws.send(JSON.stringify({
166
+ jsonrpc: '2.0', id: `approval_${turnId}`,
167
+ method: 'item/permissions/requestApproval',
168
+ params: {
169
+ threadId, turnId, itemId: `tool_${turnId}`,
170
+ permissions: {
171
+ network: { enabled: true },
172
+ fileSystem: {
173
+ read: [process.env.FAKE_CODEX_TUI_CWD || process.cwd()],
174
+ write: [process.env.FAKE_CODEX_TUI_CWD || process.cwd()],
175
+ },
176
+ },
177
+ },
178
+ }));
179
+ }
180
+ setTimeout(() => {
181
+ codexTurnActive = false;
182
+ sendCodex(threadId, {
183
+ jsonrpc: '2.0', method: 'item/agentMessage/delta', params: { delta: 'fake codex response' },
184
+ });
185
+ sendCodex(threadId, {
186
+ jsonrpc: '2.0', method: 'item/completed',
187
+ params: {
188
+ threadId, turnId,
189
+ item: { id: `agent_${turnId}`, type: 'agentMessage',
190
+ text: 'fake codex response', phase: 'final_answer' },
191
+ },
192
+ });
193
+ sendCodex(threadId, {
194
+ jsonrpc: '2.0', method: 'turn/completed',
195
+ params: { threadId, turn: { id: turnId, status: 'completed' } },
196
+ });
197
+ }, 15);
198
+ return;
199
+ }
200
+ result(ws, message.id, {});
201
+ }
202
+
203
+ function sendCodex(threadId, message) {
204
+ const encoded = JSON.stringify(message);
205
+ for (const socket of sockets) {
206
+ if (codexSubscriptions.get(socket)?.has(threadId)) socket.send(encoded);
207
+ }
208
+ }
209
+
210
+ async function openCode(request, response) {
211
+ const url = new URL(request.url || '/', 'http://127.0.0.1');
212
+ if (request.method === 'GET' && url.pathname === '/doc') return json(response, {});
213
+ if (request.method === 'POST' && url.pathname === '/session') {
214
+ await body(request);
215
+ return json(response, { id: 'ses_fake' });
216
+ }
217
+ if (request.method === 'GET' && url.pathname === '/event') {
218
+ response.writeHead(200, {
219
+ 'content-type': 'text/event-stream', 'cache-control': 'no-cache', connection: 'keep-alive',
220
+ });
221
+ response.write(': ready\n\n');
222
+ sse.add(response);
223
+ request.on('close', () => sse.delete(response));
224
+ return;
225
+ }
226
+ if (request.method === 'POST' && url.pathname.endsWith('/prompt_async')) {
227
+ const payload = JSON.parse(await body(request));
228
+ if (behavior() === 'reject-prompt') {
229
+ response.writeHead(503, { 'content-type': 'text/plain' });
230
+ response.end('fake provider rejected the OpenCode prompt');
231
+ return;
232
+ }
233
+ record({ provider, receivedAt: new Date().toISOString(), request: payload });
234
+ response.writeHead(204).end();
235
+ setTimeout(() => {
236
+ emitSse({
237
+ id: 'evt_delta', type: 'message.part.delta',
238
+ properties: { sessionID: 'ses_fake', messageID: 'msg_fake', partID: 'prt_fake', field: 'text', delta: 'fake opencode response' },
239
+ });
240
+ emitSse({ id: 'evt_idle', type: 'session.idle', properties: { sessionID: 'ses_fake' } });
241
+ }, 15);
242
+ return;
243
+ }
244
+ response.writeHead(404).end();
245
+ }
246
+
247
+ async function kimi(request, response) {
248
+ const url = new URL(request.url || '/', 'http://127.0.0.1');
249
+ if (request.method === 'GET' && url.pathname === '/api/v1/meta') {
250
+ return json(response, { code: 0, msg: 'ok', data: {} });
251
+ }
252
+ if (request.method === 'POST' && url.pathname === '/api/v1/sessions') {
253
+ await body(request);
254
+ return json(response, { code: 0, msg: 'ok', data: { id: 'session_fake' } });
255
+ }
256
+ if (request.method === 'POST' && url.pathname.endsWith('/prompts')) {
257
+ const payload = JSON.parse(await body(request));
258
+ if (behavior() === 'reject-prompt') {
259
+ return json(response, {
260
+ code: 401, msg: 'fake provider rejected the Kimi prompt', data: {},
261
+ });
262
+ }
263
+ record({ provider, receivedAt: new Date().toISOString(), request: payload });
264
+ json(response, {
265
+ code: 0, msg: 'ok', data: {
266
+ prompt_id: payload.prompt_id, user_message_id: 'message_fake', status: 'running',
267
+ content: payload.content, created_at: new Date().toISOString(),
268
+ },
269
+ });
270
+ setTimeout(() => {
271
+ for (const ws of sockets) {
272
+ ws.send(JSON.stringify({
273
+ type: 'assistant.delta', session_id: 'session_fake', seq: 1,
274
+ timestamp: new Date().toISOString(),
275
+ payload: { type: 'assistant.delta', agentId: 'agent_fake', turnId: 1, delta: 'fake kimi response' },
276
+ }));
277
+ ws.send(JSON.stringify({
278
+ type: 'turn.ended', session_id: 'session_fake', seq: 2,
279
+ timestamp: new Date().toISOString(),
280
+ payload: { type: 'turn.ended', agentId: 'agent_fake', turnId: 1, reason: 'completed' },
281
+ }));
282
+ }
283
+ }, 15);
284
+ return;
285
+ }
286
+ response.writeHead(404).end();
287
+ }
288
+
289
+ function result(ws, id, value) {
290
+ ws.send(JSON.stringify({ jsonrpc: '2.0', id, result: value }));
291
+ }
292
+
293
+ function rpcError(ws, id, message) {
294
+ ws.send(JSON.stringify({ jsonrpc: '2.0', id, error: { code: -32000, message } }));
295
+ }
296
+
297
+ function json(response, value) {
298
+ response.writeHead(200, { 'content-type': 'application/json' });
299
+ response.end(JSON.stringify(value));
300
+ }
301
+
302
+ function body(request) {
303
+ return new Promise((resolve) => {
304
+ let value = '';
305
+ request.setEncoding('utf8');
306
+ request.on('data', (chunk) => { value += chunk; });
307
+ request.on('end', () => resolve(value));
308
+ });
309
+ }
310
+
311
+ function emitSse(event) {
312
+ for (const response of sse) response.write(`data: ${JSON.stringify(event)}\n\n`);
313
+ }
314
+
315
+ function record(value) {
316
+ appendFileSync(capture, JSON.stringify(value) + '\n');
317
+ }
318
+
319
+ function behavior() {
320
+ if (!behaviorPath) return 'healthy';
321
+ try {
322
+ return readFileSync(behaviorPath, 'utf8').trim() || 'healthy';
323
+ } catch {
324
+ return 'healthy';
325
+ }
326
+ }
327
+
328
+ server.listen(port, '127.0.0.1', () => {
329
+ process.stdout.write(JSON.stringify({ provider, port, ready: true }) + '\n');
330
+ });
331
+
332
+ function close() {
333
+ for (const response of sse) response.end();
334
+ for (const ws of sockets) ws.close();
335
+ websocket?.close();
336
+ server.close(() => process.exit(0));
337
+ setTimeout(() => process.exit(0), 500).unref();
338
+ }
339
+ process.on('SIGINT', close);
340
+ process.on('SIGTERM', close);
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env python3
2
+ """Tiny interactive TUI that rejects Enter until a bracketed paste has settled."""
3
+ import argparse
4
+ import json
5
+ import os
6
+ import signal
7
+ import termios
8
+ import time
9
+ import tty
10
+
11
+ START = b"\x1b[200~"
12
+ END = b"\x1b[201~"
13
+
14
+
15
+ def append(path, body, ended_at):
16
+ record = {
17
+ "submittedAt": time.time_ns() // 1_000_000,
18
+ "pasteEndedAt": ended_at,
19
+ "body": body.decode("utf-8", errors="replace"),
20
+ }
21
+ with open(path, "a", encoding="utf-8") as stream:
22
+ stream.write(json.dumps(record) + "\n")
23
+
24
+
25
+ def main():
26
+ parser = argparse.ArgumentParser()
27
+ parser.add_argument("capture")
28
+ parser.add_argument("--settle-ms", type=int, default=120)
29
+ args = parser.parse_args()
30
+ source = os.ttyname(0)
31
+ fd = os.open(source, os.O_RDWR | os.O_NOCTTY)
32
+ previous = termios.tcgetattr(fd)
33
+ tty.setraw(fd)
34
+ running = True
35
+
36
+ def stop(*_):
37
+ nonlocal running
38
+ running = False
39
+
40
+ signal.signal(signal.SIGTERM, stop)
41
+ signal.signal(signal.SIGINT, stop)
42
+ os.write(fd, b"\x1b[?2004hFAKE_AGENT_READY\r\n")
43
+ incoming = b""
44
+ pasted = None
45
+ collecting = False
46
+ ended_at = 0
47
+ try:
48
+ while running:
49
+ chunk = os.read(fd, 65_536)
50
+ if not chunk:
51
+ break
52
+ incoming += chunk
53
+ while incoming:
54
+ if pasted is None and not collecting:
55
+ marker = incoming.find(START)
56
+ if marker < 0:
57
+ incoming = incoming[-(len(START) - 1):]
58
+ break
59
+ incoming = incoming[marker + len(START):]
60
+ pasted = b""
61
+ collecting = True
62
+ if collecting:
63
+ marker = incoming.find(END)
64
+ if marker < 0:
65
+ pasted += incoming
66
+ incoming = b""
67
+ break
68
+ pasted += incoming[:marker]
69
+ incoming = incoming[marker + len(END):]
70
+ collecting = False
71
+ ended_at = time.time_ns() // 1_000_000
72
+ os.write(fd, b"[Pasted text pending]\r\n")
73
+ if not incoming:
74
+ break
75
+ key, incoming = incoming[:1], incoming[1:]
76
+ if key in (b"\r", b"\n"):
77
+ age = time.time_ns() // 1_000_000 - ended_at
78
+ if age >= args.settle_ms:
79
+ append(args.capture, pasted, ended_at)
80
+ os.write(fd, b"PROMPT_SUBMITTED\r\n")
81
+ pasted = None
82
+ else:
83
+ os.write(fd, b"ENTER_IGNORED_TOO_EARLY\r\n")
84
+ finally:
85
+ os.write(fd, b"\x1b[?2004l")
86
+ termios.tcsetattr(fd, termios.TCSADRAIN, previous)
87
+ os.close(fd)
88
+
89
+
90
+ if __name__ == "__main__":
91
+ main()