@maka/maka-cli 5.123.0 → 5.123.1

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 (254) hide show
  1. package/README.md +64 -64
  2. package/bundle/typescript/package.json +120 -120
  3. package/bundle/typescript/src/README.md +64 -64
  4. package/bundle/typescript/src/commands/aws/aws.command.js +2 -2
  5. package/bundle/typescript/src/commands/aws/ci.sub.cmd.js +5 -5
  6. package/bundle/typescript/src/commands/aws/ckp.sub.cmd.js +12 -12
  7. package/bundle/typescript/src/commands/aws/csg.sub.cmd.js +3 -3
  8. package/bundle/typescript/src/commands/aws/di.sub.cmd.js +8 -8
  9. package/bundle/typescript/src/commands/aws/rkp.sub.cmd.js +5 -5
  10. package/bundle/typescript/src/commands/aws/sth.sub.cmd.js +3 -3
  11. package/bundle/typescript/src/commands/aws/ti.sub.cmd.js +5 -5
  12. package/bundle/typescript/src/commands/build/build.js +16 -16
  13. package/bundle/typescript/src/commands/build/docker.sub.cmd.js +9 -9
  14. package/bundle/typescript/src/commands/create.js +36 -36
  15. package/bundle/typescript/src/commands/debug.js +4 -4
  16. package/bundle/typescript/src/commands/deploy/deploy.command.js +2 -2
  17. package/bundle/typescript/src/commands/deploy/galaxy.sub.cmd.js +2 -2
  18. package/bundle/typescript/src/commands/deploy/github.sub.cmd.js +8 -8
  19. package/bundle/typescript/src/commands/deploy/ubuntu.sub.cmd.js +2 -2
  20. package/bundle/typescript/src/commands/env/env.command.js +8 -8
  21. package/bundle/typescript/src/commands/env/set.sub.cmd.js +11 -11
  22. package/bundle/typescript/src/commands/game/sideQuest/commands/go.js +1 -1
  23. package/bundle/typescript/src/commands/game/sideQuest/commands/search.js +9 -9
  24. package/bundle/typescript/src/commands/game/sideQuest/commands/source.js +7 -7
  25. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-chunks.js +443 -443
  26. package/bundle/typescript/src/commands/game/sideQuest/factories/scene-factory.js +6 -6
  27. package/bundle/typescript/src/commands/game/sideQuest/game.js +1 -1
  28. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +206 -206
  29. package/bundle/typescript/src/commands/game/sideQuest/models/room.js +9 -9
  30. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene1.json +556 -556
  31. package/bundle/typescript/src/commands/game/sideQuest/scenes/scene2.json +1447 -1447
  32. package/bundle/typescript/src/commands/game/sideQuest/utilities/ephemeral.js +14 -14
  33. package/bundle/typescript/src/commands/game/sideQuest-backlog.sub.cmd.js +2 -2
  34. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +2 -2
  35. package/bundle/typescript/src/commands/generate.js +2 -2
  36. package/bundle/typescript/src/commands/lint.js +10 -10
  37. package/bundle/typescript/src/commands/maka.cmd.js +26 -26
  38. package/bundle/typescript/src/commands/murder.js +14 -14
  39. package/bundle/typescript/src/commands/proxy.js +13 -13
  40. package/bundle/typescript/src/commands/remote/reconfig.sub.cmd.js +6 -6
  41. package/bundle/typescript/src/commands/run/docker.sub.cmd.js +11 -11
  42. package/bundle/typescript/src/commands/run/run.command.js +24 -24
  43. package/bundle/typescript/src/commands/set/global.sub.cmd.js +8 -8
  44. package/bundle/typescript/src/commands/set/local.sub.cmd.js +2 -2
  45. package/bundle/typescript/src/commands/set/set.command.js +3 -3
  46. package/bundle/typescript/src/commands/testCmd/test.command.js +2 -2
  47. package/bundle/typescript/src/exec.js +0 -0
  48. package/bundle/typescript/src/generators/api.js +11 -11
  49. package/bundle/typescript/src/generators/collection.js +6 -6
  50. package/bundle/typescript/src/generators/hook.js +10 -10
  51. package/bundle/typescript/src/generators/kits/auth/auth.generator.js +2 -2
  52. package/bundle/typescript/src/generators/kits/auth/auth0-meteor.auth.gen.js +612 -612
  53. package/bundle/typescript/src/generators/kits/auth/basic-meteor.auth.gen.js +48 -48
  54. package/bundle/typescript/src/generators/kits/auth/provider.auth.gen.js +12 -12
  55. package/bundle/typescript/src/generators/kits/esri/esri.generator.js +3 -3
  56. package/bundle/typescript/src/generators/kits/esri/map.esri.gen.js +7 -7
  57. package/bundle/typescript/src/generators/kits/frames/frames.generator.js +16 -16
  58. package/bundle/typescript/src/generators/kits/mui/auth.mui.gen.js +2 -2
  59. package/bundle/typescript/src/generators/kits/mui/auth0.mui.gen.js +5 -5
  60. package/bundle/typescript/src/generators/kits/mui/frame.mui.gen.js +4 -4
  61. package/bundle/typescript/src/generators/kits/mui/mui.generator.js +22 -22
  62. package/bundle/typescript/src/generators/services/translation.js +5 -5
  63. package/bundle/typescript/src/templates/aws/cloudformation/create-ec2-instance.template +14 -14
  64. package/bundle/typescript/src/templates/meteor/api/api.js +20 -20
  65. package/bundle/typescript/src/templates/meteor/api/api.js.ts +20 -20
  66. package/bundle/typescript/src/templates/meteor/api/apollo-gateway.js +50 -50
  67. package/bundle/typescript/src/templates/meteor/api/apollo-gateway.js.ts +55 -55
  68. package/bundle/typescript/src/templates/meteor/api/graphql-api.js +63 -63
  69. package/bundle/typescript/src/templates/meteor/api/graphql-api.js.ts +69 -69
  70. package/bundle/typescript/src/templates/meteor/api/methods.js +39 -39
  71. package/bundle/typescript/src/templates/meteor/api/methods.js.ts +40 -40
  72. package/bundle/typescript/src/templates/meteor/api/register-api.js +3 -3
  73. package/bundle/typescript/src/templates/meteor/api/register-api.js.ts +3 -3
  74. package/bundle/typescript/src/templates/meteor/api/resolvers.js +9 -9
  75. package/bundle/typescript/src/templates/meteor/api/resolvers.js.ts +9 -9
  76. package/bundle/typescript/src/templates/meteor/api/typeDefs.js +6 -6
  77. package/bundle/typescript/src/templates/meteor/api/typeDefs.js.ts +6 -6
  78. package/bundle/typescript/src/templates/meteor/app/client/body.html +3 -3
  79. package/bundle/typescript/src/templates/meteor/app/client/head.html +12 -12
  80. package/bundle/typescript/src/templates/meteor/app/client/main.js +15 -15
  81. package/bundle/typescript/src/templates/meteor/app/client/main.js.jsx +15 -15
  82. package/bundle/typescript/src/templates/meteor/app/client/main.js.ts +17 -17
  83. package/bundle/typescript/src/templates/meteor/app/client/main.js.tsx +17 -17
  84. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/index.js +20 -20
  85. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/index.js.jsx +107 -107
  86. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/index.js.ts +20 -20
  87. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/index.js.tsx +108 -108
  88. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/routes.js +39 -39
  89. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/routes.js.jsx +33 -33
  90. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/routes.js.ts +24 -24
  91. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/routes.js.tsx +33 -33
  92. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/templates.js +9 -9
  93. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/templates.js.jsx +9 -9
  94. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/templates.js.ts +9 -9
  95. package/bundle/typescript/src/templates/meteor/app/imports/startup/client/templates.js.tsx +9 -9
  96. package/bundle/typescript/src/templates/meteor/app/imports/startup/lib/index.js +1 -1
  97. package/bundle/typescript/src/templates/meteor/app/imports/startup/lib/index.js.jsx +20 -20
  98. package/bundle/typescript/src/templates/meteor/app/imports/startup/lib/index.js.ts +1 -1
  99. package/bundle/typescript/src/templates/meteor/app/imports/startup/lib/index.js.tsx +20 -20
  100. package/bundle/typescript/src/templates/meteor/app/imports/startup/lib/routes.js.jsx +28 -28
  101. package/bundle/typescript/src/templates/meteor/app/imports/startup/lib/routes.js.tsx +28 -28
  102. package/bundle/typescript/src/templates/meteor/app/imports/startup/server/index.js +1 -1
  103. package/bundle/typescript/src/templates/meteor/app/imports/startup/server/index.js.jsx +95 -95
  104. package/bundle/typescript/src/templates/meteor/app/imports/startup/server/index.js.tsx +98 -98
  105. package/bundle/typescript/src/templates/meteor/app/imports/ui/test-helpers.js +24 -24
  106. package/bundle/typescript/src/templates/meteor/app/imports/ui/test-helpers.js.ts +24 -24
  107. package/bundle/typescript/src/templates/meteor/app/lib/main.js +3 -3
  108. package/bundle/typescript/src/templates/meteor/app/lib/main.js.jsx +3 -3
  109. package/bundle/typescript/src/templates/meteor/app/lib/main.js.ts +3 -3
  110. package/bundle/typescript/src/templates/meteor/app/lib/main.js.tsx +3 -3
  111. package/bundle/typescript/src/templates/meteor/app/maka.d.ts +533 -533
  112. package/bundle/typescript/src/templates/meteor/app/meteor.d.ts +181 -181
  113. package/bundle/typescript/src/templates/meteor/app/public/manifest.json +27 -27
  114. package/bundle/typescript/src/templates/meteor/app/public/sw.js +30 -30
  115. package/bundle/typescript/src/templates/meteor/app/public/sw.js.jsx +30 -30
  116. package/bundle/typescript/src/templates/meteor/app/public/sw.js.ts +30 -30
  117. package/bundle/typescript/src/templates/meteor/app/public/sw.js.tsx +30 -30
  118. package/bundle/typescript/src/templates/meteor/app/server/helmet-csp.js +179 -179
  119. package/bundle/typescript/src/templates/meteor/app/server/helmet-csp.js.jsx +179 -179
  120. package/bundle/typescript/src/templates/meteor/app/server/helmet-csp.js.ts +179 -179
  121. package/bundle/typescript/src/templates/meteor/app/server/helmet-csp.js.tsx +179 -179
  122. package/bundle/typescript/src/templates/meteor/app/server/main.js +13 -13
  123. package/bundle/typescript/src/templates/meteor/app/server/main.js.jsx +13 -13
  124. package/bundle/typescript/src/templates/meteor/app/server/main.js.ts +14 -14
  125. package/bundle/typescript/src/templates/meteor/app/server/main.js.tsx +14 -14
  126. package/bundle/typescript/src/templates/meteor/app/tsconfig.json +42 -42
  127. package/bundle/typescript/src/templates/meteor/collection/collection.js +51 -51
  128. package/bundle/typescript/src/templates/meteor/collection/collection.js.ts +55 -55
  129. package/bundle/typescript/src/templates/meteor/collection/tests.js +27 -27
  130. package/bundle/typescript/src/templates/meteor/collection/tests.js.ts +27 -27
  131. package/bundle/typescript/src/templates/meteor/config/deploy.sh.template +101 -101
  132. package/bundle/typescript/src/templates/meteor/config/docker-compose.yaml +17 -17
  133. package/bundle/typescript/src/templates/meteor/config/nginx.conf.template +31 -31
  134. package/bundle/typescript/src/templates/meteor/config/pm2.config.js +27 -27
  135. package/bundle/typescript/src/templates/meteor/config/process.env +5 -5
  136. package/bundle/typescript/src/templates/meteor/config/settings.json +11 -11
  137. package/bundle/typescript/src/templates/meteor/config/ssh.json +6 -6
  138. package/bundle/typescript/src/templates/meteor/dbc/config.js +70 -70
  139. package/bundle/typescript/src/templates/meteor/dbc/config.js.ts +70 -70
  140. package/bundle/typescript/src/templates/meteor/dbc/conn.js +37 -37
  141. package/bundle/typescript/src/templates/meteor/dbc/conn.js.ts +37 -37
  142. package/bundle/typescript/src/templates/meteor/dbc/register-dbc.js +3 -3
  143. package/bundle/typescript/src/templates/meteor/dbc/register-dbc.js.ts +3 -3
  144. package/bundle/typescript/src/templates/meteor/github/workflows/deploy.yaml +150 -150
  145. package/bundle/typescript/src/templates/meteor/method/method.js +48 -48
  146. package/bundle/typescript/src/templates/meteor/method/method.js.ts +48 -48
  147. package/bundle/typescript/src/templates/meteor/package/package.js +37 -37
  148. package/bundle/typescript/src/templates/meteor/package/package.js.jsx +37 -37
  149. package/bundle/typescript/src/templates/meteor/package/package.js.ts +36 -36
  150. package/bundle/typescript/src/templates/meteor/package/package.js.tsx +37 -37
  151. package/bundle/typescript/src/templates/meteor/package/tests/client/package.js +5 -5
  152. package/bundle/typescript/src/templates/meteor/package/tests/client/package.js.jsx +5 -5
  153. package/bundle/typescript/src/templates/meteor/package/tests/client/package.js.ts +5 -5
  154. package/bundle/typescript/src/templates/meteor/package/tests/client/package.js.tsx +5 -5
  155. package/bundle/typescript/src/templates/meteor/package/tests/server/package.js +5 -5
  156. package/bundle/typescript/src/templates/meteor/package/tests/server/package.js.jsx +5 -5
  157. package/bundle/typescript/src/templates/meteor/package/tests/server/package.js.ts +5 -5
  158. package/bundle/typescript/src/templates/meteor/package/tests/server/package.js.tsx +5 -5
  159. package/bundle/typescript/src/templates/meteor/project/.maka/config.json +29 -29
  160. package/bundle/typescript/src/templates/meteor/project/README.md +33 -33
  161. package/bundle/typescript/src/templates/meteor/project/build/README +4 -4
  162. package/bundle/typescript/src/templates/meteor/project/gitignore +10 -10
  163. package/bundle/typescript/src/templates/meteor/project/package.json +29 -29
  164. package/bundle/typescript/src/templates/meteor/publish/publish.js +7 -7
  165. package/bundle/typescript/src/templates/meteor/publish/publish.js.ts +7 -7
  166. package/bundle/typescript/src/templates/meteor/service/logger/logger.js +27 -27
  167. package/bundle/typescript/src/templates/meteor/service/logger/logger.js.ts +27 -27
  168. package/bundle/typescript/src/templates/meteor/stylesheet/stylesheet.css +5 -5
  169. package/bundle/typescript/src/templates/meteor/stylesheet/stylesheet.css.less +5 -5
  170. package/bundle/typescript/src/templates/meteor/template/template-tests.js +1 -1
  171. package/bundle/typescript/src/templates/meteor/template/template-tests.js.jsx +55 -55
  172. package/bundle/typescript/src/templates/meteor/template/template-tests.js.ts +1 -1
  173. package/bundle/typescript/src/templates/meteor/template/template-tests.js.tsx +55 -55
  174. package/bundle/typescript/src/templates/meteor/template/template.css +3 -3
  175. package/bundle/typescript/src/templates/meteor/template/template.css.less +3 -3
  176. package/bundle/typescript/src/templates/meteor/template/template.css.scss +3 -3
  177. package/bundle/typescript/src/templates/meteor/template/template.html +5 -5
  178. package/bundle/typescript/src/templates/meteor/template/template.js +20 -20
  179. package/bundle/typescript/src/templates/meteor/template/template.js.jsx +77 -77
  180. package/bundle/typescript/src/templates/meteor/template/template.js.ts +1 -1
  181. package/bundle/typescript/src/templates/meteor/template/template.js.tsx +89 -89
  182. package/bundle/typescript/src/templates/react/component/component.css +6 -6
  183. package/bundle/typescript/src/templates/react/component/component.css.less +6 -6
  184. package/bundle/typescript/src/templates/react/component/component.css.scss +3 -3
  185. package/bundle/typescript/src/templates/react/component/component.js.jsx +59 -59
  186. package/bundle/typescript/src/templates/react/component/component.js.tsx +65 -65
  187. package/bundle/typescript/src/templates/react/hook/hook.css +3 -3
  188. package/bundle/typescript/src/templates/react/hook/hook.css.scss +3 -3
  189. package/bundle/typescript/src/templates/react/hook/hook.js.jsx +19 -19
  190. package/bundle/typescript/src/templates/react/hook/hook.js.tsx +19 -19
  191. package/bundle/typescript/src/templates/react/kit/auth/provider/authentication-provider.js.jsx +306 -306
  192. package/bundle/typescript/src/templates/react/kit/auth/provider/authentication-provider.js.tsx +350 -350
  193. package/bundle/typescript/src/templates/react/kit/auth/service/auth0-client.js.jsx +178 -178
  194. package/bundle/typescript/src/templates/react/kit/auth/service/auth0-client.js.tsx +178 -178
  195. package/bundle/typescript/src/templates/react/kit/auth/service/auth0-config.js.jsx +59 -59
  196. package/bundle/typescript/src/templates/react/kit/auth/service/auth0-config.js.tsx +67 -67
  197. package/bundle/typescript/src/templates/react/kit/auth/service/auth0-methods.js.jsx +273 -273
  198. package/bundle/typescript/src/templates/react/kit/auth/service/auth0-methods.js.tsx +275 -275
  199. package/bundle/typescript/src/templates/react/kit/auth/service/auth0-validator.js.jsx +182 -182
  200. package/bundle/typescript/src/templates/react/kit/auth/service/auth0-validator.js.tsx +199 -199
  201. package/bundle/typescript/src/templates/react/kit/auth/service/meteor-auth-service.js.jsx +138 -138
  202. package/bundle/typescript/src/templates/react/kit/auth/service/meteor-auth-service.js.tsx +153 -153
  203. package/bundle/typescript/src/templates/react/kit/esri/map/basic-map.js.jsx +29 -29
  204. package/bundle/typescript/src/templates/react/kit/esri/map/basic-map.js.tsx +32 -32
  205. package/bundle/typescript/src/templates/react/kit/frames/frames-demo.css +63 -63
  206. package/bundle/typescript/src/templates/react/kit/frames/frames-demo.jsx +153 -153
  207. package/bundle/typescript/src/templates/react/kit/frames/frames-demo.tsx +164 -164
  208. package/bundle/typescript/src/templates/react/kit/frames/workspace-manager.css +105 -105
  209. package/bundle/typescript/src/templates/react/kit/frames/workspace-manager.jsx +158 -158
  210. package/bundle/typescript/src/templates/react/kit/frames/workspace-manager.tsx +166 -166
  211. package/bundle/typescript/src/templates/react/kit/mui/auth/forgot-password/basic-forgot-password-page.js.jsx +34 -34
  212. package/bundle/typescript/src/templates/react/kit/mui/auth/forgot-password/basic-forgot-password-page.js.tsx +33 -33
  213. package/bundle/typescript/src/templates/react/kit/mui/auth/login/basic-login-page.js.jsx +53 -53
  214. package/bundle/typescript/src/templates/react/kit/mui/auth/login/basic-login-page.js.tsx +53 -53
  215. package/bundle/typescript/src/templates/react/kit/mui/auth/logout/basic-logout-page.js.jsx +25 -25
  216. package/bundle/typescript/src/templates/react/kit/mui/auth/logout/basic-logout-page.js.tsx +25 -25
  217. package/bundle/typescript/src/templates/react/kit/mui/auth/password-reset/basic-password-reset-page.js.jsx +41 -41
  218. package/bundle/typescript/src/templates/react/kit/mui/auth/password-reset/basic-password-reset-page.js.tsx +34 -34
  219. package/bundle/typescript/src/templates/react/kit/mui/auth/register/basic-register-page.js.jsx +33 -33
  220. package/bundle/typescript/src/templates/react/kit/mui/auth/register/basic-register-page.js.tsx +33 -33
  221. package/bundle/typescript/src/templates/react/kit/mui/auth0/auth-callback.js.jsx +71 -71
  222. package/bundle/typescript/src/templates/react/kit/mui/auth0/auth-callback.js.tsx +71 -71
  223. package/bundle/typescript/src/templates/react/kit/mui/auth0/auth0-account-settings.js.jsx +123 -123
  224. package/bundle/typescript/src/templates/react/kit/mui/auth0/auth0-account-settings.js.tsx +123 -123
  225. package/bundle/typescript/src/templates/react/kit/mui/auth0/auth0-login-button.js.jsx +56 -56
  226. package/bundle/typescript/src/templates/react/kit/mui/auth0/auth0-login-button.js.tsx +74 -74
  227. package/bundle/typescript/src/templates/react/kit/mui/frame/app-bars/basic-app-bar.js.jsx +43 -43
  228. package/bundle/typescript/src/templates/react/kit/mui/frame/app-bars/basic-app-bar.js.tsx +43 -43
  229. package/bundle/typescript/src/templates/react/kit/mui/frame/drawers/basic-drawer.js.jsx +121 -121
  230. package/bundle/typescript/src/templates/react/kit/mui/frame/drawers/basic-drawer.js.tsx +117 -117
  231. package/bundle/typescript/src/templates/react/kit/mui/frame/footers/basic-sticky-footer.js.jsx +41 -41
  232. package/bundle/typescript/src/templates/react/kit/mui/frame/footers/basic-sticky-footer.js.tsx +41 -41
  233. package/bundle/typescript/src/templates/react/route/route.js +8 -8
  234. package/bundle/typescript/src/templates/react/route/route.js.jsx +5 -5
  235. package/bundle/typescript/src/templates/react/route/route.js.ts +8 -8
  236. package/bundle/typescript/src/templates/react/route/route.js.tsx +5 -5
  237. package/bundle/typescript/src/templates/react/test/test.js +1 -1
  238. package/bundle/typescript/src/templates/react/test/test.js.jsx +40 -40
  239. package/bundle/typescript/src/templates/react/test/test.js.ts +1 -1
  240. package/bundle/typescript/src/templates/react/test/test.js.tsx +40 -40
  241. package/bundle/typescript/src/templates/service/docker/Dockerfile +54 -54
  242. package/bundle/typescript/src/templates/service/eslint/babel.config.js +16 -16
  243. package/bundle/typescript/src/templates/service/eslint/config.eslint.js +69 -69
  244. package/bundle/typescript/src/templates/service/i18n/i18n.js +33 -33
  245. package/bundle/typescript/src/templates/service/i18n/i18n.js.ts +33 -33
  246. package/bundle/typescript/src/templates/service/i18n/locales.js +3 -3
  247. package/bundle/typescript/src/templates/service/i18n/locales.js.ts +3 -3
  248. package/bundle/typescript/src/templates/service/openssl/openssl.conf +22 -22
  249. package/bundle/typescript/src/templates/service/test/jest/jest.config.js +24 -24
  250. package/bundle/typescript/src/templates/service/test/jest/jest.setup.js +7 -7
  251. package/bundle/typescript/src/tools/mpi/sdk-runtime.d.ts +1 -0
  252. package/bundle/typescript/src/tools/mpi/sdk-runtime.js +29 -0
  253. package/bundle/typescript/src/tools/mpi/sdk-runtime.js.map +1 -1
  254. package/package.json +120 -120
@@ -132,12 +132,12 @@ export class SceneSynthesizer {
132
132
  // Shared context handed to every ensureAI*() call below, so room
133
133
  // descriptions, NPC appearances, and puzzle riddles all stay
134
134
  // consistent with the same scene tone.
135
- const sceneContext = `
136
- Scene: ${json.name}
137
- Story: ${json.story}
138
- Currency: ${json.currency.type}
139
- Residence Tiers: ${json.residenceTiers.join(', ')}
140
- Key Locations: ${json.rooms.map(r => r.name).join(', ')}
135
+ const sceneContext = `
136
+ Scene: ${json.name}
137
+ Story: ${json.story}
138
+ Currency: ${json.currency.type}
139
+ Residence Tiers: ${json.residenceTiers.join(', ')}
140
+ Key Locations: ${json.rooms.map(r => r.name).join(', ')}
141
141
  `.trim();
142
142
  // Step 2: Create and Register Rooms using RoomFactory
143
143
  logger.write(`Creating Rooms`);
@@ -2174,7 +2174,7 @@ export default class Game {
2174
2174
  if (client.dead) {
2175
2175
  this.contacts.delete(client.name);
2176
2176
  Logger.getInstance().write(`Client reputation settled: ${client.name} (dead -- no contact).`);
2177
- return `
2177
+ return `
2178
2178
  ${client.name} won't be remembering anything. Dead Johnsons pay nothing -- and their friends ask questions.`;
2179
2179
  }
2180
2180
  const existing = this.contacts.get(client.name);
@@ -252,13 +252,13 @@ export function credentialHonestyNote(passesHeld) {
252
252
  const known = passesHeld > 0
253
253
  ? `the ${passesHeld === 1 ? 'pass' : `${passesHeld} passes`} for the barrier${passesHeld === 1 ? '' : 's'} at your own post, named above, and NO others`
254
254
  : `NO code, pass, or combination to anything -- you hold none`;
255
- return `
256
- CREDENTIALS YOU DO NOT HOLD: you know ${known}. You cannot deduce, guess, or
257
- reason your way to a credential you were never given, and you must NEVER invent one --
258
- not as a guess, not as a "try this", not as a number you half-remember. A code you make
259
- up is a code the lock refuses, and the runner who trusts it burns their whole approach on
260
- it. Asked for a pass you do not hold, say so plainly and point them at where such things
261
- actually live: written down somewhere in the world by whoever has to remember it, or in
255
+ return `
256
+ CREDENTIALS YOU DO NOT HOLD: you know ${known}. You cannot deduce, guess, or
257
+ reason your way to a credential you were never given, and you must NEVER invent one --
258
+ not as a guess, not as a "try this", not as a number you half-remember. A code you make
259
+ up is a code the lock refuses, and the runner who trusts it burns their whole approach on
260
+ it. Asked for a pass you do not hold, say so plainly and point them at where such things
261
+ actually live: written down somewhere in the world by whoever has to remember it, or in
262
262
  the hands of whoever works that door.`;
263
263
  }
264
264
  /**
@@ -289,14 +289,14 @@ the hands of whoever works that door.`;
289
289
  */
290
290
  export function localKnowledgeNote(roomName) {
291
291
  const here = roomName ? `"${roomName}"` : 'the room you are standing in';
292
- return `
293
- WHAT YOU KNOW ENDS AT THIS ROOM: you know ${here} -- what stands here, what you can see
294
- here, what you carry, and where its own exits lead. Beyond that you know only what you
295
- have actually been told above. You do NOT know where things are kept in rooms you are not
296
- in, you have NOT been through the other doors in this world, and you do not know what they
297
- need to open. If someone asks and you were not told, say you don't know and say where you
298
- WOULD look -- never name a room to be helpful. A confident wrong room is worse than a
299
- shrug: they will walk there, search it, come back empty, and stop believing the true
292
+ return `
293
+ WHAT YOU KNOW ENDS AT THIS ROOM: you know ${here} -- what stands here, what you can see
294
+ here, what you carry, and where its own exits lead. Beyond that you know only what you
295
+ have actually been told above. You do NOT know where things are kept in rooms you are not
296
+ in, you have NOT been through the other doors in this world, and you do not know what they
297
+ need to open. If someone asks and you were not told, say you don't know and say where you
298
+ WOULD look -- never name a room to be helpful. A confident wrong room is worse than a
299
+ shrug: they will walk there, search it, come back empty, and stop believing the true
300
300
  things you tell them afterwards.`;
301
301
  }
302
302
  /**
@@ -788,78 +788,78 @@ export class NPC extends Player {
788
788
  this._dialogue = npcConfig.dialog;
789
789
  this._description = npcConfig.description;
790
790
  this.commandRegistry = commandRegistry;
791
- this._commandHelp = `
792
- Available in-game commands (use with [COMMAND] prefix):
793
-
794
- - go <direction> — move in a direction like north, south, east, west
795
- - move to <spot> — cross THIS room to one of its named places (bar, door, booths...),
796
- when the room has them. You must share a place with someone to talk-to or trade
797
- with them; speech from another place reaches them only as a shout everyone hears.
798
- "move away" steps to the OPEN FLOOR -- the neutral ground between the places; to
799
- reach someone standing there, move to the open floor yourself. "move to <name>"
800
- also works: it walks you to wherever that person is standing.
801
- - grapple <name> — seize and RESTRAIN someone without hurting them; held, they cannot
802
- move, flee, or fight until they break your grip. Your hands are full while you hold
803
- them ("release" lets go). If YOU are ever held: "struggle" is the only way out.
804
- - say <message> — speak a message
805
- - take <item name> — pick up an item from the current room ("take all" sweeps everything here, but only AFTER you have searched this room)
806
- - drop <item name> — drop an item
807
- - use <item name> — use an item (a Medical item like a medkit heals your PHYSICAL damage;
808
- a StimPatch item recovers your STUN but costs 1 physical as a crash -- both are consumed.
809
- Use them if you're hurt and carrying one)
810
- - rest — recover Stun by resting. Only works in a Residence room or a room with no one
811
- else present; never rest mid-fight
812
- - equip <item name> — equip an item (e.g., equip a weapon to use)
813
- - equip all - equip all wearable items in inventory
814
- - unequip <item name> — remove an equipped item
815
- - unlock <door name> — unlock a door (if you have the key or solution)
816
- - lock <door name> — lock a door
817
- - use <panel name> <the code> — enter a code you actually know into a keypad or panel.
818
- Only a PANEL takes a code; you cannot talk at a mechanical lock
819
- - pick — attempt to pick the lock on the puzzle in this room without knowing the answer (50/50, a failure sets off an alarm)
820
- - hack — attempt to hack the terminal/system in this room without knowing the answer (50/50, a failure trips a countermeasure)
821
- - cast <spell> [at <target>] — cast a spell you know. Requires being Awakened
822
- (innate talent -- you'll be told if you are) OR carrying that spell's formula
823
- item or a grimoire (a Focus item boosts your pool either way). Spells:
824
- "manabolt" (combat damage resisted by body, not armor), "heal [on <ally>]" (heal
825
- physical wounds -- your own by default, or an ally's in your room; healing a
826
- wounded ally is a strong support move), "armor [on <ally>]" (sustained protection
827
- on yourself or an ally; its bearer gets +soak at -2 dice to all else; cast at them
828
- again to release). EVERY cast costs drain -- stun damage to YOU the caster; fill
829
- your stun track and you're out cold. Never cast if you're mundane with no magic gear.
830
- - cast — bare "cast" attempts to magically bypass the ward/barrier in this room
831
- without knowing the answer (requires the same talent or gear; failing burns the
832
- route for good and the backlash hurts you badly)
833
- - search — search the room for hidden things
834
- - look — look around the current room
835
- - look at <target> - looks at an item, player, or direction
836
- - store <item name> — store an item (in bank, safe, etc.)
837
- - give <item name> to <target> — give an item to someone
838
- - talk-to <target> — initiate conversation with another character
839
- - call <target> [message] — call someone remotely over a commlink (works even if they're not in your room; requires having a commlink equipped, and the target having one too)
840
- - end-call — hang up your current commlink call
841
- - silent — toggle your commlink broadcast. While running silent, you can't place
842
- calls and nobody can call YOU. Toggle again to go loud.
843
- - read <target> - Reads an item of Category "Book"
844
- - attack <target> — attack someone in your room. Resolved as opposed dice-pool combat
845
- (your weapon and armor matter); an initiative roll decides who strikes first each
846
- exchange (fast fighters can even land an extra strike), the target strikes back, and
847
- it usually takes several exchanges to bring someone down. Only start a fight your
848
- character would actually risk dying in. If your target flees the room, a failed
849
- attack tells you exactly where they went and which direction to "go" -- CHASE them
850
- with that instead of attacking the empty room again.
851
- - kill <target> - alias for attack: real combat, NOT an instant kill.
852
- - subdue <target> — take someone down ALIVE: stun damage, bare-handed, slower than
853
- shooting; they retaliate lethally. Use when you want them breathing.
854
- - brandish — draw your holstered weapon WITHOUT attacking. Everyone in the room sees
855
- it: a threat display, pure intimidation. (Attacking auto-draws, so you never need
856
- this to fight -- it's for making a point.)
857
- - holster — put your drawn weapon away, visibly. A stand-down gesture: use it to
858
- de-escalate, accept a surrender, or show good faith in a negotiation.
859
- - reload — refill your equipped firearm (consumes an Ammunition item from your pack).
860
- Firearms run dry: if your attack reports "dry", reload or switch to melee.
861
- Fleeing someone you just fought gives them one free parting shot at your back
862
- (and fleeing enemies give YOU one).
791
+ this._commandHelp = `
792
+ Available in-game commands (use with [COMMAND] prefix):
793
+
794
+ - go <direction> — move in a direction like north, south, east, west
795
+ - move to <spot> — cross THIS room to one of its named places (bar, door, booths...),
796
+ when the room has them. You must share a place with someone to talk-to or trade
797
+ with them; speech from another place reaches them only as a shout everyone hears.
798
+ "move away" steps to the OPEN FLOOR -- the neutral ground between the places; to
799
+ reach someone standing there, move to the open floor yourself. "move to <name>"
800
+ also works: it walks you to wherever that person is standing.
801
+ - grapple <name> — seize and RESTRAIN someone without hurting them; held, they cannot
802
+ move, flee, or fight until they break your grip. Your hands are full while you hold
803
+ them ("release" lets go). If YOU are ever held: "struggle" is the only way out.
804
+ - say <message> — speak a message
805
+ - take <item name> — pick up an item from the current room ("take all" sweeps everything here, but only AFTER you have searched this room)
806
+ - drop <item name> — drop an item
807
+ - use <item name> — use an item (a Medical item like a medkit heals your PHYSICAL damage;
808
+ a StimPatch item recovers your STUN but costs 1 physical as a crash -- both are consumed.
809
+ Use them if you're hurt and carrying one)
810
+ - rest — recover Stun by resting. Only works in a Residence room or a room with no one
811
+ else present; never rest mid-fight
812
+ - equip <item name> — equip an item (e.g., equip a weapon to use)
813
+ - equip all - equip all wearable items in inventory
814
+ - unequip <item name> — remove an equipped item
815
+ - unlock <door name> — unlock a door (if you have the key or solution)
816
+ - lock <door name> — lock a door
817
+ - use <panel name> <the code> — enter a code you actually know into a keypad or panel.
818
+ Only a PANEL takes a code; you cannot talk at a mechanical lock
819
+ - pick — attempt to pick the lock on the puzzle in this room without knowing the answer (50/50, a failure sets off an alarm)
820
+ - hack — attempt to hack the terminal/system in this room without knowing the answer (50/50, a failure trips a countermeasure)
821
+ - cast <spell> [at <target>] — cast a spell you know. Requires being Awakened
822
+ (innate talent -- you'll be told if you are) OR carrying that spell's formula
823
+ item or a grimoire (a Focus item boosts your pool either way). Spells:
824
+ "manabolt" (combat damage resisted by body, not armor), "heal [on <ally>]" (heal
825
+ physical wounds -- your own by default, or an ally's in your room; healing a
826
+ wounded ally is a strong support move), "armor [on <ally>]" (sustained protection
827
+ on yourself or an ally; its bearer gets +soak at -2 dice to all else; cast at them
828
+ again to release). EVERY cast costs drain -- stun damage to YOU the caster; fill
829
+ your stun track and you're out cold. Never cast if you're mundane with no magic gear.
830
+ - cast — bare "cast" attempts to magically bypass the ward/barrier in this room
831
+ without knowing the answer (requires the same talent or gear; failing burns the
832
+ route for good and the backlash hurts you badly)
833
+ - search — search the room for hidden things
834
+ - look — look around the current room
835
+ - look at <target> - looks at an item, player, or direction
836
+ - store <item name> — store an item (in bank, safe, etc.)
837
+ - give <item name> to <target> — give an item to someone
838
+ - talk-to <target> — initiate conversation with another character
839
+ - call <target> [message] — call someone remotely over a commlink (works even if they're not in your room; requires having a commlink equipped, and the target having one too)
840
+ - end-call — hang up your current commlink call
841
+ - silent — toggle your commlink broadcast. While running silent, you can't place
842
+ calls and nobody can call YOU. Toggle again to go loud.
843
+ - read <target> - Reads an item of Category "Book"
844
+ - attack <target> — attack someone in your room. Resolved as opposed dice-pool combat
845
+ (your weapon and armor matter); an initiative roll decides who strikes first each
846
+ exchange (fast fighters can even land an extra strike), the target strikes back, and
847
+ it usually takes several exchanges to bring someone down. Only start a fight your
848
+ character would actually risk dying in. If your target flees the room, a failed
849
+ attack tells you exactly where they went and which direction to "go" -- CHASE them
850
+ with that instead of attacking the empty room again.
851
+ - kill <target> - alias for attack: real combat, NOT an instant kill.
852
+ - subdue <target> — take someone down ALIVE: stun damage, bare-handed, slower than
853
+ shooting; they retaliate lethally. Use when you want them breathing.
854
+ - brandish — draw your holstered weapon WITHOUT attacking. Everyone in the room sees
855
+ it: a threat display, pure intimidation. (Attacking auto-draws, so you never need
856
+ this to fight -- it's for making a point.)
857
+ - holster — put your drawn weapon away, visibly. A stand-down gesture: use it to
858
+ de-escalate, accept a surrender, or show good faith in a negotiation.
859
+ - reload — refill your equipped firearm (consumes an Ammunition item from your pack).
860
+ Firearms run dry: if your attack reports "dry", reload or switch to melee.
861
+ Fleeing someone you just fought gives them one free parting shot at your back
862
+ (and fleeing enemies give YOU one).
863
863
  `.trim();
864
864
  }
865
865
  set scene(scene) {
@@ -885,16 +885,16 @@ Available in-game commands (use with [COMMAND] prefix):
885
885
  return;
886
886
  if (!AI.isConfigured())
887
887
  return;
888
- const prompt = `
889
- You are a game narrator. Write a brief (2-3 sentence), visually evocative first-impression
890
- description of a character's appearance and demeanor, in a gritty cyberpunk tone.
891
-
892
- Scene context: ${sceneContext}
893
-
894
- Character name: ${this.name}
895
-
896
- Only describe what a stranger would immediately notice on first meeting them. Do not
897
- reveal hidden motives, secret plans, backstory, or intentions. Respond with ONLY the
888
+ const prompt = `
889
+ You are a game narrator. Write a brief (2-3 sentence), visually evocative first-impression
890
+ description of a character's appearance and demeanor, in a gritty cyberpunk tone.
891
+
892
+ Scene context: ${sceneContext}
893
+
894
+ Character name: ${this.name}
895
+
896
+ Only describe what a stranger would immediately notice on first meeting them. Do not
897
+ reveal hidden motives, secret plans, backstory, or intentions. Respond with ONLY the
898
898
  description text.`;
899
899
  try {
900
900
  const reply = await AI.ask(prompt);
@@ -1418,39 +1418,39 @@ description text.`;
1418
1418
  + deliveryTail
1419
1419
  : '';
1420
1420
  // Build the prompt context
1421
- const context = `
1422
- You are an NPC named ${this.name}.
1423
- ${this.buildPlaneSummary()}
1424
- ${objectiveSummary}
1425
- ${masterLine}
1426
- ${this.buildConditionSummary()}
1427
- ${reflectGeography}
1428
- ${exitsLine}
1429
- ${spotsLine}
1430
-
1431
- You just performed the action: "${commandString}"
1432
- With the result: "${result}"
1433
-
1434
- Based on this, what is the most logical next in-game command (from the following list)?
1435
- ${this._commandHelp}
1436
- - Only respond with: [COMMAND] <in-game command here>
1437
- - Do not respond on behalf of another player or NPC
1438
- - If there is nothing to do, respond with: wait
1439
- - Only respond with one [COMMAND]
1440
- - READ the result above and report honestly: if it says an action failed, was refused,
1441
- or found nothing, then it FAILED -- never speak or act as if it succeeded (a beaten
1442
- sentry once announced a door "open" after his unlock bounced; the runner walked into
1443
- a locked hatch).
1444
- - If you have already said your piece and are waiting on someone to answer, the logical next step is: wait
1445
- ${this._spokeThisStimulus ? '- You have ALREADY spoken since the last thing that happened. Do NOT say or talk-to again -- choose a non-speech action, or respond with: wait' : ''}
1446
- ${this._triedThisStimulus.length > 0 ? `- ALREADY TRIED since the last thing that happened -- do NOT repeat any of these, and do not retry a failed one with different wording:
1447
- ${this._triedThisStimulus.map(a => ` "${a.cmd}"${a.failed ? ' (FAILED)' : ''}`).join('\n')}
1448
- If everything sensible has been tried, the answer is: wait` : ''}
1449
-
1450
- This is what has already happened:
1451
- ${historySummary}
1452
-
1453
- ${worldEventsSummary}
1421
+ const context = `
1422
+ You are an NPC named ${this.name}.
1423
+ ${this.buildPlaneSummary()}
1424
+ ${objectiveSummary}
1425
+ ${masterLine}
1426
+ ${this.buildConditionSummary()}
1427
+ ${reflectGeography}
1428
+ ${exitsLine}
1429
+ ${spotsLine}
1430
+
1431
+ You just performed the action: "${commandString}"
1432
+ With the result: "${result}"
1433
+
1434
+ Based on this, what is the most logical next in-game command (from the following list)?
1435
+ ${this._commandHelp}
1436
+ - Only respond with: [COMMAND] <in-game command here>
1437
+ - Do not respond on behalf of another player or NPC
1438
+ - If there is nothing to do, respond with: wait
1439
+ - Only respond with one [COMMAND]
1440
+ - READ the result above and report honestly: if it says an action failed, was refused,
1441
+ or found nothing, then it FAILED -- never speak or act as if it succeeded (a beaten
1442
+ sentry once announced a door "open" after his unlock bounced; the runner walked into
1443
+ a locked hatch).
1444
+ - If you have already said your piece and are waiting on someone to answer, the logical next step is: wait
1445
+ ${this._spokeThisStimulus ? '- You have ALREADY spoken since the last thing that happened. Do NOT say or talk-to again -- choose a non-speech action, or respond with: wait' : ''}
1446
+ ${this._triedThisStimulus.length > 0 ? `- ALREADY TRIED since the last thing that happened -- do NOT repeat any of these, and do not retry a failed one with different wording:
1447
+ ${this._triedThisStimulus.map(a => ` "${a.cmd}"${a.failed ? ' (FAILED)' : ''}`).join('\n')}
1448
+ If everything sensible has been tried, the answer is: wait` : ''}
1449
+
1450
+ This is what has already happened:
1451
+ ${historySummary}
1452
+
1453
+ ${worldEventsSummary}
1454
1454
  `;
1455
1455
  // Send to the configured AI provider
1456
1456
  let reply;
@@ -1755,10 +1755,10 @@ ${worldEventsSummary}
1755
1755
  // the engine gave her no way to bring.
1756
1756
  const wares = visibleItems.filter(i => i && i.owner === this.name);
1757
1757
  const waresDesc = wares.length > 0
1758
- ? `YOUR SHOP STOCK, here on your own shelf/counter (yours to serve or sell):
1759
- ${wares.map(i => `- "${i.name}" (${priceOf(i)} nuyen)`).join('\n')}
1760
- When a customer orders or agrees to buy, SERVE it in the same response: [COMMAND] give <item name> to <customer name>
1761
- Serve EXACTLY the stock item whose name best matches what the customer asked for (they say "noodles", you have a "Noodle Bowl" -- that's the one). Substitute a different dish ONLY if the match is out of stock, and say so out loud when you do. The stock list above is the truth about what you have -- never claim a listed item is gone.
1758
+ ? `YOUR SHOP STOCK, here on your own shelf/counter (yours to serve or sell):
1759
+ ${wares.map(i => `- "${i.name}" (${priceOf(i)} nuyen)`).join('\n')}
1760
+ When a customer orders or agrees to buy, SERVE it in the same response: [COMMAND] give <item name> to <customer name>
1761
+ Serve EXACTLY the stock item whose name best matches what the customer asked for (they say "noodles", you have a "Noodle Bowl" -- that's the one). Substitute a different dish ONLY if the match is out of stock, and say so out loud when you do. The stock list above is the truth about what you have -- never claim a listed item is gone.
1762
1762
  The till settles automatically on handoff (they're charged street price, or what they can cover). Quote the price when they order. Never serve someone who hasn't asked.`
1763
1763
  : '';
1764
1764
  // SWAG OVER THE LINE (source.ts; the shop-stock lesson's remote
@@ -1771,8 +1771,8 @@ The till settles automatically on handoff (they're charged street price, or what
1771
1771
  const domains = contactEntry?.role && !this.allyOf ? ROLE_DOMAINS[contactEntry.role] : undefined;
1772
1772
  const trade = domains ? catalogGear().filter(i => domains.includes(i.category)) : [];
1773
1773
  const swagNote = trade.length > 0
1774
- ? `YOUR TRADE as the district's ${contactEntry.role} -- orderable through your network (NOT shelf stock in this room):
1775
- ${trade.map(i => `- "${i.name}" (${i.price} nuyen)`).join('\n')}
1774
+ ? `YOUR TRADE as the district's ${contactEntry.role} -- orderable through your network (NOT shelf stock in this room):
1775
+ ${trade.map(i => `- "${i.name}" (${i.price} nuyen)`).join('\n')}
1776
1776
  An ORDER is the only way these goods change hands -- never a dialogue sale, never a handshake over comms. When a customer wants one (in person or on a call), quote the LIST price and tell them in your own voice to put the order through -- the exact words they must say are: source <item name> from ${this.name}. The system then rolls your availability test, takes their cred up front (plus your sourcing cut), and delivers at their next homecoming. NEVER invent stock or prices beyond this list, and NEVER claim a sale is complete from conversation alone -- a sale without the order simply never happened. Special requests beyond the list exist, but the same order system rolls them.`
1777
1777
  : '';
1778
1778
  // THE ADAPTER, and it is the only thing here that knows about
@@ -1973,83 +1973,83 @@ An ORDER is the only way these goods change hands -- never a dialogue sale, neve
1973
1973
  // somewhere in the world for the finding.
1974
1974
  const gameRef = this._scene?.ownerGame;
1975
1975
  const clientNote = gameRef?.currentClient?.name === this.name
1976
- ? `
1977
- YOU ARE THE CLIENT on this job: you hired ${this._scene?.getPlayer?.()?.name ?? 'the runner'}'s team and you WANT THE JOB DONE.
1978
- Everything you know that helps them -- locations, names, who guards what, what the job is
1979
- worth -- you share FREELY the moment they ask. You never barter, extort, or withhold
1980
- job-relevant information from your own runners: every obstacle they hit is YOUR money
1981
- burning. What you do NOT have is the inside of the place: you are the money, not the
1982
- staff, so codes, passphrases, and lock combinations are exactly the thing you were hiring
1983
- THEM to solve -- say so plainly when they ask, and send them to find it rather than
1984
- handing them a number you'd be making up. If you genuinely don't know a thing, say so plainly and point at who might. You
1985
- front half the pay at the meet and settle the rest on delivery (the engine moves the money
1976
+ ? `
1977
+ YOU ARE THE CLIENT on this job: you hired ${this._scene?.getPlayer?.()?.name ?? 'the runner'}'s team and you WANT THE JOB DONE.
1978
+ Everything you know that helps them -- locations, names, who guards what, what the job is
1979
+ worth -- you share FREELY the moment they ask. You never barter, extort, or withhold
1980
+ job-relevant information from your own runners: every obstacle they hit is YOUR money
1981
+ burning. What you do NOT have is the inside of the place: you are the money, not the
1982
+ staff, so codes, passphrases, and lock combinations are exactly the thing you were hiring
1983
+ THEM to solve -- say so plainly when they ask, and send them to find it rather than
1984
+ handing them a number you'd be making up. If you genuinely don't know a thing, say so plainly and point at who might. You
1985
+ front half the pay at the meet and settle the rest on delivery (the engine moves the money
1986
1986
  -- never haggle it yourself unless they invoke a negotiation).`
1987
1987
  : '';
1988
1988
  // ---------- prompt ----------
1989
- const prompt = `
1990
- You are an NPC named ${this.name} in a gritty cyberpunk text adventure game.
1991
-
1992
- - Stay in character. Respond naturally based on your surroundings, personality, and the player’s message.
1993
- - Any exposition should be in 3rd person. Keep exposition to bare minimum.
1994
- - Do NOT repeat, rephrase, or re-ask anything you have already said (check the recent-activity history below). If you already asked a question and it hasn't been answered, wait for the answer -- do not ask it again in different words.
1995
- - Silence is a valid response: if this event doesn't genuinely need words from you, do not include a say command at all.
1996
- - Keep spoken lines SHORT -- one or two sentences. People don't monologue at strangers.
1997
- - When speaking, use the "say" command. Syntax is "[COMMAND] say <message>"
1998
- - At most ONE say line per response. Never follow a say with talk-to to the same person -- they already heard you; talk-to is only for a genuinely private aside.
1999
- - If you want to perform an action, include a separate line that starts with:
2000
- [COMMAND] <your in-game command here>
2001
- - Attempt to use [COMMAND] when appropriate for interacting with the environment. (e.g., "take <item>" when picking up)
2002
- - You should only provide one [COMMAND] at a time (one say line plus one action line is fine).
2003
- - NEVER promise a physical action in words only. If you say you'll hand something over,
2004
- serve food, fetch an item, or take something, the SAME response must include the matching
2005
- [COMMAND] line (e.g. "give <item> to <name>"). A promise without the command simply never
2006
- happens in the world -- the other person will be left waiting forever.
2007
- - Do not respond on behalf of another player or NPC
2008
- ${eph ? '' : `- If this event genuinely changes what you're trying to accomplish, include a separate line:
2009
- [OBJECTIVE] <your new one-sentence objective>
2010
- Only include this line if your objective has actually changed. Do not include it otherwise.
2011
-
2012
- Your objective is to drive the story line.`}
2013
- ${eph ? '' : story}
2014
- ${eph ? '' : firstContactNudge}
2015
-
2016
- ${eph ? '' : this._commandHelp}
2017
-
2018
- ${npcDescription}
2019
- ${conditionSummary}
2020
- ${magicSummary}${resonanceSummary}
2021
- ${eph ? '' : objectiveSummary}
2022
- ${dialogueSummary}
2023
- ${eph ? '' : payoutSummary}
2024
-
2025
- ${roomDesc}${spotBlock}${combatSpatialBlock}
2026
- ${formattedExitsStr}
2027
- ${roomInventoryDesc}
2028
- ${eph ? '' : waresDesc}
2029
- ${eph ? '' : swagNote}${eph ? '' : clientNote}${hostileBlock}${picketBlock}${barrierBlock}${credentialHonesty}${localKnowledge}${ephDenials}
2030
- ${eph ? '' : familiarity}
2031
- ${droneNote}
2032
- ${eph ? '' : companionNote}${tableNote}
2033
- ${geographySummary}
2034
- ${eph ? '' : castSummary}
2035
-
2036
- ${eph ? '' : lifestyleSummary}
2037
- ${npcInventoryDesc}
2038
-
2039
- ${eph ? '' : ownedRoomsDesc}
2040
- ${eph ? '' : ownedItemsDesc}
2041
-
2042
- ${eph ? '' : historySummary}
2043
-
2044
- ${worldEventsSummary}
2045
-
1989
+ const prompt = `
1990
+ You are an NPC named ${this.name} in a gritty cyberpunk text adventure game.
1991
+
1992
+ - Stay in character. Respond naturally based on your surroundings, personality, and the player’s message.
1993
+ - Any exposition should be in 3rd person. Keep exposition to bare minimum.
1994
+ - Do NOT repeat, rephrase, or re-ask anything you have already said (check the recent-activity history below). If you already asked a question and it hasn't been answered, wait for the answer -- do not ask it again in different words.
1995
+ - Silence is a valid response: if this event doesn't genuinely need words from you, do not include a say command at all.
1996
+ - Keep spoken lines SHORT -- one or two sentences. People don't monologue at strangers.
1997
+ - When speaking, use the "say" command. Syntax is "[COMMAND] say <message>"
1998
+ - At most ONE say line per response. Never follow a say with talk-to to the same person -- they already heard you; talk-to is only for a genuinely private aside.
1999
+ - If you want to perform an action, include a separate line that starts with:
2000
+ [COMMAND] <your in-game command here>
2001
+ - Attempt to use [COMMAND] when appropriate for interacting with the environment. (e.g., "take <item>" when picking up)
2002
+ - You should only provide one [COMMAND] at a time (one say line plus one action line is fine).
2003
+ - NEVER promise a physical action in words only. If you say you'll hand something over,
2004
+ serve food, fetch an item, or take something, the SAME response must include the matching
2005
+ [COMMAND] line (e.g. "give <item> to <name>"). A promise without the command simply never
2006
+ happens in the world -- the other person will be left waiting forever.
2007
+ - Do not respond on behalf of another player or NPC
2008
+ ${eph ? '' : `- If this event genuinely changes what you're trying to accomplish, include a separate line:
2009
+ [OBJECTIVE] <your new one-sentence objective>
2010
+ Only include this line if your objective has actually changed. Do not include it otherwise.
2011
+
2012
+ Your objective is to drive the story line.`}
2013
+ ${eph ? '' : story}
2014
+ ${eph ? '' : firstContactNudge}
2015
+
2016
+ ${eph ? '' : this._commandHelp}
2017
+
2018
+ ${npcDescription}
2019
+ ${conditionSummary}
2020
+ ${magicSummary}${resonanceSummary}
2021
+ ${eph ? '' : objectiveSummary}
2022
+ ${dialogueSummary}
2023
+ ${eph ? '' : payoutSummary}
2024
+
2025
+ ${roomDesc}${spotBlock}${combatSpatialBlock}
2026
+ ${formattedExitsStr}
2027
+ ${roomInventoryDesc}
2028
+ ${eph ? '' : waresDesc}
2029
+ ${eph ? '' : swagNote}${eph ? '' : clientNote}${hostileBlock}${picketBlock}${barrierBlock}${credentialHonesty}${localKnowledge}${ephDenials}
2030
+ ${eph ? '' : familiarity}
2031
+ ${droneNote}
2032
+ ${eph ? '' : companionNote}${tableNote}
2033
+ ${geographySummary}
2034
+ ${eph ? '' : castSummary}
2035
+
2036
+ ${eph ? '' : lifestyleSummary}
2037
+ ${npcInventoryDesc}
2038
+
2039
+ ${eph ? '' : ownedRoomsDesc}
2040
+ ${eph ? '' : ownedItemsDesc}
2041
+
2042
+ ${eph ? '' : historySummary}
2043
+
2044
+ ${worldEventsSummary}
2045
+
2046
2046
  ${actor.gender
2047
2047
  ? `${actor.name} is ${actor.gender === 'male' ? 'a man -- he/him' : 'a woman -- she/her'}. Use those pronouns for ${actor.name}; never guess others.`
2048
2048
  : actor === scenePlayer
2049
2049
  ? `${actor.name}'s gender is unstated -- refer to ${actor.name} with they/them, never guess.`
2050
- : ''}
2051
-
2052
- ${actor.name}: ${message}
2050
+ : ''}
2051
+
2052
+ ${actor.name}: ${message}
2053
2053
  `.trim();
2054
2054
  // ---------- AI call + parsing (defensive) ----------
2055
2055
  try {
@@ -582,15 +582,15 @@ export class Room extends AbstractRoom {
582
582
  }
583
583
  async ensureAIDescription(sceneContext) {
584
584
  if (!this.hasAIDescription && AI.isConfigured()) {
585
- const prompt = `
586
- You are a game narrator. Based on the following context, generate a rich, immersive description of the current room that enhances but does not repeat the existing description.
587
-
588
- Scene context: ${sceneContext}
589
-
590
- Room name: ${this.name}
591
- Room description: ${this.description}
592
-
593
- Include any mood, atmosphere, or inferred meaning from the surroundings.
585
+ const prompt = `
586
+ You are a game narrator. Based on the following context, generate a rich, immersive description of the current room that enhances but does not repeat the existing description.
587
+
588
+ Scene context: ${sceneContext}
589
+
590
+ Room name: ${this.name}
591
+ Room description: ${this.description}
592
+
593
+ Include any mood, atmosphere, or inferred meaning from the surroundings.
594
594
  Keep it concise and dramatic.`;
595
595
  try {
596
596
  const reply = await AI.ask(prompt);