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.
- package/.env.example +49 -49
- package/LICENSE +21 -21
- package/README.md +209 -209
- package/SECURITY.md +59 -119
- package/bin/nemoris +46 -46
- package/config/agents/agent.toml.example +28 -28
- package/config/agents/content.toml +23 -0
- package/config/agents/default.toml +22 -22
- package/config/agents/heartbeat.toml +35 -0
- package/config/agents/iris.toml +23 -0
- package/config/agents/lab.toml +23 -0
- package/config/agents/main.toml +45 -0
- package/config/agents/nemo.toml +21 -0
- package/config/agents/ops.toml +38 -0
- package/config/agents/orchestrator.toml +18 -18
- package/config/agents/revenue.toml +23 -0
- package/config/agents/testyboo.toml +19 -0
- package/config/delivery.toml +73 -73
- package/config/embeddings.toml +5 -5
- package/config/identity/content-purpose.md +11 -0
- package/config/identity/content-soul.md +45 -0
- package/config/identity/default-purpose.md +1 -1
- package/config/identity/default-soul.md +3 -3
- package/config/identity/heartbeat-purpose.md +9 -0
- package/config/identity/heartbeat-soul.md +16 -0
- package/config/identity/iris-purpose.md +17 -0
- package/config/identity/iris-soul.md +68 -0
- package/config/identity/lab-purpose.md +10 -0
- package/config/identity/lab-soul.md +38 -0
- package/config/identity/main-purpose.md +17 -0
- package/config/identity/main-soul.md +66 -0
- package/config/identity/main-user.md +22 -0
- package/config/identity/ops-purpose.md +9 -0
- package/config/identity/ops-soul.md +16 -0
- package/config/identity/orchestrator-purpose.md +1 -1
- package/config/identity/orchestrator-soul.md +1 -1
- package/config/identity/revenue-purpose.md +9 -0
- package/config/identity/revenue-soul.md +41 -0
- package/config/identity/testyboo-purpose.md +13 -0
- package/config/identity/testyboo-soul.md +20 -0
- package/config/improvement-targets.toml +15 -15
- package/config/jobs/heartbeat-check.toml +30 -30
- package/config/jobs/memory-rollup.toml +46 -46
- package/config/jobs/workspace-health.toml +63 -63
- package/config/mcp.toml +16 -16
- package/config/output-contracts.toml +17 -17
- package/config/peers.toml +32 -32
- package/config/peers.toml.example +32 -32
- package/config/policies/memory-default.toml +10 -10
- package/config/policies/memory-heartbeat.toml +5 -5
- package/config/policies/memory-ops.toml +10 -10
- package/config/policies/tools-heartbeat-minimal.toml +8 -8
- package/config/policies/tools-interactive-safe.toml +8 -8
- package/config/policies/tools-ops-bounded.toml +8 -8
- package/config/policies/tools-orchestrator.toml +7 -7
- package/config/providers/anthropic.toml +15 -15
- package/config/providers/ollama.toml +5 -5
- package/config/providers/openai-codex.toml +9 -9
- package/config/providers/openrouter.toml +5 -5
- package/config/router.toml +22 -22
- package/config/runtime.toml +114 -114
- package/config/skills/self-improvement.toml +15 -15
- package/config/skills/telegram-onboarding-spec.md +240 -240
- package/config/skills/workspace-monitor.toml +15 -15
- package/config/task-router.toml +42 -42
- package/install.sh +50 -50
- package/package.json +91 -90
- package/src/auth/auth-profiles.js +169 -169
- package/src/auth/openai-codex-oauth.js +285 -285
- package/src/battle.js +449 -449
- package/src/cli/help.js +265 -265
- package/src/cli/output-filter.js +49 -49
- package/src/cli/runtime-control.js +704 -704
- package/src/cli-main.js +2763 -2763
- package/src/cli.js +78 -78
- package/src/config/loader.js +332 -332
- package/src/config/schema-validator.js +214 -214
- package/src/config/toml-lite.js +8 -8
- package/src/daemon/action-handlers.js +71 -71
- package/src/daemon/healing-tick.js +87 -87
- package/src/daemon/health-probes.js +90 -90
- package/src/daemon/notifier.js +57 -57
- package/src/daemon/nurse.js +218 -218
- package/src/daemon/repair-log.js +106 -106
- package/src/daemon/rule-staging.js +90 -90
- package/src/daemon/rules.js +29 -29
- package/src/daemon/telegram-commands.js +54 -54
- package/src/daemon/updater.js +85 -85
- package/src/jobs/job-runner.js +78 -78
- package/src/mcp/consumer.js +129 -129
- package/src/memory/active-recall.js +171 -171
- package/src/memory/backend-manager.js +97 -97
- package/src/memory/backends/file-backend.js +38 -38
- package/src/memory/backends/qmd-backend.js +219 -219
- package/src/memory/embedding-guards.js +24 -24
- package/src/memory/embedding-index.js +118 -118
- package/src/memory/embedding-service.js +179 -179
- package/src/memory/file-index.js +177 -177
- package/src/memory/memory-signature.js +5 -5
- package/src/memory/memory-store.js +648 -648
- package/src/memory/retrieval-planner.js +66 -66
- package/src/memory/scoring.js +145 -145
- package/src/memory/simhash.js +78 -78
- package/src/memory/sqlite-active-store.js +824 -824
- package/src/memory/write-policy.js +36 -36
- package/src/onboarding/aliases.js +33 -33
- package/src/onboarding/auth/api-key.js +224 -224
- package/src/onboarding/auth/ollama-detect.js +42 -42
- package/src/onboarding/clack-prompter.js +77 -77
- package/src/onboarding/doctor.js +530 -530
- package/src/onboarding/lock.js +42 -42
- package/src/onboarding/model-catalog.js +344 -344
- package/src/onboarding/phases/auth.js +576 -589
- package/src/onboarding/phases/build.js +130 -130
- package/src/onboarding/phases/choose.js +82 -82
- package/src/onboarding/phases/detect.js +98 -98
- package/src/onboarding/phases/hatch.js +216 -216
- package/src/onboarding/phases/identity.js +79 -79
- package/src/onboarding/phases/ollama.js +345 -345
- package/src/onboarding/phases/scaffold.js +99 -99
- package/src/onboarding/phases/telegram.js +377 -377
- package/src/onboarding/phases/validate.js +204 -204
- package/src/onboarding/phases/verify.js +206 -206
- package/src/onboarding/platform.js +482 -482
- package/src/onboarding/status-bar.js +95 -95
- package/src/onboarding/templates.js +794 -794
- package/src/onboarding/toml-writer.js +38 -38
- package/src/onboarding/tui.js +250 -250
- package/src/onboarding/uninstall.js +153 -153
- package/src/onboarding/wizard.js +516 -499
- package/src/providers/anthropic.js +168 -168
- package/src/providers/base.js +247 -247
- package/src/providers/circuit-breaker.js +136 -136
- package/src/providers/ollama.js +163 -163
- package/src/providers/openai-codex.js +149 -149
- package/src/providers/openrouter.js +136 -136
- package/src/providers/registry.js +36 -36
- package/src/providers/router.js +16 -16
- package/src/runtime/bootstrap-cache.js +47 -47
- package/src/runtime/capabilities-prompt.js +25 -25
- package/src/runtime/completion-ping.js +99 -99
- package/src/runtime/config-validator.js +121 -121
- package/src/runtime/context-ledger.js +360 -360
- package/src/runtime/cutover-readiness.js +42 -42
- package/src/runtime/daemon.js +729 -729
- package/src/runtime/delivery-ack.js +195 -195
- package/src/runtime/delivery-adapters/local-file.js +41 -41
- package/src/runtime/delivery-adapters/openclaw-cli.js +94 -94
- package/src/runtime/delivery-adapters/openclaw-peer.js +98 -98
- package/src/runtime/delivery-adapters/shadow.js +13 -13
- package/src/runtime/delivery-adapters/standalone-http.js +98 -98
- package/src/runtime/delivery-adapters/telegram.js +104 -104
- package/src/runtime/delivery-adapters/tui.js +128 -128
- package/src/runtime/delivery-manager.js +807 -807
- package/src/runtime/delivery-store.js +168 -168
- package/src/runtime/dependency-health.js +118 -118
- package/src/runtime/envelope.js +114 -114
- package/src/runtime/evaluation.js +1089 -1089
- package/src/runtime/exec-approvals.js +216 -216
- package/src/runtime/executor.js +500 -500
- package/src/runtime/failure-ping.js +67 -67
- package/src/runtime/flows.js +83 -83
- package/src/runtime/guards.js +45 -45
- package/src/runtime/handoff.js +51 -51
- package/src/runtime/identity-cache.js +28 -28
- package/src/runtime/improvement-engine.js +109 -109
- package/src/runtime/improvement-harness.js +581 -581
- package/src/runtime/input-sanitiser.js +72 -72
- package/src/runtime/interaction-contract.js +347 -347
- package/src/runtime/lane-readiness.js +226 -226
- package/src/runtime/migration.js +323 -323
- package/src/runtime/model-resolution.js +78 -78
- package/src/runtime/network.js +64 -64
- package/src/runtime/notification-store.js +97 -97
- package/src/runtime/notifier.js +256 -256
- package/src/runtime/orchestrator.js +53 -53
- package/src/runtime/orphan-reaper.js +41 -41
- package/src/runtime/output-contract-schema.js +139 -139
- package/src/runtime/output-contract-validator.js +439 -439
- package/src/runtime/peer-readiness.js +69 -69
- package/src/runtime/peer-registry.js +133 -133
- package/src/runtime/pilot-status.js +108 -108
- package/src/runtime/prompt-builder.js +261 -261
- package/src/runtime/provider-attempt.js +582 -582
- package/src/runtime/report-fallback.js +71 -71
- package/src/runtime/result-normalizer.js +183 -183
- package/src/runtime/retention.js +74 -74
- package/src/runtime/review.js +244 -244
- package/src/runtime/route-job.js +15 -15
- package/src/runtime/run-store.js +38 -38
- package/src/runtime/schedule.js +88 -88
- package/src/runtime/scheduler-state.js +434 -434
- package/src/runtime/scheduler.js +656 -656
- package/src/runtime/session-compactor.js +182 -182
- package/src/runtime/session-search.js +155 -155
- package/src/runtime/slack-inbound.js +249 -249
- package/src/runtime/ssrf.js +102 -102
- package/src/runtime/status-aggregator.js +330 -330
- package/src/runtime/task-contract.js +140 -140
- package/src/runtime/task-packet.js +107 -107
- package/src/runtime/task-router.js +140 -140
- package/src/runtime/telegram-inbound.js +1565 -1565
- package/src/runtime/token-counter.js +134 -134
- package/src/runtime/token-estimator.js +59 -59
- package/src/runtime/tool-loop.js +200 -200
- package/src/runtime/transport-server.js +311 -311
- package/src/runtime/tui-server.js +411 -411
- package/src/runtime/ulid.js +44 -44
- package/src/security/ssrf-check.js +197 -197
- package/src/setup.js +369 -369
- package/src/shadow/bridge.js +303 -303
- package/src/skills/loader.js +84 -84
- package/src/tools/catalog.json +49 -49
- package/src/tools/cli-delegate.js +44 -44
- package/src/tools/mcp-client.js +106 -106
- package/src/tools/micro/cancel-task.js +6 -6
- package/src/tools/micro/complete-task.js +6 -6
- package/src/tools/micro/fail-task.js +6 -6
- package/src/tools/micro/http-fetch.js +74 -74
- package/src/tools/micro/index.js +36 -36
- package/src/tools/micro/lcm-recall.js +60 -60
- package/src/tools/micro/list-dir.js +17 -17
- package/src/tools/micro/list-skills.js +46 -46
- package/src/tools/micro/load-skill.js +38 -38
- package/src/tools/micro/memory-search.js +45 -45
- package/src/tools/micro/read-file.js +11 -11
- package/src/tools/micro/session-search.js +54 -54
- package/src/tools/micro/shell-exec.js +43 -43
- package/src/tools/micro/trigger-job.js +79 -79
- package/src/tools/micro/web-search.js +58 -58
- package/src/tools/micro/workspace-paths.js +39 -39
- package/src/tools/micro/write-file.js +14 -14
- package/src/tools/micro/write-memory.js +41 -41
- package/src/tools/registry.js +348 -348
- package/src/tools/tool-result-contract.js +36 -36
- package/src/tui/chat.js +835 -835
- package/src/tui/renderer.js +175 -175
- package/src/tui/socket-client.js +217 -217
- package/src/utils/canonical-json.js +29 -29
- package/src/utils/compaction.js +30 -30
- package/src/utils/env-loader.js +5 -5
- package/src/utils/errors.js +80 -80
- package/src/utils/fs.js +101 -101
- package/src/utils/ids.js +5 -5
- package/src/utils/model-context-limits.js +30 -30
- package/src/utils/token-budget.js +74 -74
- package/src/utils/usage-cost.js +25 -25
- package/src/utils/usage-metrics.js +14 -14
package/SECURITY.md
CHANGED
|
@@ -1,119 +1,59 @@
|
|
|
1
|
-
# Security Policy
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
- the
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
##
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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"
|