neotoma 0.11.0 → 0.11.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 (212) hide show
  1. package/dist/actions.d.ts +4 -10
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +34 -18
  4. package/dist/actions.js.map +1 -1
  5. package/dist/cli/bootstrap.js +0 -0
  6. package/dist/services/root_landing/index.d.ts.map +1 -1
  7. package/dist/services/root_landing/index.js +32 -9
  8. package/dist/services/root_landing/index.js.map +1 -1
  9. package/package.json +1 -1
  10. package/dist/cli/auth_keygen.d.ts +0 -11
  11. package/dist/cli/auth_keygen.d.ts.map +0 -1
  12. package/dist/cli/auth_keygen.js +0 -110
  13. package/dist/cli/auth_keygen.js.map +0 -1
  14. package/dist/cli/packs.d.ts +0 -15
  15. package/dist/cli/packs.d.ts.map +0 -1
  16. package/dist/cli/packs.js +0 -156
  17. package/dist/cli/packs.js.map +0 -1
  18. package/dist/inspector/assets/Combination-C22tNG3c.js +0 -41
  19. package/dist/inspector/assets/agent_badge-ihPeARQV.js +0 -1
  20. package/dist/inspector/assets/agent_detail-BtdIGuk2.js +0 -1
  21. package/dist/inspector/assets/agent_filter-L0NhixFq.js +0 -1
  22. package/dist/inspector/assets/agent_grant_detail-DOfwRmj4.js +0 -1
  23. package/dist/inspector/assets/agent_grant_form-D-_IJrLI.js +0 -1
  24. package/dist/inspector/assets/agent_grants-BkUTzkwq.js +0 -1
  25. package/dist/inspector/assets/agents-C8qGnNCU.js +0 -1
  26. package/dist/inspector/assets/arrow-left-C5PI116n.js +0 -6
  27. package/dist/inspector/assets/attribution_card-BKw4xb01.js +0 -1
  28. package/dist/inspector/assets/attribution_summary-S6yX8918.js +0 -1
  29. package/dist/inspector/assets/card-BKx8ifPf.js +0 -1
  30. package/dist/inspector/assets/check-D7bS4rbb.js +0 -6
  31. package/dist/inspector/assets/checkbox-BE774kci.js +0 -1
  32. package/dist/inspector/assets/chevron-down-DWeHLqJP.js +0 -6
  33. package/dist/inspector/assets/chevron-right-D-MVwNt0.js +0 -6
  34. package/dist/inspector/assets/compliance-DIVlTxir.js +0 -1
  35. package/dist/inspector/assets/confirm-dialog-DZ91UiLx.js +0 -6
  36. package/dist/inspector/assets/conversation_common-B9QrB_mG.js +0 -1
  37. package/dist/inspector/assets/conversation_detail-BX-DgWqj.js +0 -1
  38. package/dist/inspector/assets/copy_id_button-DbNXOvuH.js +0 -6
  39. package/dist/inspector/assets/corrections-UTXmEFqm.js +0 -1
  40. package/dist/inspector/assets/dashboard-D7o1n0lS.js +0 -73
  41. package/dist/inspector/assets/data-table-DFBYvAjA.js +0 -22
  42. package/dist/inspector/assets/dialog-DE3AWlG_.js +0 -10
  43. package/dist/inspector/assets/dropdown-menu-BVwBx2B7.js +0 -6
  44. package/dist/inspector/assets/entities-i3yWeDP0.js +0 -1
  45. package/dist/inspector/assets/entity_detail-BJNaEXGZ.js +0 -17
  46. package/dist/inspector/assets/entity_link-JLwqX81Y.js +0 -1
  47. package/dist/inspector/assets/external-link-BK31dJyN.js +0 -6
  48. package/dist/inspector/assets/feedback-COEQSnd9.js +0 -45
  49. package/dist/inspector/assets/feedback_admin-CJnr7E0r.js +0 -6
  50. package/dist/inspector/assets/feedback_admin_unlock-BxcDo5G7.js +0 -6
  51. package/dist/inspector/assets/graph_explorer-BZV40eAE.css +0 -1
  52. package/dist/inspector/assets/graph_explorer-O8YY1xwo.js +0 -23
  53. package/dist/inspector/assets/index-BKbdoU0r.js +0 -1
  54. package/dist/inspector/assets/index-Bb004UmS.js +0 -1
  55. package/dist/inspector/assets/index-BgQagyt9.css +0 -1
  56. package/dist/inspector/assets/index-CisbTUN-.js +0 -1
  57. package/dist/inspector/assets/index-DZyW9wwm.js +0 -224
  58. package/dist/inspector/assets/interpretations-Bz1Jx0gm.js +0 -1
  59. package/dist/inspector/assets/interpretations-D0k7qwZ6.js +0 -1
  60. package/dist/inspector/assets/json_viewer-1-geEBU4.js +0 -1
  61. package/dist/inspector/assets/label-DK8No7os.js +0 -1
  62. package/dist/inspector/assets/live_relative_time-Ca29xr4q.js +0 -1
  63. package/dist/inspector/assets/observations-BEYPLgsw.js +0 -1
  64. package/dist/inspector/assets/page_shell-Z_K8-xVN.js +0 -1
  65. package/dist/inspector/assets/pagination-55slcMsJ.js +0 -6
  66. package/dist/inspector/assets/pdf.worker.min-yatZIOMy.mjs +0 -21
  67. package/dist/inspector/assets/plus-Df5osCTJ.js +0 -6
  68. package/dist/inspector/assets/query_loading-BFETHugg.js +0 -1
  69. package/dist/inspector/assets/query_refresh_indicator-B2ayQ-9R.js +0 -1
  70. package/dist/inspector/assets/recent_activity-D4P724bj.js +0 -11
  71. package/dist/inspector/assets/recent_conversations-B-iJ9x-v.js +0 -1
  72. package/dist/inspector/assets/recent_conversations-BXAUdAC5.js +0 -1
  73. package/dist/inspector/assets/recent_records_feed-Bm8kGd63.js +0 -1
  74. package/dist/inspector/assets/relationship_detail-BMhsfgCR.js +0 -1
  75. package/dist/inspector/assets/relationships-BphnuyTR.js +0 -1
  76. package/dist/inspector/assets/relationships-DBLA0hRd.js +0 -1
  77. package/dist/inspector/assets/sandbox-BWLbx8xY.js +0 -1
  78. package/dist/inspector/assets/schema_detail-Den0dtKn.js +0 -11
  79. package/dist/inspector/assets/schemas-CZNE7ILQ.js +0 -5
  80. package/dist/inspector/assets/search-BpeIvjlx.js +0 -1
  81. package/dist/inspector/assets/select-vjNrYLub.js +0 -6
  82. package/dist/inspector/assets/settings-Db5j2L-M.js +0 -1
  83. package/dist/inspector/assets/source_detail-DAAnuO9d.js +0 -17
  84. package/dist/inspector/assets/source_link-B3bG6OoM.js +0 -1
  85. package/dist/inspector/assets/sources-CqJaDvnU.js +0 -9
  86. package/dist/inspector/assets/switch-N1yvDIln.js +0 -1
  87. package/dist/inspector/assets/tabs-DDLnWpd7.js +0 -1
  88. package/dist/inspector/assets/textarea-DwpRHIdg.js +0 -1
  89. package/dist/inspector/assets/timeline-DGZTAraG.js +0 -1
  90. package/dist/inspector/assets/timeline-DgfkLScO.js +0 -1
  91. package/dist/inspector/assets/timeline_event_detail-GKr9VYPf.js +0 -1
  92. package/dist/inspector/assets/trash-2-aTmwwD61.js +0 -6
  93. package/dist/inspector/assets/turn_detail-DJi1gGc5.js +0 -1
  94. package/dist/inspector/assets/turns-oYp0HVIa.js +0 -1
  95. package/dist/inspector/assets/use_agents-GiTdp_mh.js +0 -1
  96. package/dist/inspector/assets/use_entities-CTSlt7S0.js +0 -1
  97. package/dist/inspector/assets/use_interpretations-DUaKZMXF.js +0 -1
  98. package/dist/inspector/assets/use_mutations-XlZmJD0t.js +0 -1
  99. package/dist/inspector/assets/use_recent_conversations-vxIe2glX.js +0 -1
  100. package/dist/inspector/assets/use_relationships-Ct8x9Wl7.js +0 -1
  101. package/dist/inspector/assets/use_schemas-DI772015.js +0 -1
  102. package/dist/inspector/assets/use_sources-BSwgjmqJ.js +0 -1
  103. package/dist/inspector/assets/use_stats--S9rYQbr.js +0 -1
  104. package/dist/inspector/assets/use_timeline-XjpDP_2Y.js +0 -1
  105. package/dist/inspector/assets/use_turns-DnqJYe1l.js +0 -1
  106. package/dist/inspector/assets/value-BTdN53H7.js +0 -1
  107. package/dist/inspector/favicon.svg +0 -10
  108. package/dist/inspector/index.html +0 -14
  109. package/dist/services/activation/stage_zero_five.d.ts +0 -62
  110. package/dist/services/activation/stage_zero_five.d.ts.map +0 -1
  111. package/dist/services/activation/stage_zero_five.js +0 -126
  112. package/dist/services/activation/stage_zero_five.js.map +0 -1
  113. package/dist/services/activation/user_preference.d.ts +0 -110
  114. package/dist/services/activation/user_preference.d.ts.map +0 -1
  115. package/dist/services/activation/user_preference.js +0 -98
  116. package/dist/services/activation/user_preference.js.map +0 -1
  117. package/dist/services/activation/vertical_detection.d.ts +0 -78
  118. package/dist/services/activation/vertical_detection.d.ts.map +0 -1
  119. package/dist/services/activation/vertical_detection.js +0 -219
  120. package/dist/services/activation/vertical_detection.js.map +0 -1
  121. package/dist/services/bundled_pages/html_shell.d.ts +0 -118
  122. package/dist/services/bundled_pages/html_shell.d.ts.map +0 -1
  123. package/dist/services/bundled_pages/html_shell.js +0 -242
  124. package/dist/services/bundled_pages/html_shell.js.map +0 -1
  125. package/dist/services/bundled_pages/tokens.d.ts +0 -496
  126. package/dist/services/bundled_pages/tokens.d.ts.map +0 -1
  127. package/dist/services/bundled_pages/tokens.js +0 -261
  128. package/dist/services/bundled_pages/tokens.js.map +0 -1
  129. package/dist/services/compliance/alerting.d.ts +0 -123
  130. package/dist/services/compliance/alerting.d.ts.map +0 -1
  131. package/dist/services/compliance/alerting.js +0 -169
  132. package/dist/services/compliance/alerting.js.map +0 -1
  133. package/dist/services/compliance/historical_backfill.d.ts +0 -74
  134. package/dist/services/compliance/historical_backfill.d.ts.map +0 -1
  135. package/dist/services/compliance/historical_backfill.js +0 -244
  136. package/dist/services/compliance/historical_backfill.js.map +0 -1
  137. package/dist/services/compliance/renderer.d.ts +0 -21
  138. package/dist/services/compliance/renderer.d.ts.map +0 -1
  139. package/dist/services/compliance/renderer.js +0 -208
  140. package/dist/services/compliance/renderer.js.map +0 -1
  141. package/dist/services/compliance/routes.d.ts +0 -55
  142. package/dist/services/compliance/routes.d.ts.map +0 -1
  143. package/dist/services/compliance/routes.js +0 -212
  144. package/dist/services/compliance/routes.js.map +0 -1
  145. package/dist/services/docs_bundle/frontmatter.d.ts +0 -26
  146. package/dist/services/docs_bundle/frontmatter.d.ts.map +0 -1
  147. package/dist/services/docs_bundle/frontmatter.js +0 -50
  148. package/dist/services/docs_bundle/frontmatter.js.map +0 -1
  149. package/dist/services/docs_bundle/loader.d.ts +0 -28
  150. package/dist/services/docs_bundle/loader.d.ts.map +0 -1
  151. package/dist/services/docs_bundle/loader.js +0 -91
  152. package/dist/services/docs_bundle/loader.js.map +0 -1
  153. package/dist/services/docs_bundle/render_html.d.ts +0 -15
  154. package/dist/services/docs_bundle/render_html.d.ts.map +0 -1
  155. package/dist/services/docs_bundle/render_html.js +0 -48
  156. package/dist/services/docs_bundle/render_html.js.map +0 -1
  157. package/dist/services/docs_bundle/types.d.ts +0 -73
  158. package/dist/services/docs_bundle/types.d.ts.map +0 -1
  159. package/dist/services/docs_bundle/types.js +0 -50
  160. package/dist/services/docs_bundle/types.js.map +0 -1
  161. package/dist/services/docs_install/loader.d.ts +0 -25
  162. package/dist/services/docs_install/loader.d.ts.map +0 -1
  163. package/dist/services/docs_install/loader.js +0 -63
  164. package/dist/services/docs_install/loader.js.map +0 -1
  165. package/dist/services/docs_install/renderer.d.ts +0 -40
  166. package/dist/services/docs_install/renderer.d.ts.map +0 -1
  167. package/dist/services/docs_install/renderer.js +0 -323
  168. package/dist/services/docs_install/renderer.js.map +0 -1
  169. package/dist/services/docs_install/routes.d.ts +0 -20
  170. package/dist/services/docs_install/routes.d.ts.map +0 -1
  171. package/dist/services/docs_install/routes.js +0 -117
  172. package/dist/services/docs_install/routes.js.map +0 -1
  173. package/dist/services/oauth_pages/render.d.ts +0 -25
  174. package/dist/services/oauth_pages/render.d.ts.map +0 -1
  175. package/dist/services/oauth_pages/render.js +0 -235
  176. package/dist/services/oauth_pages/render.js.map +0 -1
  177. package/dist/services/root_landing/auth_overview.d.ts +0 -60
  178. package/dist/services/root_landing/auth_overview.d.ts.map +0 -1
  179. package/dist/services/root_landing/auth_overview.js +0 -86
  180. package/dist/services/root_landing/auth_overview.js.map +0 -1
  181. package/dist/services/root_landing/cli_overview.d.ts +0 -34
  182. package/dist/services/root_landing/cli_overview.d.ts.map +0 -1
  183. package/dist/services/root_landing/cli_overview.js +0 -123
  184. package/dist/services/root_landing/cli_overview.js.map +0 -1
  185. package/dist/services/root_landing/http_api_overview.d.ts +0 -34
  186. package/dist/services/root_landing/http_api_overview.d.ts.map +0 -1
  187. package/dist/services/root_landing/http_api_overview.js +0 -110
  188. package/dist/services/root_landing/http_api_overview.js.map +0 -1
  189. package/dist/services/root_landing/mcp_overview.d.ts +0 -34
  190. package/dist/services/root_landing/mcp_overview.d.ts.map +0 -1
  191. package/dist/services/root_landing/mcp_overview.js +0 -133
  192. package/dist/services/root_landing/mcp_overview.js.map +0 -1
  193. package/dist/services/sandbox/inspector_redirect.d.ts +0 -41
  194. package/dist/services/sandbox/inspector_redirect.d.ts.map +0 -1
  195. package/dist/services/sandbox/inspector_redirect.js +0 -59
  196. package/dist/services/sandbox/inspector_redirect.js.map +0 -1
  197. package/dist/services/verticals/baseline_metadata.d.ts +0 -39
  198. package/dist/services/verticals/baseline_metadata.d.ts.map +0 -1
  199. package/dist/services/verticals/baseline_metadata.js +0 -394
  200. package/dist/services/verticals/baseline_metadata.js.map +0 -1
  201. package/dist/services/verticals/entity_type_registry.d.ts +0 -29
  202. package/dist/services/verticals/entity_type_registry.d.ts.map +0 -1
  203. package/dist/services/verticals/entity_type_registry.js +0 -169
  204. package/dist/services/verticals/entity_type_registry.js.map +0 -1
  205. package/dist/services/verticals/install.d.ts +0 -64
  206. package/dist/services/verticals/install.d.ts.map +0 -1
  207. package/dist/services/verticals/install.js +0 -262
  208. package/dist/services/verticals/install.js.map +0 -1
  209. package/dist/services/verticals/registry.d.ts +0 -131
  210. package/dist/services/verticals/registry.d.ts.map +0 -1
  211. package/dist/services/verticals/registry.js +0 -457
  212. package/dist/services/verticals/registry.js.map +0 -1
package/dist/actions.d.ts CHANGED
@@ -2,17 +2,11 @@ import express from "express";
2
2
  import { type StoreInterpretationInput } from "./shared/action_schemas.js";
3
3
  export declare const app: import("express-serve-static-core").Express;
4
4
  /**
5
- * True when the request arrived over a loopback socket.
5
+ * True when the request is genuinely local to this process.
6
6
  *
7
- * SECURITY: derived from the TCP socket's remote address, NOT the `Host`
8
- * header. `req.headers.host` is attacker-controlled; using it to gate
9
- * authentication / auto-approval produces a trivial bypass when the server is
10
- * bound to a non-loopback interface. We check `req.socket.remoteAddress`
11
- * directly so spoofed `Host: localhost` headers do not promote a remote
12
- * caller into the local-dev trust zone.
13
- *
14
- * Express's `req.ip` is also unsafe here because `trust proxy` honours the
15
- * X-Forwarded-For header — any caller can claim to be loopback.
7
+ * SECURITY: a same-host reverse proxy (Caddy, nginx, Cloudflare tunnel, etc.)
8
+ * connects to Node over loopback even for public internet callers. In
9
+ * production, loopback alone is therefore not enough to grant local-dev auth.
16
10
  */
17
11
  export declare function isLocalRequest(req: express.Request): boolean;
18
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AA4G9B,OAAO,EAyBL,KAAK,wBAAwB,EAE9B,MAAM,4BAA4B,CAAC;AA+BpC,eAAO,MAAM,GAAG,6CAAY,CAAC;AAygB7B;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAU5D;AA4PD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAmBhD;AAiyHD,KAAK,oBAAoB,GAAG;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAuDF,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,4BAA4B,EAAE,iBAAiB,CAAC;IAC3E,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACvC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;;;;;;;;;;;;;cA+gBS,MAAM;gBACJ,MAAM;2BACK,MAAM;qBACZ,MAAM;mBACR,MAAM;wBACD,MAAM;uBACP,MAAM;;;;;mBA3JV,MAAM;qBACJ,MAAM;wBACH,MAAM,GAAG,IAAI;2BACV,MAAM;;wBAET,MAAM;uBACP,MAAM,EAAE;wBACP,MAAM;uBACP,MAAM;;kBA9NX,MAAM;oBACJ,MAAM;yBACD,MAAM;4BACH,MAAM;2BACP,MAAM;;+BA4NF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;;;2BAkFlC,MAAM;0BACP,MAAM;0BACN,MAAM;;;;;;;;GAsG3B;AAmhED,wBAAsB,eAAe;;;eA8FpC"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AA4G9B,OAAO,EAyBL,KAAK,wBAAwB,EAE9B,MAAM,4BAA4B,CAAC;AA+BpC,eAAO,MAAM,GAAG,6CAAY,CAAC;AAiiB7B;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAa5D;AA4PD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAmBhD;AAiyHD,KAAK,oBAAoB,GAAG;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAuDF,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,4BAA4B,EAAE,iBAAiB,CAAC;IAC3E,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACvC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;;;;;;;;;;;;;cA+gBS,MAAM;gBACJ,MAAM;2BACK,MAAM;qBACZ,MAAM;mBACR,MAAM;wBACD,MAAM;uBACP,MAAM;;;;;mBA3JV,MAAM;qBACJ,MAAM;wBACH,MAAM,GAAG,IAAI;2BACV,MAAM;;wBAET,MAAM;uBACP,MAAM,EAAE;wBACP,MAAM;uBACP,MAAM;;kBA9NX,MAAM;oBACJ,MAAM;yBACD,MAAM;4BACH,MAAM;2BACP,MAAM;;+BA4NF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;;;2BAkFlC,MAAM;0BACP,MAAM;0BACN,MAAM;;;;;;;;GAsG3B;AAmhED,wBAAsB,eAAe;;;eA8FpC"}
package/dist/actions.js CHANGED
@@ -522,34 +522,50 @@ app.get("/mcp-interaction-instructions", (_req, res) => {
522
522
  const mcpTransports = new Map();
523
523
  // Store server instances by session ID to preserve authentication state
524
524
  const mcpServerInstances = new Map();
525
- /**
526
- * True when the request arrived over a loopback socket.
527
- *
528
- * SECURITY: derived from the TCP socket's remote address, NOT the `Host`
529
- * header. `req.headers.host` is attacker-controlled; using it to gate
530
- * authentication / auto-approval produces a trivial bypass when the server is
531
- * bound to a non-loopback interface. We check `req.socket.remoteAddress`
532
- * directly so spoofed `Host: localhost` headers do not promote a remote
533
- * caller into the local-dev trust zone.
534
- *
535
- * Express's `req.ip` is also unsafe here because `trust proxy` honours the
536
- * X-Forwarded-For header — any caller can claim to be loopback.
537
- */
538
- export function isLocalRequest(req) {
539
- const remote = (req.socket?.remoteAddress || "").toLowerCase();
525
+ function isLoopbackAddress(value) {
526
+ const remote = (value || "").trim().toLowerCase();
540
527
  if (!remote)
541
528
  return false;
542
- // Unix-domain socket requests have no remote address; treat as non-local.
543
529
  if (remote === "127.0.0.1" || remote === "::1")
544
530
  return true;
545
- // IPv4 loopback range (127.0.0.0/8)
546
531
  if (remote.startsWith("127."))
547
532
  return true;
548
- // IPv4-mapped IPv6 loopback (e.g. ::ffff:127.0.0.1)
549
533
  if (remote.startsWith("::ffff:127."))
550
534
  return true;
551
535
  return false;
552
536
  }
537
+ function forwardedForValues(req) {
538
+ const headers = req.headers || {};
539
+ const raw = headers["x-forwarded-for"] || headers["X-Forwarded-For"];
540
+ const values = Array.isArray(raw) ? raw : raw ? [raw] : [];
541
+ return values
542
+ .flatMap((value) => String(value).split(","))
543
+ .map((value) => value.trim())
544
+ .filter(Boolean);
545
+ }
546
+ function isProductionEnvironment(env = process.env) {
547
+ const value = (env.NEOTOMA_ENV || "development").trim().toLowerCase();
548
+ return value === "production" || value === "prod";
549
+ }
550
+ /**
551
+ * True when the request is genuinely local to this process.
552
+ *
553
+ * SECURITY: a same-host reverse proxy (Caddy, nginx, Cloudflare tunnel, etc.)
554
+ * connects to Node over loopback even for public internet callers. In
555
+ * production, loopback alone is therefore not enough to grant local-dev auth.
556
+ */
557
+ export function isLocalRequest(req) {
558
+ if (!isLoopbackAddress(req.socket?.remoteAddress))
559
+ return false;
560
+ const forwardedFor = forwardedForValues(req);
561
+ if (forwardedFor.length > 0) {
562
+ return forwardedFor.every(isLoopbackAddress);
563
+ }
564
+ if (isProductionEnvironment() && process.env.NEOTOMA_TRUST_PROD_LOOPBACK === "1") {
565
+ return true;
566
+ }
567
+ return !isProductionEnvironment();
568
+ }
553
569
  const OAUTH_KEY_SESSION_COOKIE = "neotoma_oauth_key_session";
554
570
  const oauthKeySessions = new OAuthKeySessionStore();
555
571
  function readCookie(req, name) {