nemoris 0.1.0 → 0.1.2

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 (248) hide show
  1. package/.env.example +49 -49
  2. package/LICENSE +21 -21
  3. package/README.md +209 -209
  4. package/SECURITY.md +59 -119
  5. package/bin/nemoris +46 -46
  6. package/config/agents/agent.toml.example +28 -28
  7. package/config/agents/content.toml +23 -0
  8. package/config/agents/default.toml +22 -22
  9. package/config/agents/heartbeat.toml +35 -0
  10. package/config/agents/iris.toml +23 -0
  11. package/config/agents/lab.toml +23 -0
  12. package/config/agents/main.toml +45 -0
  13. package/config/agents/nemo.toml +21 -0
  14. package/config/agents/ops.toml +38 -0
  15. package/config/agents/orchestrator.toml +18 -18
  16. package/config/agents/revenue.toml +23 -0
  17. package/config/agents/testyboo.toml +19 -0
  18. package/config/delivery.toml +73 -73
  19. package/config/embeddings.toml +5 -5
  20. package/config/identity/content-purpose.md +11 -0
  21. package/config/identity/content-soul.md +45 -0
  22. package/config/identity/default-purpose.md +1 -1
  23. package/config/identity/default-soul.md +3 -3
  24. package/config/identity/heartbeat-purpose.md +9 -0
  25. package/config/identity/heartbeat-soul.md +16 -0
  26. package/config/identity/iris-purpose.md +17 -0
  27. package/config/identity/iris-soul.md +68 -0
  28. package/config/identity/lab-purpose.md +10 -0
  29. package/config/identity/lab-soul.md +38 -0
  30. package/config/identity/main-purpose.md +17 -0
  31. package/config/identity/main-soul.md +66 -0
  32. package/config/identity/main-user.md +22 -0
  33. package/config/identity/ops-purpose.md +9 -0
  34. package/config/identity/ops-soul.md +16 -0
  35. package/config/identity/orchestrator-purpose.md +1 -1
  36. package/config/identity/orchestrator-soul.md +1 -1
  37. package/config/identity/revenue-purpose.md +9 -0
  38. package/config/identity/revenue-soul.md +41 -0
  39. package/config/identity/testyboo-purpose.md +13 -0
  40. package/config/identity/testyboo-soul.md +20 -0
  41. package/config/improvement-targets.toml +15 -15
  42. package/config/jobs/heartbeat-check.toml +30 -30
  43. package/config/jobs/memory-rollup.toml +46 -46
  44. package/config/jobs/workspace-health.toml +63 -63
  45. package/config/mcp.toml +16 -16
  46. package/config/output-contracts.toml +17 -17
  47. package/config/peers.toml +32 -32
  48. package/config/peers.toml.example +32 -32
  49. package/config/policies/memory-default.toml +10 -10
  50. package/config/policies/memory-heartbeat.toml +5 -5
  51. package/config/policies/memory-ops.toml +10 -10
  52. package/config/policies/tools-heartbeat-minimal.toml +8 -8
  53. package/config/policies/tools-interactive-safe.toml +8 -8
  54. package/config/policies/tools-ops-bounded.toml +8 -8
  55. package/config/policies/tools-orchestrator.toml +7 -7
  56. package/config/providers/anthropic.toml +15 -15
  57. package/config/providers/ollama.toml +5 -5
  58. package/config/providers/openai-codex.toml +9 -9
  59. package/config/providers/openrouter.toml +5 -5
  60. package/config/router.toml +22 -22
  61. package/config/runtime.toml +114 -114
  62. package/config/skills/self-improvement.toml +15 -15
  63. package/config/skills/telegram-onboarding-spec.md +240 -240
  64. package/config/skills/workspace-monitor.toml +15 -15
  65. package/config/task-router.toml +42 -42
  66. package/install.sh +50 -50
  67. package/package.json +91 -90
  68. package/src/auth/auth-profiles.js +169 -169
  69. package/src/auth/openai-codex-oauth.js +285 -285
  70. package/src/battle.js +449 -449
  71. package/src/cli/help.js +265 -265
  72. package/src/cli/output-filter.js +49 -49
  73. package/src/cli/runtime-control.js +704 -704
  74. package/src/cli-main.js +2763 -2763
  75. package/src/cli.js +78 -78
  76. package/src/config/loader.js +332 -332
  77. package/src/config/schema-validator.js +214 -214
  78. package/src/config/toml-lite.js +8 -8
  79. package/src/daemon/action-handlers.js +71 -71
  80. package/src/daemon/healing-tick.js +87 -87
  81. package/src/daemon/health-probes.js +90 -90
  82. package/src/daemon/notifier.js +57 -57
  83. package/src/daemon/nurse.js +218 -218
  84. package/src/daemon/repair-log.js +106 -106
  85. package/src/daemon/rule-staging.js +90 -90
  86. package/src/daemon/rules.js +29 -29
  87. package/src/daemon/telegram-commands.js +54 -54
  88. package/src/daemon/updater.js +85 -85
  89. package/src/jobs/job-runner.js +78 -78
  90. package/src/mcp/consumer.js +129 -129
  91. package/src/memory/active-recall.js +171 -171
  92. package/src/memory/backend-manager.js +97 -97
  93. package/src/memory/backends/file-backend.js +38 -38
  94. package/src/memory/backends/qmd-backend.js +219 -219
  95. package/src/memory/embedding-guards.js +24 -24
  96. package/src/memory/embedding-index.js +118 -118
  97. package/src/memory/embedding-service.js +179 -179
  98. package/src/memory/file-index.js +177 -177
  99. package/src/memory/memory-signature.js +5 -5
  100. package/src/memory/memory-store.js +648 -648
  101. package/src/memory/retrieval-planner.js +66 -66
  102. package/src/memory/scoring.js +145 -145
  103. package/src/memory/simhash.js +78 -78
  104. package/src/memory/sqlite-active-store.js +824 -824
  105. package/src/memory/write-policy.js +36 -36
  106. package/src/onboarding/aliases.js +33 -33
  107. package/src/onboarding/auth/api-key.js +224 -224
  108. package/src/onboarding/auth/ollama-detect.js +42 -42
  109. package/src/onboarding/clack-prompter.js +77 -77
  110. package/src/onboarding/doctor.js +530 -530
  111. package/src/onboarding/lock.js +42 -42
  112. package/src/onboarding/model-catalog.js +344 -344
  113. package/src/onboarding/phases/auth.js +576 -589
  114. package/src/onboarding/phases/build.js +130 -130
  115. package/src/onboarding/phases/choose.js +82 -82
  116. package/src/onboarding/phases/detect.js +98 -98
  117. package/src/onboarding/phases/hatch.js +216 -216
  118. package/src/onboarding/phases/identity.js +79 -79
  119. package/src/onboarding/phases/ollama.js +345 -345
  120. package/src/onboarding/phases/scaffold.js +99 -99
  121. package/src/onboarding/phases/telegram.js +377 -377
  122. package/src/onboarding/phases/validate.js +204 -204
  123. package/src/onboarding/phases/verify.js +206 -206
  124. package/src/onboarding/platform.js +482 -482
  125. package/src/onboarding/status-bar.js +95 -95
  126. package/src/onboarding/templates.js +794 -794
  127. package/src/onboarding/toml-writer.js +38 -38
  128. package/src/onboarding/tui.js +250 -250
  129. package/src/onboarding/uninstall.js +153 -153
  130. package/src/onboarding/wizard.js +516 -499
  131. package/src/providers/anthropic.js +168 -168
  132. package/src/providers/base.js +247 -247
  133. package/src/providers/circuit-breaker.js +136 -136
  134. package/src/providers/ollama.js +163 -163
  135. package/src/providers/openai-codex.js +149 -149
  136. package/src/providers/openrouter.js +136 -136
  137. package/src/providers/registry.js +36 -36
  138. package/src/providers/router.js +16 -16
  139. package/src/runtime/bootstrap-cache.js +47 -47
  140. package/src/runtime/capabilities-prompt.js +25 -25
  141. package/src/runtime/completion-ping.js +99 -99
  142. package/src/runtime/config-validator.js +121 -121
  143. package/src/runtime/context-ledger.js +360 -360
  144. package/src/runtime/cutover-readiness.js +42 -42
  145. package/src/runtime/daemon.js +729 -729
  146. package/src/runtime/delivery-ack.js +195 -195
  147. package/src/runtime/delivery-adapters/local-file.js +41 -41
  148. package/src/runtime/delivery-adapters/openclaw-cli.js +94 -94
  149. package/src/runtime/delivery-adapters/openclaw-peer.js +98 -98
  150. package/src/runtime/delivery-adapters/shadow.js +13 -13
  151. package/src/runtime/delivery-adapters/standalone-http.js +98 -98
  152. package/src/runtime/delivery-adapters/telegram.js +104 -104
  153. package/src/runtime/delivery-adapters/tui.js +128 -128
  154. package/src/runtime/delivery-manager.js +807 -807
  155. package/src/runtime/delivery-store.js +168 -168
  156. package/src/runtime/dependency-health.js +118 -118
  157. package/src/runtime/envelope.js +114 -114
  158. package/src/runtime/evaluation.js +1089 -1089
  159. package/src/runtime/exec-approvals.js +216 -216
  160. package/src/runtime/executor.js +500 -500
  161. package/src/runtime/failure-ping.js +67 -67
  162. package/src/runtime/flows.js +83 -83
  163. package/src/runtime/guards.js +45 -45
  164. package/src/runtime/handoff.js +51 -51
  165. package/src/runtime/identity-cache.js +28 -28
  166. package/src/runtime/improvement-engine.js +109 -109
  167. package/src/runtime/improvement-harness.js +581 -581
  168. package/src/runtime/input-sanitiser.js +72 -72
  169. package/src/runtime/interaction-contract.js +347 -347
  170. package/src/runtime/lane-readiness.js +226 -226
  171. package/src/runtime/migration.js +323 -323
  172. package/src/runtime/model-resolution.js +78 -78
  173. package/src/runtime/network.js +64 -64
  174. package/src/runtime/notification-store.js +97 -97
  175. package/src/runtime/notifier.js +256 -256
  176. package/src/runtime/orchestrator.js +53 -53
  177. package/src/runtime/orphan-reaper.js +41 -41
  178. package/src/runtime/output-contract-schema.js +139 -139
  179. package/src/runtime/output-contract-validator.js +439 -439
  180. package/src/runtime/peer-readiness.js +69 -69
  181. package/src/runtime/peer-registry.js +133 -133
  182. package/src/runtime/pilot-status.js +108 -108
  183. package/src/runtime/prompt-builder.js +261 -261
  184. package/src/runtime/provider-attempt.js +582 -582
  185. package/src/runtime/report-fallback.js +71 -71
  186. package/src/runtime/result-normalizer.js +183 -183
  187. package/src/runtime/retention.js +74 -74
  188. package/src/runtime/review.js +244 -244
  189. package/src/runtime/route-job.js +15 -15
  190. package/src/runtime/run-store.js +38 -38
  191. package/src/runtime/schedule.js +88 -88
  192. package/src/runtime/scheduler-state.js +434 -434
  193. package/src/runtime/scheduler.js +656 -656
  194. package/src/runtime/session-compactor.js +182 -182
  195. package/src/runtime/session-search.js +155 -155
  196. package/src/runtime/slack-inbound.js +249 -249
  197. package/src/runtime/ssrf.js +102 -102
  198. package/src/runtime/status-aggregator.js +330 -330
  199. package/src/runtime/task-contract.js +140 -140
  200. package/src/runtime/task-packet.js +107 -107
  201. package/src/runtime/task-router.js +140 -140
  202. package/src/runtime/telegram-inbound.js +1565 -1565
  203. package/src/runtime/token-counter.js +134 -134
  204. package/src/runtime/token-estimator.js +59 -59
  205. package/src/runtime/tool-loop.js +200 -200
  206. package/src/runtime/transport-server.js +311 -311
  207. package/src/runtime/tui-server.js +411 -411
  208. package/src/runtime/ulid.js +44 -44
  209. package/src/security/ssrf-check.js +197 -197
  210. package/src/setup.js +369 -369
  211. package/src/shadow/bridge.js +303 -303
  212. package/src/skills/loader.js +84 -84
  213. package/src/tools/catalog.json +49 -49
  214. package/src/tools/cli-delegate.js +44 -44
  215. package/src/tools/mcp-client.js +106 -106
  216. package/src/tools/micro/cancel-task.js +6 -6
  217. package/src/tools/micro/complete-task.js +6 -6
  218. package/src/tools/micro/fail-task.js +6 -6
  219. package/src/tools/micro/http-fetch.js +74 -74
  220. package/src/tools/micro/index.js +36 -36
  221. package/src/tools/micro/lcm-recall.js +60 -60
  222. package/src/tools/micro/list-dir.js +17 -17
  223. package/src/tools/micro/list-skills.js +46 -46
  224. package/src/tools/micro/load-skill.js +38 -38
  225. package/src/tools/micro/memory-search.js +45 -45
  226. package/src/tools/micro/read-file.js +11 -11
  227. package/src/tools/micro/session-search.js +54 -54
  228. package/src/tools/micro/shell-exec.js +43 -43
  229. package/src/tools/micro/trigger-job.js +79 -79
  230. package/src/tools/micro/web-search.js +58 -58
  231. package/src/tools/micro/workspace-paths.js +39 -39
  232. package/src/tools/micro/write-file.js +14 -14
  233. package/src/tools/micro/write-memory.js +41 -41
  234. package/src/tools/registry.js +348 -348
  235. package/src/tools/tool-result-contract.js +36 -36
  236. package/src/tui/chat.js +835 -835
  237. package/src/tui/renderer.js +175 -175
  238. package/src/tui/socket-client.js +217 -217
  239. package/src/utils/canonical-json.js +29 -29
  240. package/src/utils/compaction.js +30 -30
  241. package/src/utils/env-loader.js +5 -5
  242. package/src/utils/errors.js +80 -80
  243. package/src/utils/fs.js +101 -101
  244. package/src/utils/ids.js +5 -5
  245. package/src/utils/model-context-limits.js +30 -30
  246. package/src/utils/token-budget.js +74 -74
  247. package/src/utils/usage-cost.js +25 -25
  248. package/src/utils/usage-metrics.js +14 -14
package/SECURITY.md CHANGED
@@ -1,119 +1,59 @@
1
- # Security Policy
2
-
3
- Nemoris is a local-first agent runtime for a single operator on a machine they control. It is powerful software: it can execute tools, talk to remote model providers, store local state, and deliver messages through channels like Telegram and Slack. Please read this file before deploying it on a machine that holds sensitive data.
4
-
5
- ## Supported Versions
6
-
7
- Security fixes are currently targeted at:
8
-
9
- - the latest `main` branch
10
- - the latest published npm release
11
-
12
- Older versions may not receive backported fixes.
13
-
14
- ## Reporting a Vulnerability
15
-
16
- Please do not open public GitHub issues for security vulnerabilities.
17
-
18
- Use one of these private channels instead:
19
-
20
- - GitHub Security Advisories: [Report a vulnerability](https://github.com/amzer24/nemoris/security/advisories/new)
21
- - Email fallback: `amzer24@gmail.com`
22
-
23
- Please include:
24
-
25
- - what you observed
26
- - affected version or commit
27
- - the smallest reliable reproduction
28
- - impact assessment
29
- - any mitigations you already tested
30
-
31
- I will acknowledge a good-faith report as quickly as possible and work toward a coordinated fix before public disclosure.
32
-
33
- ## Threat Model
34
-
35
- Nemoris is designed for:
36
-
37
- - a single user
38
- - a machine or account they control
39
- - explicitly configured workspaces and delivery channels
40
- - operator-reviewed tool use and provider configuration
41
-
42
- Nemoris is not designed to be:
43
-
44
- - a hardened multi-tenant sandbox
45
- - a safe environment for arbitrary untrusted users
46
- - a drop-in remote execution service for strangers
47
-
48
- If you need those guarantees, isolate Nemoris at the OS, VM, or container level rather than relying on prompt rules alone.
49
-
50
- ## What Stays Local vs What Leaves the Machine
51
-
52
- By default, Nemoris stores its runtime state locally under the install root, including:
53
-
54
- - config manifests
55
- - local state and SQLite databases
56
- - auth profiles in `state/auth-profiles.json`
57
- - daemon logs
58
-
59
- Data leaves the machine when you enable external integrations, including:
60
-
61
- - LLM provider calls to Anthropic, OpenRouter, OpenAI Codex, or other configured providers
62
- - Telegram or Slack delivery and inbound messaging
63
- - MCP servers or other network-capable tools
64
-
65
- Treat those integrations as trust boundaries. Only enable the ones you intend to use.
66
-
67
- ## Security Expectations and Non-Goals
68
-
69
- Nemoris aims to be secure by default for a personal local runtime, but there are important limits:
70
-
71
- - tool access is policy-bounded, but the runtime is still operating on your machine
72
- - remote providers can receive prompt content, tool output, and uploaded content needed to complete a turn
73
- - delivery adapters can send content to third-party services once enabled
74
- - local state files should be treated as sensitive operator data
75
-
76
- This means Nemoris should be run with the least privilege that still lets it do useful work.
77
-
78
- ## Safe Deployment Guidance
79
-
80
- Recommended:
81
-
82
- - run Nemoris as your own user account, not a shared account
83
- - keep workspaces narrow and intentional
84
- - use least-privilege provider tokens
85
- - leave delivery gates disabled until you are ready for live sends
86
- - keep `.env` and `state/auth-profiles.json` private
87
- - use explicit allowlists for Telegram/Slack users rather than broad access
88
- - keep the runtime updated
89
-
90
- Not recommended:
91
-
92
- - pointing it at your whole home directory as a workspace
93
- - running it as root
94
- - sharing one install across untrusted users
95
- - enabling remote delivery channels before validating auth and allowlists
96
-
97
- ## Sensitive Files
98
-
99
- Handle these as secrets:
100
-
101
- - `.env`
102
- - `state/auth-profiles.json`
103
- - any provider or delivery tokens
104
- - daemon logs that may contain identifiers or operational details
105
-
106
- Do not paste those files into public issues.
107
-
108
- ## Security-Focused Operations
109
-
110
- Useful commands when validating a setup:
111
-
112
- ```bash
113
- nemoris doctor
114
- nemoris status
115
- nemoris logs
116
- npm run publish:check
117
- ```
118
-
119
- If you are recovering from a token, install, or daemon problem, see [`docs/RECOVERY-FLOWS.md`](docs/RECOVERY-FLOWS.md).
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ | Version | Supported |
6
+ | ------- | ------------------ |
7
+ | 0.1.x | Current release |
8
+
9
+ ## Reporting a Vulnerability
10
+
11
+ **Do not open a public GitHub issue for security vulnerabilities.**
12
+
13
+ Instead, email **nemoris@proton.me** with:
14
+
15
+ - Description of the vulnerability
16
+ - Steps to reproduce
17
+ - Impact assessment (what an attacker could do)
18
+ - Your suggested fix, if any
19
+
20
+ You will receive an acknowledgement within 48 hours. We aim to provide a substantive response within 7 days.
21
+
22
+ ## Security Model
23
+
24
+ Nemoris runs locally on your machine. Key security properties:
25
+
26
+ - **API keys** are stored in `~/.nemoris/.env` with `0600` permissions (owner read/write only)
27
+ - **Keys are never logged** — the runtime redacts secrets from all log output
28
+ - **Exec approval gates** require human confirmation before shell commands execute
29
+ - **SSRF protection** on all URL-intake surfaces
30
+ - **Input sanitisation** with injection detection and boundary tagging
31
+ - **No telemetry** Nemoris does not phone home or collect usage data
32
+
33
+ ## Responsible Disclosure
34
+
35
+ We follow responsible disclosure practices. If you report a vulnerability:
36
+
37
+ - We will not take legal action against you for good-faith research
38
+ - We will credit you in the release notes (unless you prefer anonymity)
39
+ - We will coordinate disclosure timing with you
40
+
41
+ ## Deployment Boundaries
42
+
43
+ Nemoris is a single operator, single-user runtime designed to run on your own machine.
44
+
45
+ It is not designed to be:
46
+
47
+ - a hardened multi-tenant sandbox
48
+ - a public-facing web service
49
+ - a shared server runtime
50
+
51
+ For recovery procedures, see [docs/RECOVERY-FLOWS.md](docs/RECOVERY-FLOWS.md).
52
+
53
+ ## Vulnerability Tracking
54
+
55
+ Known vulnerabilities are tracked via GitHub Security Advisories on this repository.
56
+
57
+ ## Dependencies
58
+
59
+ Nemoris keeps dependencies minimal by design. We monitor for known vulnerabilities via `npm audit` and update promptly.
package/bin/nemoris CHANGED
@@ -1,46 +1,46 @@
1
- #!/bin/sh
2
- set -eu
3
-
4
- SCRIPT_PATH=$0
5
- while [ -L "$SCRIPT_PATH" ]; do
6
- SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$SCRIPT_PATH")" && pwd)
7
- LINK_TARGET=$(readlink "$SCRIPT_PATH")
8
- case "$LINK_TARGET" in
9
- /*) SCRIPT_PATH="$LINK_TARGET" ;;
10
- *) SCRIPT_PATH="$SCRIPT_DIR/$LINK_TARGET" ;;
11
- esac
12
- done
13
-
14
- ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$SCRIPT_PATH")/.." && pwd)
15
- FILTERED_NODE_OPTIONS=""
16
- SKIP_NEXT=0
17
-
18
- for ARG in ${NODE_OPTIONS-}; do
19
- if [ "$SKIP_NEXT" = "1" ]; then
20
- SKIP_NEXT=0
21
- case "$ARG" in
22
- *disable_autoselectfamily.js*) continue ;;
23
- *) FILTERED_NODE_OPTIONS="$FILTERED_NODE_OPTIONS $ARG"; continue ;;
24
- esac
25
- fi
26
-
27
- case "$ARG" in
28
- --require)
29
- SKIP_NEXT=1
30
- ;;
31
- --require=*disable_autoselectfamily.js*)
32
- ;;
33
- *)
34
- FILTERED_NODE_OPTIONS="$FILTERED_NODE_OPTIONS $ARG"
35
- ;;
36
- esac
37
- done
38
-
39
- FILTERED_NODE_OPTIONS=$(printf "%s" "$FILTERED_NODE_OPTIONS" | sed 's/^ //')
40
- if [ -n "$FILTERED_NODE_OPTIONS" ]; then
41
- export NODE_OPTIONS="$FILTERED_NODE_OPTIONS"
42
- else
43
- unset NODE_OPTIONS
44
- fi
45
-
46
- exec node "$ROOT_DIR/src/cli.js" "$@"
1
+ #!/bin/sh
2
+ set -eu
3
+
4
+ SCRIPT_PATH=$0
5
+ while [ -L "$SCRIPT_PATH" ]; do
6
+ SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$SCRIPT_PATH")" && pwd)
7
+ LINK_TARGET=$(readlink "$SCRIPT_PATH")
8
+ case "$LINK_TARGET" in
9
+ /*) SCRIPT_PATH="$LINK_TARGET" ;;
10
+ *) SCRIPT_PATH="$SCRIPT_DIR/$LINK_TARGET" ;;
11
+ esac
12
+ done
13
+
14
+ ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$SCRIPT_PATH")/.." && pwd)
15
+ FILTERED_NODE_OPTIONS=""
16
+ SKIP_NEXT=0
17
+
18
+ for ARG in ${NODE_OPTIONS-}; do
19
+ if [ "$SKIP_NEXT" = "1" ]; then
20
+ SKIP_NEXT=0
21
+ case "$ARG" in
22
+ *disable_autoselectfamily.js*) continue ;;
23
+ *) FILTERED_NODE_OPTIONS="$FILTERED_NODE_OPTIONS $ARG"; continue ;;
24
+ esac
25
+ fi
26
+
27
+ case "$ARG" in
28
+ --require)
29
+ SKIP_NEXT=1
30
+ ;;
31
+ --require=*disable_autoselectfamily.js*)
32
+ ;;
33
+ *)
34
+ FILTERED_NODE_OPTIONS="$FILTERED_NODE_OPTIONS $ARG"
35
+ ;;
36
+ esac
37
+ done
38
+
39
+ FILTERED_NODE_OPTIONS=$(printf "%s" "$FILTERED_NODE_OPTIONS" | sed 's/^ //')
40
+ if [ -n "$FILTERED_NODE_OPTIONS" ]; then
41
+ export NODE_OPTIONS="$FILTERED_NODE_OPTIONS"
42
+ else
43
+ unset NODE_OPTIONS
44
+ fi
45
+
46
+ exec node "$ROOT_DIR/src/cli.js" "$@"
@@ -1,28 +1,28 @@
1
- # Example agent configuration — copy this to create your own agent.
2
- #
3
- # cp agent.example.toml myagent.toml
4
- # Then edit the values below.
5
-
6
- id = "myagent"
7
- primary_lane = "interactive_primary"
8
- memory_policy = "default"
9
- tool_policy = "interactive_safe"
10
- soul_ref = "config/identity/myagent-soul.md"
11
- purpose_ref = "config/identity/myagent-purpose.md"
12
-
13
- # Where this agent reads/writes workspace files.
14
- # Relative to the Nemoris install directory.
15
- workspace_root = "workspace"
16
-
17
- # Files loaded into context at the start of each turn (optional).
18
- # workspace_context_files = ["MEMORY.md"]
19
- # workspace_context_cap = 8000
20
-
21
- [limits]
22
- max_tokens_per_turn = 16000
23
- max_tool_calls_per_turn = 6
24
- max_runtime_seconds = 120
25
-
26
- [access]
27
- workspace = "rw"
28
- network = "restricted"
1
+ # Example agent configuration — copy this to create your own agent.
2
+ #
3
+ # cp agent.example.toml myagent.toml
4
+ # Then edit the values below.
5
+
6
+ id = "myagent"
7
+ primary_lane = "interactive_primary"
8
+ memory_policy = "default"
9
+ tool_policy = "interactive_safe"
10
+ soul_ref = "config/identity/myagent-soul.md"
11
+ purpose_ref = "config/identity/myagent-purpose.md"
12
+
13
+ # Where this agent reads/writes workspace files.
14
+ # Relative to the Nemoris install directory.
15
+ workspace_root = "workspace"
16
+
17
+ # Files loaded into context at the start of each turn (optional).
18
+ # workspace_context_files = ["MEMORY.md"]
19
+ # workspace_context_cap = 8000
20
+
21
+ [limits]
22
+ max_tokens_per_turn = 16000
23
+ max_tool_calls_per_turn = 6
24
+ max_runtime_seconds = 120
25
+
26
+ [access]
27
+ workspace = "rw"
28
+ network = "restricted"
@@ -0,0 +1,23 @@
1
+ # Generated by nemoris migrate — edit to personalise
2
+ # openclaw_model = "anthropic/claude-sonnet-4-6"
3
+ id = "content"
4
+ primary_lane = "interactive_primary"
5
+ memory_policy = "default"
6
+ tool_policy = "interactive_safe"
7
+ soul_ref = "config/identity/content-soul.md"
8
+ purpose_ref = "config/identity/content-purpose.md"
9
+ workspace_root = "workspace"
10
+ workspace_context_files = ["MEMORY.md", "AGENTS.md"]
11
+ workspace_context_cap = 8000
12
+ checkpoint_policy = "compact"
13
+ skills = ["humanizer", "lee-content-writer", "obsidian", "gog", "agent-browser", "notebooklm"]
14
+ tools_deny = ["cron"]
15
+
16
+ [limits]
17
+ max_tokens_per_turn = 16000
18
+ max_tool_calls_per_turn = 6
19
+ max_runtime_seconds = 120
20
+
21
+ [access]
22
+ workspace = "rw"
23
+ network = "restricted"
@@ -1,22 +1,22 @@
1
- id = "assistant"
2
- primary_lane = "interactive_primary"
3
- memory_policy = "default"
4
- tool_policy = "interactive_safe"
5
- soul_ref = "config/identity/default-soul.md"
6
- purpose_ref = "config/identity/default-purpose.md"
7
- workspace_root = "~/.nemoris/workspace"
8
-
9
- [interaction_contract]
10
- ack_mode = "immediate"
11
- progress_mode = "milestone"
12
- notify_on_done = true
13
- notify_on_error = true
14
-
15
- [limits]
16
- max_tokens_per_turn = 16000
17
- max_tool_calls_per_turn = 6
18
- max_runtime_seconds = 120
19
-
20
- [access]
21
- workspace = "rw"
22
- network = "restricted"
1
+ id = "assistant"
2
+ primary_lane = "interactive_primary"
3
+ memory_policy = "default"
4
+ tool_policy = "interactive_safe"
5
+ soul_ref = "config/identity/default-soul.md"
6
+ purpose_ref = "config/identity/default-purpose.md"
7
+ workspace_root = "~/.nemoris/workspace"
8
+
9
+ [interaction_contract]
10
+ ack_mode = "immediate"
11
+ progress_mode = "milestone"
12
+ notify_on_done = true
13
+ notify_on_error = true
14
+
15
+ [limits]
16
+ max_tokens_per_turn = 16000
17
+ max_tool_calls_per_turn = 6
18
+ max_runtime_seconds = 120
19
+
20
+ [access]
21
+ workspace = "rw"
22
+ network = "restricted"
@@ -0,0 +1,35 @@
1
+ id = "heartbeat"
2
+ workspace_root = "$HOME/Documents/Obsidian_Vault"
3
+ primary_lane = "local_cheap"
4
+ memory_policy = "heartbeat"
5
+ tool_policy = "heartbeat_minimal"
6
+ checkpoint_policy = "none"
7
+ allow_jobs = ["heartbeat-check", "workspace-health"]
8
+ soul_ref = "config/identity/heartbeat-soul.md"
9
+ purpose_ref = "config/identity/heartbeat-purpose.md"
10
+ memory_backends = ["file", "qmd"]
11
+ qmd_supplement_limit = 2
12
+
13
+ [interaction_contract]
14
+ ack_mode = "silent"
15
+ progress_mode = "none"
16
+ notify_on_done = false
17
+ notify_on_error = true
18
+ requires_pingback = false
19
+ pingback_target = "scheduler_log"
20
+ completion_signal = "heartbeat_ok"
21
+ failure_signal = "heartbeat_error"
22
+ handoff_format = "concise_status"
23
+ completion_sections = ["status"]
24
+
25
+ [delivery]
26
+ profile = "shadow_scheduler"
27
+
28
+ [limits]
29
+ max_tokens_per_turn = 4000
30
+ max_tool_calls_per_turn = 3
31
+ max_runtime_seconds = 30
32
+
33
+ [access]
34
+ workspace = "ro"
35
+ network = "restricted"
@@ -0,0 +1,23 @@
1
+ # Generated by nemoris migrate — edit to personalise
2
+ # openclaw_model = "anthropic/claude-haiku-4-5"
3
+ id = "iris"
4
+ primary_lane = "local_cheap"
5
+ memory_policy = "default"
6
+ tool_policy = "interactive_safe"
7
+ soul_ref = "config/identity/iris-soul.md"
8
+ purpose_ref = "config/identity/iris-purpose.md"
9
+ workspace_root = "workspace"
10
+ workspace_context_files = ["MEMORY.md", "AGENTS.md"]
11
+ workspace_context_cap = 8000
12
+ checkpoint_policy = "compact"
13
+ skills = ["agent-review", "implementation-safety", "release-handoff", "self-improvement", "ux-flow-audit", "verification-evidence", "agent-browser", "notebooklm"]
14
+ tools_deny = ["cron"]
15
+
16
+ [limits]
17
+ max_tokens_per_turn = 16000
18
+ max_tool_calls_per_turn = 6
19
+ max_runtime_seconds = 120
20
+
21
+ [access]
22
+ workspace = "rw"
23
+ network = "restricted"
@@ -0,0 +1,23 @@
1
+ # Generated by nemoris migrate — edit to personalise
2
+ # openclaw_model = "openrouter/openai/gpt-5.2"
3
+ id = "lab"
4
+ primary_lane = "interactive_primary"
5
+ memory_policy = "default"
6
+ tool_policy = "interactive_safe"
7
+ soul_ref = "config/identity/lab-soul.md"
8
+ purpose_ref = "config/identity/lab-purpose.md"
9
+ workspace_root = "workspace"
10
+ workspace_context_files = ["MEMORY.md", "AGENTS.md"]
11
+ workspace_context_cap = 8000
12
+ checkpoint_policy = "compact"
13
+ skills = ["model-usage", "self-improvement", "verification-evidence"]
14
+ tools_deny = ["cron"]
15
+
16
+ [limits]
17
+ max_tokens_per_turn = 16000
18
+ max_tool_calls_per_turn = 6
19
+ max_runtime_seconds = 120
20
+
21
+ [access]
22
+ workspace = "rw"
23
+ network = "restricted"
@@ -0,0 +1,45 @@
1
+ id = "main"
2
+ name = "Kodi"
3
+ workspace_root = "workspace"
4
+ primary_lane = "interactive_primary"
5
+ memory_policy = "default"
6
+ tool_policy = "interactive_safe"
7
+ checkpoint_policy = "compact"
8
+ allow_jobs = ["memory-rollup"]
9
+ soul_ref = "config/identity/main-soul.md"
10
+ purpose_ref = "config/identity/main-purpose.md"
11
+ user_ref = "config/identity/main-user.md"
12
+ workspace_context_files = ["MEMORY.md", "AGENTS.md", "SOUL.md", "IDENTITY.md", "USER.md", "TOOLS.md"]
13
+ workspace_context_cap = 12000
14
+ memory_backends = ["file", "qmd"]
15
+ qmd_supplement_limit = 2
16
+
17
+ [interaction_contract]
18
+ ack_mode = "immediate"
19
+ progress_mode = "milestone"
20
+ progress_after_seconds = 120
21
+ max_silence_seconds = 240
22
+ notify_on_done = true
23
+ notify_on_error = true
24
+ requires_pingback = true
25
+ pingback_target = "same_thread"
26
+ completion_signal = "completed"
27
+ failure_signal = "blocked"
28
+ handoff_format = "coding_completion"
29
+ completion_sections = ["status", "changes", "verification", "next_actions"]
30
+
31
+ [delivery]
32
+ profile = "gateway_telegram_main"
33
+
34
+ [limits]
35
+ max_tokens_per_turn = 24000
36
+ max_tool_calls_per_turn = 6
37
+ max_runtime_seconds = 120
38
+ compaction_condensed_fanout = 10
39
+ compaction_threshold_turns = 24
40
+
41
+ exec_approvals = true
42
+
43
+ [access]
44
+ workspace = "rw"
45
+ network = "restricted"
@@ -0,0 +1,21 @@
1
+ id = "nemo"
2
+ primary_lane = "interactive_primary"
3
+ memory_policy = "default"
4
+ tool_policy = "interactive_safe"
5
+ soul_ref = "config/identity/default-soul.md"
6
+ purpose_ref = "config/identity/default-purpose.md"
7
+ workspace_root = "workspace"
8
+ workspace_context_files = ["MEMORY.md", "USER.md", "AGENTS.md"]
9
+ workspace_context_cap = 8000
10
+ checkpoint_policy = "compact"
11
+
12
+ [limits]
13
+ max_tokens_per_turn = 16000
14
+ max_tool_calls_per_turn = 6
15
+ max_runtime_seconds = 120
16
+
17
+ exec_approvals = false
18
+
19
+ [access]
20
+ workspace = "rw"
21
+ network = "restricted"
@@ -0,0 +1,38 @@
1
+ id = "ops"
2
+ workspace_root = "$HOME/.openclaw"
3
+ primary_lane = "local_cheap"
4
+ fallback_lane = "job_heavy"
5
+ memory_policy = "ops"
6
+ tool_policy = "ops_bounded"
7
+ checkpoint_policy = "resumable"
8
+ allow_jobs = ["workspace-health", "memory-rollup"]
9
+ soul_ref = "config/identity/ops-soul.md"
10
+ purpose_ref = "config/identity/ops-purpose.md"
11
+ memory_backends = ["file", "qmd"]
12
+ qmd_supplement_limit = 2
13
+
14
+ [interaction_contract]
15
+ ack_mode = "immediate"
16
+ progress_mode = "long_running"
17
+ progress_after_seconds = 90
18
+ max_silence_seconds = 180
19
+ notify_on_done = true
20
+ notify_on_error = true
21
+ requires_pingback = true
22
+ pingback_target = "same_thread"
23
+ completion_signal = "done"
24
+ failure_signal = "error"
25
+ handoff_format = "structured_handoff"
26
+ completion_sections = ["status", "evidence", "next_actions"]
27
+
28
+ [delivery]
29
+ profile = "gateway_telegram_main"
30
+
31
+ [limits]
32
+ max_tokens_per_turn = 8000
33
+ max_tool_calls_per_turn = 5
34
+ max_runtime_seconds = 90
35
+
36
+ [access]
37
+ workspace = "rw"
38
+ network = "restricted"
@@ -1,18 +1,18 @@
1
- id = "orchestrator"
2
- soul_ref = "config/identity/orchestrator-soul.md"
3
- purpose_ref = "config/identity/orchestrator-purpose.md"
4
- primary_lane = "local_cheap"
5
- fallback_lane = "interactive_fallback"
6
- tool_policy = "orchestrator"
7
- memory_policy = "orchestrator"
8
-
9
- [limits]
10
- max_tokens_per_turn = 2700
11
-
12
- [routing.static]
13
- "heartbeat-check" = "heartbeat"
14
-
15
- [routing.dynamic]
16
- enabled = true
17
- model_lane = "local_cheap"
18
- max_routing_tokens = 500
1
+ id = "orchestrator"
2
+ soul_ref = "config/identity/orchestrator-soul.md"
3
+ purpose_ref = "config/identity/orchestrator-purpose.md"
4
+ primary_lane = "local_cheap"
5
+ fallback_lane = "interactive_fallback"
6
+ tool_policy = "orchestrator"
7
+ memory_policy = "orchestrator"
8
+
9
+ [limits]
10
+ max_tokens_per_turn = 2700
11
+
12
+ [routing.static]
13
+ "heartbeat-check" = "heartbeat"
14
+
15
+ [routing.dynamic]
16
+ enabled = true
17
+ model_lane = "local_cheap"
18
+ max_routing_tokens = 500
@@ -0,0 +1,23 @@
1
+ # Generated by nemoris migrate — edit to personalise
2
+ # openclaw_model = "anthropic/claude-haiku-4-5"
3
+ id = "revenue"
4
+ primary_lane = "local_cheap"
5
+ memory_policy = "default"
6
+ tool_policy = "interactive_safe"
7
+ soul_ref = "config/identity/revenue-soul.md"
8
+ purpose_ref = "config/identity/revenue-purpose.md"
9
+ workspace_root = "workspace"
10
+ workspace_context_files = ["MEMORY.md", "AGENTS.md"]
11
+ workspace_context_cap = 8000
12
+ checkpoint_policy = "compact"
13
+ skills = ["github", "gog", "obsidian", "agent-review", "business-advisor", "codex-agent", "coding-cli-stack", "cursor-agent", "frontend-design", "gemini-agent", "implementation-safety", "lemonsqueezy", "product-autopilot", "reddit-engage", "release-handoff", "self-improvement", "ux-flow-audit", "verification-evidence", "webapp-testing", "agent-browser", "notebooklm"]
14
+ tools_deny = ["cron"]
15
+
16
+ [limits]
17
+ max_tokens_per_turn = 16000
18
+ max_tool_calls_per_turn = 6
19
+ max_runtime_seconds = 120
20
+
21
+ [access]
22
+ workspace = "rw"
23
+ network = "restricted"