neotoma 0.3.10 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +94 -56
  2. package/dist/actions.d.ts +5 -2
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +859 -523
  5. package/dist/actions.js.map +1 -1
  6. package/dist/cli/discovery.d.ts +36 -0
  7. package/dist/cli/discovery.d.ts.map +1 -0
  8. package/dist/cli/discovery.js +368 -0
  9. package/dist/cli/discovery.js.map +1 -0
  10. package/dist/cli/index.d.ts +6 -0
  11. package/dist/cli/index.d.ts.map +1 -1
  12. package/dist/cli/index.js +383 -232
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/cli/transcript_parser.d.ts +39 -0
  15. package/dist/cli/transcript_parser.d.ts.map +1 -0
  16. package/dist/cli/transcript_parser.js +395 -0
  17. package/dist/cli/transcript_parser.js.map +1 -0
  18. package/dist/config.d.ts +1 -0
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +12 -2
  21. package/dist/config.js.map +1 -1
  22. package/dist/reducers/observation_reducer.d.ts.map +1 -1
  23. package/dist/reducers/observation_reducer.js +9 -2
  24. package/dist/reducers/observation_reducer.js.map +1 -1
  25. package/dist/repositories/sqlite/local_db_adapter.d.ts.map +1 -1
  26. package/dist/repositories/sqlite/local_db_adapter.js +12 -0
  27. package/dist/repositories/sqlite/local_db_adapter.js.map +1 -1
  28. package/dist/server.d.ts +20 -4
  29. package/dist/server.d.ts.map +1 -1
  30. package/dist/server.js +551 -1003
  31. package/dist/server.js.map +1 -1
  32. package/dist/services/entity_queries.d.ts +6 -0
  33. package/dist/services/entity_queries.d.ts.map +1 -1
  34. package/dist/services/entity_queries.js +200 -68
  35. package/dist/services/entity_queries.js.map +1 -1
  36. package/dist/services/entity_resolution.d.ts +13 -1
  37. package/dist/services/entity_resolution.d.ts.map +1 -1
  38. package/dist/services/entity_resolution.js +56 -6
  39. package/dist/services/entity_resolution.js.map +1 -1
  40. package/dist/services/entity_semantic_search.js +2 -2
  41. package/dist/services/entity_semantic_search.js.map +1 -1
  42. package/dist/services/interpretation.d.ts +0 -2
  43. package/dist/services/interpretation.d.ts.map +1 -1
  44. package/dist/services/interpretation.js +11 -6
  45. package/dist/services/interpretation.js.map +1 -1
  46. package/dist/services/local_entity_embedding.d.ts +4 -1
  47. package/dist/services/local_entity_embedding.d.ts.map +1 -1
  48. package/dist/services/local_entity_embedding.js +3 -3
  49. package/dist/services/local_entity_embedding.js.map +1 -1
  50. package/dist/services/mcp_oauth.d.ts +12 -2
  51. package/dist/services/mcp_oauth.d.ts.map +1 -1
  52. package/dist/services/mcp_oauth.js +50 -10
  53. package/dist/services/mcp_oauth.js.map +1 -1
  54. package/dist/services/oauth_key_gate.d.ts +1 -0
  55. package/dist/services/oauth_key_gate.d.ts.map +1 -1
  56. package/dist/services/oauth_key_gate.js +16 -0
  57. package/dist/services/oauth_key_gate.js.map +1 -1
  58. package/dist/services/observation_source_label.d.ts +19 -0
  59. package/dist/services/observation_source_label.d.ts.map +1 -0
  60. package/dist/services/observation_source_label.js +98 -0
  61. package/dist/services/observation_source_label.js.map +1 -0
  62. package/dist/services/schema_registry.d.ts +1 -0
  63. package/dist/services/schema_registry.d.ts.map +1 -1
  64. package/dist/services/schema_registry.js +18 -0
  65. package/dist/services/schema_registry.js.map +1 -1
  66. package/dist/services/snapshot_computation.d.ts.map +1 -1
  67. package/dist/services/snapshot_computation.js +13 -0
  68. package/dist/services/snapshot_computation.js.map +1 -1
  69. package/dist/services/timeline_events.d.ts +23 -6
  70. package/dist/services/timeline_events.d.ts.map +1 -1
  71. package/dist/services/timeline_events.js +81 -18
  72. package/dist/services/timeline_events.js.map +1 -1
  73. package/dist/shared/action_handlers/entity_handlers.d.ts +8 -0
  74. package/dist/shared/action_handlers/entity_handlers.d.ts.map +1 -1
  75. package/dist/shared/action_handlers/entity_handlers.js +194 -9
  76. package/dist/shared/action_handlers/entity_handlers.js.map +1 -1
  77. package/dist/shared/action_handlers/entity_identifier_handler.d.ts +19 -0
  78. package/dist/shared/action_handlers/entity_identifier_handler.d.ts.map +1 -0
  79. package/dist/shared/action_handlers/entity_identifier_handler.js +82 -0
  80. package/dist/shared/action_handlers/entity_identifier_handler.js.map +1 -0
  81. package/dist/shared/action_schemas.d.ts +226 -134
  82. package/dist/shared/action_schemas.d.ts.map +1 -1
  83. package/dist/shared/action_schemas.js +80 -24
  84. package/dist/shared/action_schemas.js.map +1 -1
  85. package/dist/shared/contract_mappings.d.ts.map +1 -1
  86. package/dist/shared/contract_mappings.js +0 -20
  87. package/dist/shared/contract_mappings.js.map +1 -1
  88. package/dist/shared/openapi_file.d.ts +2 -0
  89. package/dist/shared/openapi_file.d.ts.map +1 -1
  90. package/dist/shared/openapi_file.js +12 -0
  91. package/dist/shared/openapi_file.js.map +1 -1
  92. package/dist/shared/openapi_types.d.ts +2 -120
  93. package/dist/shared/openapi_types.d.ts.map +1 -1
  94. package/openapi.yaml +33 -70
  95. package/package.json +21 -6
package/README.md CHANGED
@@ -1,29 +1,27 @@
1
1
  # Neotoma
2
2
 
3
- Deterministic state layer for AI agents. Open-source. Local-first. MIT licensed. For a guided overview, see [neotoma.io](https://neotoma.io).
3
+ Your agents forget. Neotoma makes them remember.
4
4
 
5
- ## Why this exists
5
+ Versioned records contacts, tasks, decisions, finances — that persist across Claude, Cursor, ChatGPT, OpenClaw, and every agent you run. Open-source. Local-first. Deterministic. MIT licensed.
6
6
 
7
- Production agents fail because their state has no invariant. Without a state invariant:
7
+ **[neotoma.io](https://neotoma.io)** · **[Evaluate](https://neotoma.io/evaluate)** · **[Install](https://neotoma.io/install)** · **[Documentation](https://neotoma.io/docs)**
8
8
 
9
- - Context drifts across sessions
10
- - Facts conflict across tools
11
- - Decisions execute without a reproducible trail
9
+ ## Why this exists
12
10
 
13
- These are not hypothetical. They happen every day in production agent systems:
11
+ You run AI agents across tools and sessions. Without a state layer, you become the human sync layer:
14
12
 
15
- - An agent references an outdated contract clause retrieved from a stale embedding.
16
- - Two tools record different versions of the same entity.
17
- - An automated decision cannot be reproduced during debugging.
18
- - Context drifts across sessions and the agent silently changes behavior.
13
+ - Every session starts from zero nothing your agent learns carries over
14
+ - Facts conflict across tools two agents store different versions of the same person
15
+ - Decisions execute without a reproducible trail you can't trace why your agent acted
16
+ - Corrections don't stick you fix something in Claude and it's wrong again in Cursor
19
17
 
20
- Agent state must obey invariants. Without them, every downstream action inherits the uncertainty of the state it reads.
18
+ These are not hypothetical. They happen every day in production agent systems. You compensate by re-prompting context, patching state gaps, and maintaining manual workarounds. Neotoma removes that tax.
21
19
 
22
- ## The state invariant
20
+ ## What Neotoma does
23
21
 
24
- Neotoma enforces a deterministic state invariant. State is **versioned**, **schema-bound**, **replayable**, and **auditable**. Every mutation is recorded. Every state change can be inspected or replayed. No silent mutation. No implicit overwrite.
22
+ Neotoma is a deterministic state layer for AI agents. It stores structured records — contacts, tasks, transactions, decisions, events, contracts — with versioned history and full provenance. Every change creates a new version. Nothing is overwritten. Every state can be replayed from the observation log.
25
23
 
26
- Agents need a deterministic state layer. RAG retrieves documents. Neotoma enforces state evolution. Neotoma treats memory as state evolution, not retrieval. State evolves through a four-stage pipeline. Every stage is versioned with full provenance.
24
+ Not retrieval memory (RAG, vector search, semantic lookup). Neotoma enforces deterministic state evolution: same observations always produce the same entity state, regardless of when or in what order they are processed.
27
25
 
28
26
  ## Architecture
29
27
 
@@ -35,8 +33,9 @@ graph LR
35
33
  Snapshots --> Graph[Memory Graph]
36
34
  Graph <--> MCP[MCP Protocol]
37
35
  MCP --> Claude
36
+ MCP --> ChatGPT
38
37
  MCP --> Cursor
39
- MCP --> Codex
38
+ MCP --> OpenClaw
40
39
  ```
41
40
 
42
41
  - **Deterministic.** Same observations always produce the same versioned entity snapshots. No ordering sensitivity.
@@ -50,39 +49,47 @@ graph LR
50
49
  | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------- |
51
50
  | **Privacy-first** | Your data stays local. Never used for training. User-controlled storage, optional encryption at rest. Full export and deletion control. |
52
51
  | **Deterministic** | Same input always produces same output. Schema-first extraction, hash-based entity IDs, full provenance. No silent mutation. |
53
- | **Cross-platform** | One memory graph across Claude, Cursor, Codex, and CLI. MCP-based access. No platform lock-in. Works alongside native memory. |
52
+ | **Cross-platform** | One memory graph across Claude, ChatGPT, Cursor, OpenClaw, Codex, and CLI. MCP-based access. No platform lock-in. Works alongside native memory. |
54
53
 
55
54
  ## State guarantees
56
55
 
57
- Most AI memory systems optimize storage or retrieval. Neotoma enforces state integrity.
58
-
59
- | Property | Platform | Retrieval / RAG | Files | Deterministic |
60
- | ------------------------------------ | --------- | --------------- | ---------- | ------------- |
61
- | Deterministic state evolution | ✗ | ✗ | ✗ | ✓ |
62
- | Versioned history | ✗ | ✗ | ⚠ manual | ✓ |
63
- | Replayable timeline | ✗ | ✗ | ✗ | ✓ |
64
- | Auditable change log | ✗ | ✗ | ⚠ partial | ✓ |
65
- | Schema constraints | ✗ | ✗ | ✗ | ✓ |
66
- | Silent mutation risk | ⚠ common | ⚠ common | ⚠ common | prevented |
67
- | Conflicting facts risk | ⚠ common | ⚠ common | ⚠ possible | prevented |
68
- | Reproducible state reconstruction | ✗ | ✗ | ✗ | ✓ |
69
- | Human inspectability (diffs/lineage) | ⚠ partial | ⚠ partial | ⚠ partial | ✓ |
70
- | Zero-setup onboarding | ✓ | ✗ | ✗ | ✗ |
71
- | Semantic similarity search | ✗ | ✓ | ✗ | ✓ |
72
- | Direct human editability | ✗ | ✗ | ✓ | ✗ |
73
-
74
- **Platform:** Claude, ChatGPT, Gemini, Copilot. **Retrieval:** Mem0, Zep, LangChain Memory. **Files:** Markdown files, JSON stores, CRDT docs. **Deterministic:** Neotoma (reference implementation).
56
+ Most AI memory systems optimize storage or retrieval. Neotoma enforces state integrity. [Full comparison with explanations →](https://neotoma.io/memory-guarantees)
57
+
58
+ | Property | Platform | Retrieval / RAG | Files | Database | Neotoma |
59
+ | ------------------------------------ | --------- | --------------- | ---------- | ------------- | ------------- |
60
+ | Deterministic state evolution | ✗ | ✗ | ✗ | ✗ | ✓ |
61
+ | Versioned history | ✗ | ✗ | ⚠ manual | ✗ | ✓ |
62
+ | Replayable timeline | ✗ | ✗ | ✗ | ✗ | ✓ |
63
+ | Auditable change log | ✗ | ✗ | ⚠ partial | ✗ | ✓ |
64
+ | Schema constraints | ✗ | ✗ | ✗ | ⚠ partial | ✓ |
65
+ | Silent mutation risk | ⚠ common | ⚠ common | ⚠ common | ⚠ common | prevented |
66
+ | Conflicting facts risk | ⚠ common | ⚠ common | ⚠ possible | ⚠ common | prevented |
67
+ | Reproducible state reconstruction | ✗ | ✗ | ✗ | ✗ | ✓ |
68
+ | Human inspectability (diffs/lineage) | ⚠ partial | ⚠ partial | ⚠ partial | ⚠ partial | ✓ |
69
+ | Zero-setup onboarding | ✓ | ✗ | ✗ | ✗ | ✗ |
70
+ | Semantic similarity search | ✗ | ✓ | ✗ | ✗ | ✓ |
71
+ | Direct human editability | ✗ | ✗ | ✓ | ✗ | ✗ |
72
+
73
+ **Platform:** Claude, ChatGPT, Gemini, Copilot. **Retrieval:** Mem0, Zep, LangChain Memory. **Files:** Markdown files, JSON stores, CRDT docs. **Database:** SQLite, Postgres, MySQL. **Neotoma:** Deterministic state layer (reference implementation).
75
74
 
76
75
  ## Quick start
77
76
 
78
- ### Agent-driven install (recommended)
77
+ ### Evaluate first (recommended)
79
78
 
80
- Agents install Neotoma themselves. Paste this prompt into Claude, Codex, or Cursor:
79
+ Ask your AI agent whether Neotoma fits your workflow. Paste this into Claude, Cursor, ChatGPT, or any MCP-capable tool:
81
80
 
82
81
  ```
83
- Install Neotoma by following these instructions: https://github.com/markmhendrickson/neotoma/blob/main/install.md
82
+ Read https://neotoma.io/evaluate. Before you answer, inspect any broader tool, workspace, and configuration context you can access so you assess my real workflow rather than just this chat. Then tell me whether Neotoma is a real fit for my workflow, what data would be highest value to persist first, and what I should do next.
83
+ ```
84
+
85
+ The agent reads the evaluation page, checks your context, and gives you an honest assessment. If it's a fit, the agent carries you through install and activation.
86
+
87
+ ### Agent-driven install
84
88
 
85
- Discover candidate data from available context — including any facts this tool already remembers about me — preview it for approval, and save only what I confirm.
89
+ Agents install Neotoma themselves. Paste this prompt into Claude, Cursor, ChatGPT, or Codex:
90
+
91
+ ```
92
+ Read https://neotoma.io/install and carry me through the install-first Neotoma flow. Install, activate it with my data, and configure my current tool for robust ongoing use.
86
93
  ```
87
94
 
88
95
  The agent handles npm install, initialization, and MCP configuration. **Manual install:**
@@ -112,24 +119,41 @@ Three interfaces. One state invariant. Every interface provides the same determi
112
119
  | Interface | Description |
113
120
  | -------------- | ------------------------------------------------------------------------------------------------------------------------------ |
114
121
  | **REST API** | Full HTTP interface for application integration. Entities, relationships, observations, schema, timeline, and version history. |
115
- | **MCP Server** | Model Context Protocol for Claude, Cursor, and Codex. Agents store and retrieve state through structured tool calls. |
122
+ | **MCP Server** | Model Context Protocol for Claude, ChatGPT, Cursor, OpenClaw, Codex, and more. Agents store and retrieve state through structured tool calls. |
116
123
  | **CLI** | Command-line for scripting and direct access. Inspect entities, replay timelines, and manage state from the terminal. |
117
124
 
118
125
  All three map to the same OpenAPI-backed operations. MCP tool calls log the equivalent CLI invocation.
119
126
 
120
127
  ## Who this is for
121
128
 
122
- | Who | What they need |
123
- | ------------------------------- | ------------------------------------------------------------------ |
124
- | **AI infrastructure engineers** | State integrity guarantees for agent runtimes and orchestration |
125
- | **Agent system builders** | Deterministic state and provenance layer for agents and toolchains |
126
- | **AI-native operators** | State that follows across every tool and session |
129
+ People building a personal operating system with AI agents across their life — wiring together tools like Claude, Cursor, ChatGPT, OpenClaw, and custom scripts to manage contacts, tasks, finances, code, content, and other domains. The same person operates their agents, builds new pipelines, and debugs state drift. These are three operational modes, not separate personas:
130
+
131
+ | Mode | What you're doing | The tax you pay without Neotoma | What you get back |
132
+ | ---- | ----------------- | ------------------------------- | ----------------- |
133
+ | **Operating** | Running AI tools across sessions and contexts | Re-prompting, context re-establishment, manual cross-tool sync | Attention, continuity, trust in your tools |
134
+ | **Building** | Shipping agents and pipelines | Prompt workarounds, dedup hacks, memory regression fixes | Product velocity, shipping confidence |
135
+ | **Debugging** | Tracing state drift and reproducing failures | Writing glue (checkpoint logic, custom diffing, state serialization) | Debugging speed, platform design time |
136
+
137
+ **Not for:** Casual note-taking. PKM/Obsidian-style users. Thought-partner usage where the human drives every turn. Platform builders who build state management as their core product. Users who need zero-install onboarding (Neotoma requires npm and CLI today).
138
+
139
+ ## Record types
127
140
 
128
- Not for casual note-taking. Not for UI-first users expecting reliability guarantees today.
141
+ Neotoma stores typed entities with versioned history and provenance. Each type has a dedicated guide on [neotoma.io](https://neotoma.io):
142
+
143
+ | Type | What it stores | Examples |
144
+ | ---- | -------------- | -------- |
145
+ | **[Contacts](https://neotoma.io/types/contacts)** | People, companies, roles, relationships | `contact`, `company`, `account` |
146
+ | **[Tasks](https://neotoma.io/types/tasks)** | Obligations, deadlines, habits, goals | `task`, `habit`, `goal` |
147
+ | **[Transactions](https://neotoma.io/types/transactions)** | Payments, receipts, invoices, ledger entries | `transaction`, `invoice`, `receipt` |
148
+ | **[Contracts](https://neotoma.io/types/contracts)** | Agreements, clauses, amendments | `contract`, `clause`, `amendment` |
149
+ | **[Decisions](https://neotoma.io/types/decisions)** | Choices, rationale, audit trails | `decision`, `assessment`, `review` |
150
+ | **[Events](https://neotoma.io/types/events)** | Meetings, milestones, outcomes | `event`, `meeting`, `milestone` |
151
+
152
+ Schema is flexible — store any entity type with whatever fields the message implies. The system infers and evolves schemas automatically.
129
153
 
130
154
  ## Current status
131
155
 
132
- **Version:** v0.3.9 · **Releases:** 10 · **License:** MIT
156
+ **Version:** v0.4.0 · **Releases:** 12 · **License:** MIT
133
157
 
134
158
  ### What is guaranteed (even in preview)
135
159
 
@@ -190,35 +214,49 @@ npm test
190
214
 
191
215
  Neotoma exposes state via MCP. Local storage only in preview. Local built-in auth.
192
216
 
193
- **Setup:**
194
-
195
- - [Cursor MCP setup](docs/developer/mcp_cursor_setup.md)
196
- - [Claude Code MCP setup](docs/developer/mcp_claude_code_setup.md)
197
- - [ChatGPT Custom GPT setup](docs/developer/mcp_chatgpt_setup.md)
217
+ **Setup guides:** [Cursor](https://neotoma.io/neotoma-with-cursor) · [Claude Code](https://neotoma.io/neotoma-with-claude-code) · [Claude](https://neotoma.io/neotoma-with-claude) · [ChatGPT](https://neotoma.io/neotoma-with-chatgpt) · [Codex](https://neotoma.io/neotoma-with-codex) · [OpenClaw](https://neotoma.io/neotoma-with-openclaw)
198
218
 
199
219
  **Agent behavior contract:** Store first, retrieve before storing, extract entities from user input, create tasks for commitments. Full instructions: [MCP instructions](docs/developer/mcp/instructions.md) and [CLI agent instructions](docs/developer/cli_agent_instructions.md).
200
220
 
201
221
  **Representative actions:** `store`, `retrieve_entities`, `retrieve_entity_snapshot`, `merge_entities`, `list_observations`, `create_relationship`, `list_relationships`, `list_timeline_events`, `retrieve_graph_neighborhood`. Full list: [MCP spec](docs/specs/MCP_SPEC.md).
202
222
 
223
+ ## Common questions
224
+
225
+ **Platform memory (Claude, ChatGPT) is good enough — why add another tool?**
226
+ Platform memory stores what one vendor decides to remember, in a format you can't inspect or export. It doesn't version, doesn't detect conflicts, and vanishes if you switch tools. Neotoma gives you structured, cross-tool state you control.
227
+
228
+ **Can't I just build this with SQLite or a JSON file?**
229
+ You can start there — many teams do. But you'll eventually need versioning, conflict detection, schema evolution, and cross-tool sync. That's months of infrastructure work. Neotoma ships those guarantees on day one.
230
+
231
+ **What's the difference between RAG memory and deterministic memory?**
232
+ RAG stores text chunks and retrieves them by similarity. Neotoma stores structured observations and composes entity state with reducers; the same observations always yield the same snapshot. RAG optimizes relevance; deterministic memory optimizes integrity, versioning, and auditability.
233
+
234
+ **Is this production-ready?**
235
+ Neotoma is in developer preview — used daily by real agent workflows. The core guarantees (deterministic state, versioned history, append-only log) are stable. Install in 5 minutes and let your agent evaluate the fit.
236
+
237
+ More questions: [FAQ](https://neotoma.io/faq)
238
+
203
239
  ## Related posts
204
240
 
205
241
  - [Neotoma developer release](https://markmhendrickson.com/posts/neotoma-developer-release)
206
242
  - [Your AI remembers your vibe but not your work](https://markmhendrickson.com/posts/your-ai-remembers-your-vibe-but-not-your-work)
207
243
  - [Building a truth layer for persistent agent memory](https://markmhendrickson.com/posts/truth-layer-agent-memory)
208
244
  - [Agent memory has a truth problem](https://markmhendrickson.com/posts/agent-memory-truth-problem)
245
+ - [Six agentic trends I'm betting on (and how I might be wrong)](https://markmhendrickson.com/posts/six-agentic-trends-betting-on)
209
246
  - [Why agent memory needs more than RAG](https://markmhendrickson.com/posts/why-agent-memory-needs-more-than-rag)
247
+ - [Agent command centers need one source of truth](https://markmhendrickson.com/posts/agent-command-centers-source-of-truth)
210
248
 
211
249
  ## Documentation
212
250
 
213
251
  Full documentation is organized at [neotoma.io/docs](https://neotoma.io/docs) and in the `docs/` directory.
214
252
 
215
- **Foundational:** [Core identity](docs/foundation/core_identity.md), [Philosophy](docs/foundation/philosophy.md), [Problem statement](docs/foundation/problem_statement.md), [Architecture](docs/architecture/architecture.md)
253
+ **Getting started:** [Evaluate](https://neotoma.io/evaluate), [Install](https://neotoma.io/install), [Walkthrough](https://neotoma.io/developer-walkthrough)
216
254
 
217
- **Developer:** [Getting started](docs/developer/getting_started.md), [CLI reference](docs/developer/cli_reference.md), [MCP overview](docs/developer/mcp_overview.md), [Development workflow](docs/developer/development_workflow.md)
255
+ **Reference:** [REST API](https://neotoma.io/api), [MCP server](https://neotoma.io/mcp), [CLI](https://neotoma.io/cli), [Memory guarantees](https://neotoma.io/memory-guarantees), [Architecture](https://neotoma.io/architecture), [Terminology](https://neotoma.io/terminology)
218
256
 
219
- **Specs:** [MCP spec](docs/specs/MCP_SPEC.md), [Schema](docs/subsystems/schema.md), [REST API](docs/api/rest_api.md), [Terminology](https://neotoma.io/terminology)
257
+ **Foundational:** [Core identity](docs/foundation/core_identity.md), [Philosophy](docs/foundation/philosophy.md), [Problem statement](docs/foundation/problem_statement.md)
220
258
 
221
- **Operations:** [Runbook](docs/operations/runbook.md), [Health check](docs/operations/health_check.md) (`npm run doctor`), [Troubleshooting](docs/operations/troubleshooting.md)
259
+ **Operations:** [Runbook](docs/operations/runbook.md), [Health check](docs/operations/health_check.md) (`npm run doctor`), [Troubleshooting](https://neotoma.io/troubleshooting)
222
260
 
223
261
  ## Contributing
224
262
 
package/dist/actions.d.ts CHANGED
@@ -1,6 +1,9 @@
1
- export declare const app: import("express-serve-static-core").Express;
1
+ import express from "express";
2
+ export declare const app: any;
3
+ /** True when request is to localhost/127.0.0.1 (local access). Tunnel requests have a non-local Host. */
4
+ export declare function isLocalRequest(req: express.Request): boolean;
2
5
  export declare function startHTTPServer(): Promise<{
3
- server: import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
6
+ server: any;
4
7
  port: number;
5
8
  } | undefined>;
6
9
  //# sourceMappingURL=actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AA8EA,eAAO,MAAM,GAAG,6CAAY,CAAC;AA0vI7B,wBAAsB,eAAe;;;eAkCpC"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AA8E9B,eAAO,MAAM,GAAG,KAAY,CAAC;AAwL7B,yGAAyG;AACzG,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAK5D;AAk5ID,wBAAsB,eAAe;;;eAgCpC"}