@zerwiz/ymir 0.1.16 → 0.1.18
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/.agents/config/app-repos.yaml +38 -0
- package/.claude/settings.json +31 -0
- package/.codex/hooks.json +43 -0
- package/.cursor/hooks.json +33 -0
- package/.pi/extensions/README.md +39 -0
- package/.pi/extensions/gna-pi-watch.ts +15 -0
- package/.pi/extensions/lib/ro-assistant-layout.ts +96 -0
- package/.pi/extensions/lib/ro-operational-user-layout.ts +145 -0
- package/.pi/extensions/lib/ro-visibility.ts +99 -0
- package/.pi/extensions/lib/ro-working-ship.ts +243 -0
- package/.pi/extensions/lib/rodd-operational-input.ts +62 -0
- package/.pi/extensions/lib/skuld-branch-dispatch.ts +252 -0
- package/.pi/extensions/lib/skuld-branch-model-picker.ts +77 -0
- package/.pi/extensions/lib/vordr-sessionstart-supervisor.mjs +48 -0
- package/.pi/extensions/ro.ts +11 -0
- package/.pi/extensions/skuld-branch-supervision.ts +11 -0
- package/.pi/extensions/syn-turnend-guard.ts +11 -0
- package/.pi/mcp.json +16 -0
- package/.pi/mcp.json.example +11 -0
- package/.pi/npm/.gitignore +2 -0
- package/.pi/settings.json +8 -0
- package/.pi/shared/extensions/gna-pi-watch.ts +750 -0
- package/.pi/shared/extensions/herdr-agent-state.ts +257 -0
- package/.pi/shared/extensions/open-editor.ts +509 -0
- package/.pi/shared/extensions/ro.ts +504 -0
- package/.pi/shared/extensions/skuld-branch-supervision.ts +1535 -0
- package/.pi/shared/extensions/syn-turnend-guard.ts +683 -0
- package/.pi/shared/extensions/todo.ts +133 -0
- package/.pi/shared/extensions/ymir-subagents.ts +287 -0
- package/.pi/shared/extensions/ymir-well.ts +130 -0
- package/CHANGELOG.md +23 -0
- package/assets/Ymir.md +4654 -0
- package/assets/healer.html +717 -0
- package/assets/icon-family/family-sheet.png +0 -0
- package/assets/icon-family/hlidskjalf.svg +1 -0
- package/assets/icon-family/sessrumnir.svg +1 -0
- package/assets/icon-family/smidja.svg +1 -0
- package/assets/icon-family/ymir.svg +1 -0
- package/assets/mimirswell.html +880 -0
- package/assets/mock/README.md +16 -0
- package/assets/mock/feeds.ts +175 -0
- package/assets/mock/mock.ts +408 -0
- package/assets/reference/docs/agent-control.md +122 -0
- package/assets/reference/docs/apodex/Appdex_as_Orchestrator_Planner_Reviewer_Assessment.md +176 -0
- package/assets/reference/docs/apodex/Final Report(1).md +198 -0
- package/assets/reference/docs/apodex/Final Report(2).md +54 -0
- package/assets/reference/docs/apodex/Final Report(3).md +40 -0
- package/assets/reference/docs/apodex/Final Report(4).md +234 -0
- package/assets/reference/docs/apodex/Final Report(5).md +13 -0
- package/assets/reference/docs/apodex/Final Report.md +82 -0
- package/assets/reference/docs/architecture.md +392 -0
- package/assets/reference/docs/arm-pretool-check.md +247 -0
- package/assets/reference/docs/calm-mode-feasibility.md +541 -0
- package/assets/reference/docs/calm.md +59 -0
- package/assets/reference/docs/captain-hold-lifecycle.md +96 -0
- package/assets/reference/docs/cd-guard.md +165 -0
- package/assets/reference/docs/cmux-backend.md +133 -0
- package/assets/reference/docs/codex-app-backend.md +57 -0
- package/assets/reference/docs/configuration.md +924 -0
- package/assets/reference/docs/documentation-audiences.json +468 -0
- package/assets/reference/docs/documentation-audiences.md +28 -0
- package/assets/reference/docs/examples/crew-dispatch.json +26 -0
- package/assets/reference/docs/examples/process-event-extension/file-signal.mjs +96 -0
- package/assets/reference/docs/examples/process-event-extension/firstmate-extension.json +15 -0
- package/assets/reference/docs/examples/watched-tools.json +24 -0
- package/assets/reference/docs/examples/wedge-alarm +22 -0
- package/assets/reference/docs/extension-bindings.md +237 -0
- package/assets/reference/docs/fm-test-isolation-proof.json +37 -0
- package/assets/reference/docs/fm-test-isolation-proof.md +149 -0
- package/assets/reference/docs/fm-test-portable-shards.md +118 -0
- package/assets/reference/docs/gitlab-merge-watch.md +275 -0
- package/assets/reference/docs/herdr-backend.md +346 -0
- package/assets/reference/docs/orca-backend.md +84 -0
- package/assets/reference/docs/pi-supervision-branch-poster.svg +125 -0
- package/assets/reference/docs/pi-supervision-branch.md +96 -0
- package/assets/reference/docs/plans/agentic-engineering-workflow.md +395 -0
- package/assets/reference/docs/plans/agentic-factory-implementation-plan.md +615 -0
- package/assets/reference/docs/plans/command-factory-enhancement-plan.md +420 -0
- package/assets/reference/docs/plans/phase-1-layer3-program-design.md +134 -0
- package/assets/reference/docs/plans/phase-2-vertical-slices.md +100 -0
- package/assets/reference/docs/plans/phase-3-measurable-goals.md +106 -0
- package/assets/reference/docs/plans/phase-4-context-budget.md +106 -0
- package/assets/reference/docs/plans/phase-5-pre-mortem-confidence.md +100 -0
- package/assets/reference/docs/plans/phase-6-incident-to-agent.md +109 -0
- package/assets/reference/docs/remote-secondmates.md +268 -0
- package/assets/reference/docs/scripts.md +146 -0
- package/assets/reference/docs/sessionstart-nudge.md +115 -0
- package/assets/reference/docs/subagent-guard.md +383 -0
- package/assets/reference/docs/supervision-protocols/claude.md +27 -0
- package/assets/reference/docs/supervision-protocols/codex.md +16 -0
- package/assets/reference/docs/supervision-protocols/cursor.md +31 -0
- package/assets/reference/docs/supervision-protocols/grok.md +39 -0
- package/assets/reference/docs/supervision-protocols/opencode.md +17 -0
- package/assets/reference/docs/supervision-protocols/pi.md +33 -0
- package/assets/reference/docs/supervision-protocols/unknown.md +13 -0
- package/assets/reference/docs/tmux-backend.md +115 -0
- package/assets/reference/docs/trace-context.md +117 -0
- package/assets/reference/docs/turnend-guard.md +170 -0
- package/assets/reference/docs/verification/dispatch-auth.md +204 -0
- package/assets/reference/docs/verification/muse.md +221 -0
- package/assets/reference/docs/verification/process-event-sources.md +208 -0
- package/assets/reference/docs/verification/public-followup.md +119 -0
- package/assets/reference/docs/verification/runtime-backends.md +1022 -0
- package/assets/reference/docs/verification/stow-memory.md +53 -0
- package/assets/reference/docs/verification/supervision.md +534 -0
- package/assets/reference/docs/verification/trace-context.md +31 -0
- package/assets/reference/docs/voice-relay.md +295 -0
- package/assets/reference/docs/watcher-continuity.md +119 -0
- package/assets/reference/docs/wedge-alarm.md +39 -0
- package/assets/reference/docs/zellij-backend.md +114 -0
- package/assets/reference/index.html +1172 -0
- package/assets/reference/skills/afk/SKILL.md +241 -0
- package/assets/reference/skills/ahoy/SKILL.md +56 -0
- package/assets/reference/skills/ask-user-authority/SKILL.md +56 -0
- package/assets/reference/skills/bearings/SKILL.md +161 -0
- package/assets/reference/skills/bearings/assets/board-template.html +731 -0
- package/assets/reference/skills/bootstrap-diagnostics/SKILL.md +68 -0
- package/assets/reference/skills/captain-hold-lifecycle/SKILL.md +54 -0
- package/assets/reference/skills/decision-hold-lifecycle/SKILL.md +15 -0
- package/assets/reference/skills/diagnostic-reasoning/SKILL.md +53 -0
- package/assets/reference/skills/firstmate-codexapp/SKILL.md +110 -0
- package/assets/reference/skills/firstmate-codexapp/agents/openai.yaml +4 -0
- package/assets/reference/skills/firstmate-coding-guidelines/SKILL.md +127 -0
- package/assets/reference/skills/firstmate-orca/SKILL.md +92 -0
- package/assets/reference/skills/fmx-respond/SKILL.md +283 -0
- package/assets/reference/skills/harness-adapters/SKILL.md +95 -0
- package/assets/reference/skills/harness-adapters/references/common/control-and-recovery.md +37 -0
- package/assets/reference/skills/harness-adapters/references/common/dispatch.md +32 -0
- package/assets/reference/skills/harness-adapters/references/common/model-and-effort.md +42 -0
- package/assets/reference/skills/harness-adapters/references/common/primary-hooks.md +40 -0
- package/assets/reference/skills/harness-adapters/references/harness/claude.md +55 -0
- package/assets/reference/skills/harness-adapters/references/harness/codex.md +43 -0
- package/assets/reference/skills/harness-adapters/references/harness/cursor.md +75 -0
- package/assets/reference/skills/harness-adapters/references/harness/grok.md +69 -0
- package/assets/reference/skills/harness-adapters/references/harness/kimi.md +51 -0
- package/assets/reference/skills/harness-adapters/references/harness/muse.md +70 -0
- package/assets/reference/skills/harness-adapters/references/harness/opencode.md +42 -0
- package/assets/reference/skills/harness-adapters/references/harness/pi.md +56 -0
- package/assets/reference/skills/process-event-sources/SKILL.md +137 -0
- package/assets/reference/skills/project-management/SKILL.md +92 -0
- package/assets/reference/skills/quota-array-dispatch/SKILL.md +131 -0
- package/assets/reference/skills/secondmate-provisioning/SKILL.md +254 -0
- package/assets/reference/skills/stow/SKILL.md +309 -0
- package/assets/reference/skills/stuck-crewmate-recovery/SKILL.md +54 -0
- package/assets/reference/skills/updatefirstmate/SKILL.md +64 -0
- package/assets/skills/README.md +5 -0
- package/assets/yggdrasil.html +649 -0
- package/assets/ymir-banner-01.png +0 -0
- package/assets/ymir-banner-02.png +0 -0
- package/assets/ymir-banner-03.png +0 -0
- package/assets/ymir-banner-04.png +0 -0
- package/assets/ymir-banner-05.png +0 -0
- package/assets/ymir-banner-06.png +0 -0
- package/assets/ymir-emblem-darksteel.svg +63 -0
- package/assets/ymir-emblem-forged.svg +55 -0
- package/assets/ymir-emblem-slate.svg +55 -0
- package/assets/ymir-mark-algiz-anvil.svg +9 -0
- package/assets/ymir-stave.svg +53 -0
- package/assets/ymir.html +563 -0
- package/bin/ymir-install.sh +6 -1
- package/data/learnings.md +33 -0
- package/data/local-models.md +34 -0
- package/data/operator.md +15 -0
- package/data/projects.md +28 -0
- package/data/realm.md +1 -0
- package/deploy/Containerfile +27 -0
- package/deploy/README.md +104 -0
- package/deploy/compose/compose.yaml +45 -0
- package/deploy/env.example +30 -0
- package/deploy/quadlet/ymir.container +57 -0
- package/package.json +10 -8
package/data/projects.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Projects Inventory
|
|
2
|
+
|
|
3
|
+
## Active Projects
|
|
4
|
+
|
|
5
|
+
### Ymir Platform Development
|
|
6
|
+
- Status: Initial setup
|
|
7
|
+
- Description: Core development of the Ymir agent platform
|
|
8
|
+
- Owner: zerwiz (Allfather)
|
|
9
|
+
- Priority: High
|
|
10
|
+
|
|
11
|
+
## Project Structure
|
|
12
|
+
|
|
13
|
+
Each project follows the naming convention:
|
|
14
|
+
{team}-{project-name}
|
|
15
|
+
|
|
16
|
+
Projects are tracked in svartalfaheim/{realm}/workspace/development/
|
|
17
|
+
|
|
18
|
+
## Onboarding Process
|
|
19
|
+
1. Define scope and requirements
|
|
20
|
+
2. Establish team structure
|
|
21
|
+
3. Set up monitoring and alerting
|
|
22
|
+
4. Deploy initial configuration
|
|
23
|
+
5. Validate integration
|
|
24
|
+
|
|
25
|
+
## Resources
|
|
26
|
+
- Git repository: main Ymir platform repo
|
|
27
|
+
- CI/CD pipeline: configured via .github/workflows/
|
|
28
|
+
- Monitoring: integrated with Mimirsbrunn
|
package/data/realm.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
wayof
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Ymir baked image — an OPTIONAL alternative to bind-mounting the checkout.
|
|
2
|
+
#
|
|
3
|
+
# Build with either engine (the core resolves engines; this file does not care):
|
|
4
|
+
# podman build -f deploy/Containerfile -t ymir:local .
|
|
5
|
+
# docker build -f deploy/Containerfile -t ymir:local .
|
|
6
|
+
#
|
|
7
|
+
# The bind-mount examples in deploy/quadlet and deploy/compose are simpler for a
|
|
8
|
+
# self-host box (updates are `git pull`). Use this image when you want an
|
|
9
|
+
# immutable release: pin a tag, roll back by tag.
|
|
10
|
+
#
|
|
11
|
+
# Durable state still needs volumes: state/, workspace/, .agents/memory/,
|
|
12
|
+
# agents/, and apps/*/dist. The image bakes only code.
|
|
13
|
+
|
|
14
|
+
FROM docker.io/oven/bun:1
|
|
15
|
+
|
|
16
|
+
# The core needs git, python3 (the memory well/CLI), curl, and TLS roots.
|
|
17
|
+
RUN apt-get update \
|
|
18
|
+
&& apt-get install -y --no-install-recommends \
|
|
19
|
+
git python3 python3-venv curl ca-certificates \
|
|
20
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
21
|
+
|
|
22
|
+
WORKDIR /opt/ymir
|
|
23
|
+
COPY . /opt/ymir
|
|
24
|
+
ENV YMIR_ROOT=/opt/ymir
|
|
25
|
+
|
|
26
|
+
EXPOSE 38888 38889 54370
|
|
27
|
+
CMD ["bash", "-lc", "cd /opt/ymir && bash scripts/start.sh"]
|
package/deploy/README.md
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Deploy — the agnostic deployment layer
|
|
2
|
+
|
|
3
|
+
Ymir's **core is host-agnostic**: one portable runtime, no provider assumptions.
|
|
4
|
+
A *deployment* is a thin host-managed layer **over** that core — never inside it.
|
|
5
|
+
This directory ships the neutral contract and example layers; adopt whichever
|
|
6
|
+
matches the host.
|
|
7
|
+
|
|
8
|
+
## The neutral contract
|
|
9
|
+
|
|
10
|
+
Any deployment must provide exactly these; nothing more is expected of it:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
contract[6]{needs,example}:
|
|
14
|
+
"the checkout","the Ymir repo available at a path (bind-mount or baked image)"
|
|
15
|
+
"a runtime","git · python3 · curl · bun (the core runs on any of Docker/Podman/bare)"
|
|
16
|
+
"env","HLIDSKJALF_AUTH + realm/env from .env.local (never inline, never committed)"
|
|
17
|
+
"persistent state","state/, workspace/, .agents/memory/, agents/, apps/*/dist — writable and durable"
|
|
18
|
+
"ports","SPA :38888 · gate :38889 · Smíðja visualizer :54370 (5-digit ≤ 65535, env-driven: HLIDSKJALF_PORT · HLIDSKJALF_API_PORT · SMIDJA_VIZ_API_PORT) · well :4602 · Bifrost :4603 internal"
|
|
19
|
+
"a raise command","scripts/start.sh (lower with scripts/stop.sh)"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The engine is resolved by the core (`bin/ymir-platform.sh` → `ymir_container_engine`),
|
|
23
|
+
not by the deployment. A layer never names `docker` or `podman`.
|
|
24
|
+
|
|
25
|
+
## Shapes (pick one; they are equivalent)
|
|
26
|
+
|
|
27
|
+
| Shape | When | Path |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| **Bare** | a dedicated box, or a container you already manage | `scripts/start.sh` directly |
|
|
30
|
+
| **Quadlet** (Podman + systemd) | a Fedora/RHEL host running rootless Podman | `deploy/quadlet/ymir.container` |
|
|
31
|
+
| **Compose** (Docker or `podman-compose`) | a Docker host or mixed fleet | `deploy/compose/compose.yaml` |
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
# bare
|
|
35
|
+
scripts/start.sh
|
|
36
|
+
|
|
37
|
+
# quadlet (rootless, per-user)
|
|
38
|
+
cp deploy/quadlet/ymir.container ~/.config/containers/systemd/
|
|
39
|
+
systemctl --user daemon-reload && systemctl --user start ymir.service
|
|
40
|
+
|
|
41
|
+
# compose
|
|
42
|
+
cp deploy/env.example .env # then edit; never commit
|
|
43
|
+
docker compose -f deploy/compose/compose.yaml up -d
|
|
44
|
+
# or: podman-compose -f deploy/compose/compose.yaml up -d
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Baked image (optional)
|
|
48
|
+
|
|
49
|
+
Prefer an immutable release to a bind-mounted checkout? Build `deploy/Containerfile`
|
|
50
|
+
with either engine and point the Quadlet/Compose `Image=` at your tag:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
podman build -f deploy/Containerfile -t ymir:0.1.0 . # or: docker build …
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Durable state still needs volumes (`state/`, `workspace/`, `.agents/memory/`,
|
|
57
|
+
`agents/`, `apps/*/dist`) — the image bakes only code. Validated: the Quadlet unit
|
|
58
|
+
passes Podman's own generator (`/usr/libexec/podman/quadlet -dryrun -user`).
|
|
59
|
+
|
|
60
|
+
## Isolation on a **shared** server
|
|
61
|
+
|
|
62
|
+
When Ymir shares a machine with other services, the **container is the boundary**:
|
|
63
|
+
rootless Podman gives Ymir its own mount namespace, user namespace, cgroup limits,
|
|
64
|
+
SELinux labels, and no host root. That is what stops Ymir from disturbing the rest
|
|
65
|
+
of the box — not bwrap.
|
|
66
|
+
|
|
67
|
+
The confinement layers, from the outside in:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
isolation[3]{layer,boundary,when}:
|
|
71
|
+
"Host ↔ Ymir","the container (Quadlet/Compose): rootless, cap-drop ALL, no-new-privileges, :Z labels","always, on a shared host"
|
|
72
|
+
"Ymir ↔ agent command","bwrap — scopes a single model-generated command to one worktree","only when the probe passes; never required"
|
|
73
|
+
"Ymir ↔ untrusted code","Utgard (a nested container) or the container itself","for code the agent writes and runs"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### bwrap inside the Quadlet
|
|
77
|
+
|
|
78
|
+
bwrap needs to create a **nested user namespace**. Rootless Podman containers are
|
|
79
|
+
already inside a user namespace, and many hardened configs disallow nesting — then
|
|
80
|
+
bwrap fails with `Creating new namespace failed: Operation not permitted`.
|
|
81
|
+
|
|
82
|
+
So: **do not force it.** The core probes with `bin/ymir-isolation.sh probe` and falls
|
|
83
|
+
back to the container boundary when nested namespaces are unavailable. If you want
|
|
84
|
+
bwrap *inside* the Quadlet, the container must opt in (and that loosens it — weigh
|
|
85
|
+
it against the boundary you gain):
|
|
86
|
+
|
|
87
|
+
```ini
|
|
88
|
+
# deploy/quadlet/ymir.container — enable ONLY if you want bwrap inside
|
|
89
|
+
UserNS=keep-id
|
|
90
|
+
AddCapability=SYS_ADMIN
|
|
91
|
+
# and, where the host's seccomp profile blocks clone3/unshare:
|
|
92
|
+
# SecurityOpt=seccomp=unconfined
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The recommended posture on a shared server is **no bwrap inside**: trust the
|
|
96
|
+
rootless container as the wall, and run untrusted code in Utgard. Enable the block
|
|
97
|
+
above only when you have a specific need to confine individual commands and accept
|
|
98
|
+
the looser container.
|
|
99
|
+
|
|
100
|
+
## Portability (Rule 05)
|
|
101
|
+
|
|
102
|
+
A layer is gated on its host and reports a clean skip elsewhere — the Quadlet layer
|
|
103
|
+
is a no-op on macOS, and Compose is a no-op on a bare box. When the core changes,
|
|
104
|
+
every layer here is updated in the same change.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Ymir via Compose — works with `docker compose` and `podman-compose`.
|
|
2
|
+
#
|
|
3
|
+
# cp deploy/env.example .env # then edit; never commit
|
|
4
|
+
# docker compose -f deploy/compose/compose.yaml up -d
|
|
5
|
+
# podman-compose -f deploy/compose/compose.yaml up -d
|
|
6
|
+
#
|
|
7
|
+
# YMIR_ROOT is the host path to the checkout (default: this repo). The core
|
|
8
|
+
# resolves the container engine itself; this file never names one beyond the
|
|
9
|
+
# compose driver you invoke.
|
|
10
|
+
|
|
11
|
+
services:
|
|
12
|
+
ymir:
|
|
13
|
+
image: docker.io/oven/bun:1
|
|
14
|
+
container_name: ymir
|
|
15
|
+
working_dir: /opt/ymir
|
|
16
|
+
command: ["bash", "-lc", "cd /opt/ymir && bash scripts/start.sh"]
|
|
17
|
+
volumes:
|
|
18
|
+
# `:Z` relabels for SELinux hosts; harmless elsewhere.
|
|
19
|
+
- ${YMIR_ROOT:-../..}:/opt/ymir:Z
|
|
20
|
+
ports:
|
|
21
|
+
# Loopback-only (127.0.0.1) so Ymir is never exposed externally; 5-digit to
|
|
22
|
+
# avoid collisions on a shared host. Keep in step with HLIDSKJALF_PORT /
|
|
23
|
+
# HLIDSKJALF_API_PORT / SMIDJA_VIZ_API_PORT.
|
|
24
|
+
- "127.0.0.1:38888:38888" # SPA
|
|
25
|
+
- "127.0.0.1:38889:38889" # gate API
|
|
26
|
+
- "127.0.0.1:54370:54370" # Smíðja visualizer
|
|
27
|
+
env_file:
|
|
28
|
+
- ${YMIR_ENV:-../../.env.local}
|
|
29
|
+
environment:
|
|
30
|
+
# Override durable state if you keep it outside the checkout.
|
|
31
|
+
YMIR_ROOT: /opt/ymir
|
|
32
|
+
security_opt:
|
|
33
|
+
- no-new-privileges:true
|
|
34
|
+
cap_drop:
|
|
35
|
+
- ALL
|
|
36
|
+
tmpfs:
|
|
37
|
+
- /tmp
|
|
38
|
+
# Podman rootless: keep the host user so the bind mount stays yours.
|
|
39
|
+
# Docker users: comment this out (Docker only accepts `host`/`private`).
|
|
40
|
+
userns_mode: keep-id
|
|
41
|
+
restart: unless-stopped
|
|
42
|
+
|
|
43
|
+
# --- bwrap inside the container (OPTIONAL; loosens the boundary) ----------
|
|
44
|
+
# cap_add: [SYS_ADMIN]
|
|
45
|
+
# security_opt: ["no-new-privileges:true", "seccomp=unconfined"]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Ymir deployment environment — copy and edit, keep 0600, never commit.
|
|
2
|
+
# Referenced by deploy/quadlet/ymir.container (EnvironmentFile) and
|
|
3
|
+
# deploy/compose/compose.yaml (env_file).
|
|
4
|
+
|
|
5
|
+
# The operator's own credentials: user:password. Everyone else enters by invite.
|
|
6
|
+
# NEVER inline this in a committed file — this example is a reference only.
|
|
7
|
+
HLIDSKJALF_AUTH=
|
|
8
|
+
|
|
9
|
+
# The memory well's HTTP bridge (in-container default).
|
|
10
|
+
MIMIRSBRUNN_URL=http://127.0.0.1:4602
|
|
11
|
+
|
|
12
|
+
# GitHub sign-in (optional; the password door always works without it).
|
|
13
|
+
GITHUB_CLIENT_ID=
|
|
14
|
+
GITHUB_CLIENT_SECRET=
|
|
15
|
+
|
|
16
|
+
# --- container engine (only if you must force one) --------------------------
|
|
17
|
+
# The core auto-detects docker|podman; set this only to override.
|
|
18
|
+
# YMIR_CONTAINER_ENGINE=podman
|
|
19
|
+
|
|
20
|
+
# --- ports -------------------------------------------------------------------
|
|
21
|
+
# 5-digit by default so a shared host is unlikely to collide. The SPA, the gate
|
|
22
|
+
# API, and the visualizer each take one; keep the Quadlet/Compose PublishPort in
|
|
23
|
+
# step with these.
|
|
24
|
+
HLIDSKJALF_PORT=38888 # SPA
|
|
25
|
+
HLIDSKJALF_API_PORT=38889 # gate API
|
|
26
|
+
SMIDJA_VIZ_API_PORT=54370 # Smíðja visualizer
|
|
27
|
+
# Inside a container the SPA must bind all interfaces so the published (loopback)
|
|
28
|
+
# port can reach it; bare local dev keeps the 127.0.0.1 default.
|
|
29
|
+
HLIDSKJALF_HOST=0.0.0.0
|
|
30
|
+
# SMIDJA_VIZ_URL=http://127.0.0.1:54370
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Ymir as a rootless Podman Quadlet (systemd --user).
|
|
2
|
+
#
|
|
3
|
+
# Install (per-user, rootless):
|
|
4
|
+
# mkdir -p ~/.config/containers/systemd ~/.config/ymir
|
|
5
|
+
# cp deploy/quadlet/ymir.container ~/.config/containers/systemd/
|
|
6
|
+
# cp deploy/env.example ~/.config/ymir/ymir.env # then edit (0600)
|
|
7
|
+
# systemctl --user daemon-reload && systemctl --user start ymir.service
|
|
8
|
+
#
|
|
9
|
+
# The container is the isolation boundary against other services on the host.
|
|
10
|
+
# bwrap inside the container is OFF by default (see deploy/README.md).
|
|
11
|
+
|
|
12
|
+
[Unit]
|
|
13
|
+
Description=Ymir substrate — Hlidskjalf, gate API, memory well
|
|
14
|
+
Wants=network-online.target
|
|
15
|
+
After=network-online.target
|
|
16
|
+
|
|
17
|
+
[Container]
|
|
18
|
+
Image=docker.io/oven/bun:1
|
|
19
|
+
ContainerName=ymir
|
|
20
|
+
|
|
21
|
+
# The checkout, bind-mounted; state lives with it, so updates are `git pull`.
|
|
22
|
+
# `:Z` relabels for SELinux (harmless where SELinux is off).
|
|
23
|
+
Volume=%h/dev/Way-Of/ymir:/opt/ymir:Z
|
|
24
|
+
|
|
25
|
+
WorkingDir=/opt/ymir
|
|
26
|
+
EnvironmentFile=%h/.config/ymir/ymir.env
|
|
27
|
+
|
|
28
|
+
# Host ports, bound to LOOPBACK only (127.0.0.1) so Ymir is never exposed on the
|
|
29
|
+
# host's external interfaces — a shared server stays shared, not public. 5-digit
|
|
30
|
+
# so a shared host is unlikely to collide; keep in step with HLIDSKJALF_PORT /
|
|
31
|
+
# HLIDSKJALF_API_PORT / SMIDJA_VIZ_API_PORT. The well/Bifrost stay internal.
|
|
32
|
+
PublishPort=127.0.0.1:38889:38889
|
|
33
|
+
PublishPort=127.0.0.1:38888:38888
|
|
34
|
+
PublishPort=127.0.0.1:54370:54370
|
|
35
|
+
|
|
36
|
+
# Hardening: rootless, no new privileges, drop every capability. Ymir needs none.
|
|
37
|
+
NoNewPrivileges=true
|
|
38
|
+
DropCapability=ALL
|
|
39
|
+
Tmpfs=/tmp
|
|
40
|
+
|
|
41
|
+
# Map the host user so the bind-mounted checkout stays owned by you.
|
|
42
|
+
UserNS=keep-id
|
|
43
|
+
|
|
44
|
+
# --- bwrap inside the container (OPTIONAL; loosens the boundary) --------------
|
|
45
|
+
# Enable only if you want per-command bwrap confinement. Uncommenting grants the
|
|
46
|
+
# container the ability to create nested namespaces.
|
|
47
|
+
# AddCapability=SYS_ADMIN
|
|
48
|
+
# SecurityOpt=seccomp=unconfined
|
|
49
|
+
|
|
50
|
+
Exec=bash -lc 'cd /opt/ymir && bash scripts/start.sh'
|
|
51
|
+
|
|
52
|
+
[Service]
|
|
53
|
+
Restart=on-failure
|
|
54
|
+
TimeoutStartSec=0
|
|
55
|
+
|
|
56
|
+
[Install]
|
|
57
|
+
WantedBy=default.target
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zerwiz/ymir",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.18",
|
|
4
4
|
"description": "Ymir \u2014 the single-tenant agent operating system. Omarchy-first, host-aware, self-healing.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/zerwiz/ymir",
|
|
@@ -43,7 +43,15 @@
|
|
|
43
43
|
"!.agents/memory/well/*.jsonl",
|
|
44
44
|
"!.agents/memory/*.db",
|
|
45
45
|
"!**/__pycache__/",
|
|
46
|
-
"!**/*.pyc"
|
|
46
|
+
"!**/*.pyc",
|
|
47
|
+
".pi/",
|
|
48
|
+
".opencode/",
|
|
49
|
+
".claude/",
|
|
50
|
+
".codex/",
|
|
51
|
+
".cursor/",
|
|
52
|
+
"assets/",
|
|
53
|
+
"data/",
|
|
54
|
+
"deploy/"
|
|
47
55
|
],
|
|
48
56
|
"engines": {
|
|
49
57
|
"node": ">=20"
|
|
@@ -59,12 +67,6 @@
|
|
|
59
67
|
"test": "bash .agents/skills/galdr-ymirsystem/scripts/compliance-check.sh",
|
|
60
68
|
"compliance": "bash .agents/skills/galdr-ymirsystem/scripts/compliance-check.sh"
|
|
61
69
|
},
|
|
62
|
-
"optionalDependencies": {
|
|
63
|
-
"@zerwiz/hlidskjalf": "0.1.1",
|
|
64
|
-
"@zerwiz/odrerir": "0.1.1",
|
|
65
|
-
"@zerwiz/sessrumnir": "0.1.9",
|
|
66
|
-
"@zerwiz/smidja-factory": "^0.1.0"
|
|
67
|
-
},
|
|
68
70
|
"dependencies": {
|
|
69
71
|
"@zerwiz/hlidskjalf": "^0.1.1",
|
|
70
72
|
"@zerwiz/odrerir": "^0.1.1",
|