@aman_asmuei/aman 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Dockerfile ADDED
@@ -0,0 +1,47 @@
1
+ # aman ecosystem — full AI companion in one container
2
+ # Includes: aman-agent (CLI) + achannel (Telegram/Discord/webhook) + aman-mcp + amem
3
+ #
4
+ # Build: docker build -t aman .
5
+ # Run: docker run -it -e ANTHROPIC_API_KEY=sk-... aman
6
+ # Serve: docker run -d -p 3000:3000 -e ANTHROPIC_API_KEY=sk-... aman serve
7
+
8
+ FROM node:22-alpine AS base
9
+
10
+ # Install system dependencies
11
+ RUN apk add --no-cache git curl
12
+
13
+ WORKDIR /app
14
+
15
+ # Install all ecosystem packages globally
16
+ RUN npm install -g \
17
+ @aman_asmuei/aman-agent@latest \
18
+ @aman_asmuei/aman-mcp@latest \
19
+ @aman_asmuei/achannel@latest \
20
+ @aman_asmuei/aman@latest
21
+
22
+ # Create ecosystem directories
23
+ RUN mkdir -p /root/.acore /root/.amem /root/.akit /root/.aflow \
24
+ /root/.arules /root/.aeval /root/.askill /root/.aman-agent
25
+
26
+ # Default environment
27
+ ENV NODE_ENV=production
28
+ ENV AMEM_DB_PATH=/root/.amem/memory.db
29
+
30
+ # Volumes for persistent data
31
+ VOLUME ["/root/.acore", "/root/.amem", "/root/.aman-agent"]
32
+
33
+ # Expose webhook port (achannel serve)
34
+ EXPOSE 3000
35
+
36
+ # Healthcheck for server mode
37
+ HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
38
+ CMD curl -f http://localhost:3000/status || exit 1
39
+
40
+ # Entrypoint script
41
+ COPY docker-entrypoint.sh /usr/local/bin/
42
+ RUN chmod +x /usr/local/bin/docker-entrypoint.sh
43
+
44
+ ENTRYPOINT ["docker-entrypoint.sh"]
45
+
46
+ # Default: interactive CLI mode
47
+ CMD ["agent"]
@@ -0,0 +1,29 @@
1
+ [Unit]
2
+ Description=aman AI companion server
3
+ After=network.target
4
+ Wants=network-online.target
5
+
6
+ [Service]
7
+ Type=simple
8
+ User=aman
9
+ WorkingDirectory=/home/aman
10
+ ExecStart=/usr/bin/npx @aman_asmuei/achannel serve
11
+ Restart=always
12
+ RestartSec=10
13
+
14
+ # Environment — set your API key
15
+ EnvironmentFile=/home/aman/.aman-agent/env
16
+
17
+ # Logging
18
+ StandardOutput=journal
19
+ StandardError=journal
20
+ SyslogIdentifier=aman
21
+
22
+ # Security hardening
23
+ NoNewPrivileges=true
24
+ ProtectSystem=strict
25
+ ProtectHome=read-only
26
+ ReadWritePaths=/home/aman/.acore /home/aman/.amem /home/aman/.aman-agent /home/aman/.aeval /home/aman/.arules /home/aman/.aflow /home/aman/.akit /home/aman/.askill
27
+
28
+ [Install]
29
+ WantedBy=multi-user.target
package/dist/index.js CHANGED
@@ -32,8 +32,8 @@ function detectPlatform(cwd) {
32
32
  const raw = fs.readFileSync(configPath, "utf-8");
33
33
  const parsed = JSON.parse(raw);
34
34
  if (typeof parsed.platform === "string") {
35
- const p3 = parsed.platform;
36
- if (p3 === "claude-code" || p3 === "cursor" || p3 === "windsurf") return p3;
35
+ const p4 = parsed.platform;
36
+ if (p4 === "claude-code" || p4 === "cursor" || p4 === "windsurf") return p4;
37
37
  }
38
38
  } catch {
39
39
  }
@@ -628,9 +628,217 @@ function statusCommand() {
628
628
  p2.outro("");
629
629
  }
630
630
 
631
+ // src/commands/deploy.ts
632
+ import fs6 from "fs";
633
+ import path4 from "path";
634
+ import * as p3 from "@clack/prompts";
635
+ import pc3 from "picocolors";
636
+ async function deployCommand() {
637
+ p3.intro(pc3.bold("aman deploy") + pc3.dim(" \u2014 deploy your AI companion anywhere"));
638
+ const method = await p3.select({
639
+ message: "How do you want to deploy?",
640
+ options: [
641
+ { value: "docker", label: "Docker Compose", hint: "VPS, home server, Raspberry Pi" },
642
+ { value: "ollama", label: "Docker + Ollama", hint: "fully local, no API key needed" },
643
+ { value: "systemd", label: "Systemd service", hint: "bare metal Linux / Raspberry Pi" },
644
+ { value: "manual", label: "Show me the commands", hint: "I'll do it myself" }
645
+ ]
646
+ });
647
+ if (p3.isCancel(method)) {
648
+ p3.cancel("Cancelled.");
649
+ return;
650
+ }
651
+ const cwd = process.cwd();
652
+ switch (method) {
653
+ case "docker": {
654
+ await deployDocker(cwd);
655
+ break;
656
+ }
657
+ case "ollama": {
658
+ await deployOllama(cwd);
659
+ break;
660
+ }
661
+ case "systemd": {
662
+ deploySystemd();
663
+ break;
664
+ }
665
+ case "manual": {
666
+ deployManual();
667
+ break;
668
+ }
669
+ }
670
+ p3.outro(pc3.green("Done!"));
671
+ }
672
+ async function deployDocker(cwd) {
673
+ const apiKey = await p3.text({
674
+ message: "Your LLM API key (Anthropic or OpenAI):",
675
+ placeholder: "sk-ant-... or sk-...",
676
+ validate: (v) => v.length < 10 ? "API key too short" : void 0
677
+ });
678
+ if (p3.isCancel(apiKey)) return;
679
+ const isAnthropic = apiKey.startsWith("sk-ant");
680
+ const provider = isAnthropic ? "ANTHROPIC_API_KEY" : "OPENAI_API_KEY";
681
+ const envContent = `# aman ecosystem \u2014 deployment config
682
+ ${provider}=${apiKey}
683
+ AMAN_AI_NAME=Aman
684
+ AMAN_MODEL=${isAnthropic ? "claude-sonnet-4-6" : "gpt-4o"}
685
+
686
+ # Optional: Telegram/Discord bots
687
+ # TELEGRAM_BOT_TOKEN=
688
+ # DISCORD_BOT_TOKEN=
689
+ `;
690
+ const envPath = path4.join(cwd, ".env");
691
+ fs6.writeFileSync(envPath, envContent, "utf-8");
692
+ p3.log.success(`Created ${pc3.bold(".env")} with API key`);
693
+ const pkgDir = findPackageDir();
694
+ copyDeployFile(pkgDir, cwd, "Dockerfile");
695
+ copyDeployFile(pkgDir, cwd, "docker-entrypoint.sh");
696
+ copyDeployFile(pkgDir, cwd, "docker-compose.yml");
697
+ try {
698
+ fs6.chmodSync(path4.join(cwd, "docker-entrypoint.sh"), 493);
699
+ } catch {
700
+ }
701
+ p3.log.success(`Created ${pc3.bold("Dockerfile")} + ${pc3.bold("docker-compose.yml")}`);
702
+ p3.note(
703
+ `${pc3.bold("Start your companion:")}
704
+
705
+ docker compose up -d
706
+
707
+ ${pc3.bold("Access:")}
708
+ Webhook API: http://localhost:3000/chat
709
+ Health check: http://localhost:3000/status
710
+
711
+ ${pc3.bold("Interactive CLI:")}
712
+ docker compose run --rm aman-server agent
713
+
714
+ ${pc3.bold("View logs:")}
715
+ docker compose logs -f`,
716
+ "Next steps"
717
+ );
718
+ }
719
+ async function deployOllama(cwd) {
720
+ const model = await p3.text({
721
+ message: "Ollama model to use:",
722
+ placeholder: "llama3.2",
723
+ initialValue: "llama3.2"
724
+ });
725
+ if (p3.isCancel(model)) return;
726
+ const envContent = `# aman ecosystem \u2014 local deployment (no API key needed)
727
+ AMAN_AI_NAME=Aman
728
+ AMAN_MODEL=${model}
729
+
730
+ # Optional: Telegram/Discord bots
731
+ # TELEGRAM_BOT_TOKEN=
732
+ # DISCORD_BOT_TOKEN=
733
+ `;
734
+ const envPath = path4.join(cwd, ".env");
735
+ fs6.writeFileSync(envPath, envContent, "utf-8");
736
+ p3.log.success(`Created ${pc3.bold(".env")} with Ollama config`);
737
+ const pkgDir = findPackageDir();
738
+ copyDeployFile(pkgDir, cwd, "Dockerfile");
739
+ copyDeployFile(pkgDir, cwd, "docker-entrypoint.sh");
740
+ copyDeployFile(pkgDir, cwd, "docker-compose.ollama.yml");
741
+ const src = path4.join(cwd, "docker-compose.ollama.yml");
742
+ const dest = path4.join(cwd, "docker-compose.yml");
743
+ if (fs6.existsSync(src) && !fs6.existsSync(dest)) {
744
+ fs6.renameSync(src, dest);
745
+ }
746
+ try {
747
+ fs6.chmodSync(path4.join(cwd, "docker-entrypoint.sh"), 493);
748
+ } catch {
749
+ }
750
+ p3.log.success(`Created ${pc3.bold("Dockerfile")} + ${pc3.bold("docker-compose.yml")} (with Ollama)`);
751
+ p3.note(
752
+ `${pc3.bold("Start your companion (fully local):")}
753
+
754
+ docker compose up -d
755
+
756
+ First run downloads ${model} (~2GB). After that it's instant.
757
+
758
+ ${pc3.bold("Access:")}
759
+ Webhook API: http://localhost:3000/chat
760
+ Ollama: http://localhost:11434
761
+
762
+ ${pc3.bold("Works on:")}
763
+ Raspberry Pi 4/5 (ARM64), any Linux, macOS, Windows`,
764
+ "Next steps"
765
+ );
766
+ }
767
+ function deploySystemd() {
768
+ p3.note(
769
+ `${pc3.bold("1. Install Node.js 20+:")}
770
+ curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -
771
+ sudo apt install -y nodejs
772
+
773
+ ${pc3.bold("2. Create aman user:")}
774
+ sudo useradd -m -s /bin/bash aman
775
+ sudo -u aman npm install -g @aman_asmuei/achannel @aman_asmuei/aman-mcp
776
+
777
+ ${pc3.bold("3. Configure API key:")}
778
+ sudo mkdir -p /home/aman/.aman-agent
779
+ echo 'ANTHROPIC_API_KEY=sk-ant-...' | sudo tee /home/aman/.aman-agent/env
780
+
781
+ ${pc3.bold("4. Install service:")}
782
+ sudo cp aman.service /etc/systemd/system/
783
+ sudo systemctl daemon-reload
784
+ sudo systemctl enable --now aman
785
+
786
+ ${pc3.bold("5. Check status:")}
787
+ sudo systemctl status aman
788
+ sudo journalctl -u aman -f`,
789
+ "Systemd deployment (Raspberry Pi / bare metal)"
790
+ );
791
+ }
792
+ function deployManual() {
793
+ p3.note(
794
+ `${pc3.bold("Docker (one command):")}
795
+ docker run -d -p 3000:3000 \\
796
+ -e ANTHROPIC_API_KEY=sk-ant-... \\
797
+ -v aman-data:/root/.acore \\
798
+ -v aman-memory:/root/.amem \\
799
+ ghcr.io/amanasmuei/aman serve
800
+
801
+ ${pc3.bold("Docker + Ollama (fully local):")}
802
+ docker run -d --name ollama ollama/ollama
803
+ docker exec ollama ollama pull llama3.2
804
+ docker run -d -p 3000:3000 \\
805
+ --link ollama \\
806
+ -e OLLAMA_HOST=http://ollama:11434 \\
807
+ ghcr.io/amanasmuei/aman serve
808
+
809
+ ${pc3.bold("npm (any server):")}
810
+ npm install -g @aman_asmuei/achannel @aman_asmuei/aman-mcp
811
+ ANTHROPIC_API_KEY=sk-ant-... achannel serve
812
+
813
+ ${pc3.bold("Raspberry Pi:")}
814
+ curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -
815
+ sudo apt install -y nodejs
816
+ npm install -g @aman_asmuei/achannel @aman_asmuei/aman-mcp
817
+ ANTHROPIC_API_KEY=sk-ant-... achannel serve`,
818
+ "Manual deployment commands"
819
+ );
820
+ }
821
+ function findPackageDir() {
822
+ let dir = new URL(".", import.meta.url).pathname;
823
+ for (let i = 0; i < 5; i++) {
824
+ if (fs6.existsSync(path4.join(dir, "Dockerfile"))) return dir;
825
+ dir = path4.dirname(dir);
826
+ }
827
+ const globalDir = path4.join(process.env.npm_config_prefix || "/usr/local", "lib/node_modules/@aman_asmuei/aman");
828
+ if (fs6.existsSync(path4.join(globalDir, "Dockerfile"))) return globalDir;
829
+ return process.cwd();
830
+ }
831
+ function copyDeployFile(pkgDir, destDir, filename) {
832
+ const src = path4.join(pkgDir, filename);
833
+ const dest = path4.join(destDir, filename);
834
+ if (fs6.existsSync(src)) {
835
+ fs6.copyFileSync(src, dest);
836
+ }
837
+ }
838
+
631
839
  // src/index.ts
632
840
  var program = new Command();
633
- program.name("aman").description("Your complete AI companion \u2014 identity, memory, and tools in one command").version("0.2.0").action(() => {
841
+ program.name("aman").description("Your complete AI companion \u2014 identity, memory, and tools in one command").version("0.3.0").action(() => {
634
842
  const ecosystem = detectEcosystem();
635
843
  if (ecosystem.acore.installed) {
636
844
  statusCommand();
@@ -640,4 +848,5 @@ program.name("aman").description("Your complete AI companion \u2014 identity, me
640
848
  });
641
849
  program.command("setup").description("Set up your AI companion (identity + memory + tools)").action(() => setupCommand());
642
850
  program.command("status").description("View your full ecosystem status").action(() => statusCommand());
851
+ program.command("deploy").description("Deploy your AI companion (Docker, systemd, or cloud)").action(() => deployCommand());
643
852
  program.parse();
@@ -0,0 +1,65 @@
1
+ # aman ecosystem — fully local with Ollama (no API key needed)
2
+ # Usage: docker compose -f docker-compose.ollama.yml up -d
3
+ #
4
+ # First run pulls llama3.2 model (~2GB download)
5
+ # Works on: Raspberry Pi 4/5 (ARM64), any Linux/Mac with Docker
6
+
7
+ services:
8
+ ollama:
9
+ image: ollama/ollama:latest
10
+ restart: unless-stopped
11
+ volumes:
12
+ - ollama-models:/root/.ollama
13
+ ports:
14
+ - "11434:11434"
15
+ # Uncomment for GPU support:
16
+ # deploy:
17
+ # resources:
18
+ # reservations:
19
+ # devices:
20
+ # - capabilities: [gpu]
21
+
22
+ ollama-init:
23
+ image: ollama/ollama:latest
24
+ depends_on:
25
+ - ollama
26
+ restart: "no"
27
+ entrypoint: >
28
+ sh -c "sleep 5 && ollama pull llama3.2"
29
+ environment:
30
+ - OLLAMA_HOST=http://ollama:11434
31
+
32
+ aman-server:
33
+ build: .
34
+ command: serve
35
+ restart: unless-stopped
36
+ depends_on:
37
+ - ollama
38
+ ports:
39
+ - "3000:3000"
40
+ environment:
41
+ - OLLAMA_HOST=http://ollama:11434
42
+ - AMAN_AI_NAME=${AMAN_AI_NAME:-Aman}
43
+ - AMAN_MODEL=${AMAN_MODEL:-llama3.2}
44
+ - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN:-}
45
+ - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:-}
46
+ volumes:
47
+ - aman-identity:/root/.acore
48
+ - aman-memory:/root/.amem
49
+ - aman-config:/root/.aman-agent
50
+ - aman-rules:/root/.arules
51
+ - aman-workflows:/root/.aflow
52
+ - aman-eval:/root/.aeval
53
+ - aman-skills:/root/.askill
54
+ - aman-tools:/root/.akit
55
+
56
+ volumes:
57
+ ollama-models:
58
+ aman-identity:
59
+ aman-memory:
60
+ aman-config:
61
+ aman-rules:
62
+ aman-workflows:
63
+ aman-eval:
64
+ aman-skills:
65
+ aman-tools:
@@ -0,0 +1,40 @@
1
+ # aman ecosystem — full deployment
2
+ # Usage: docker compose up -d
3
+ #
4
+ # Modes:
5
+ # aman-server → always-on webhook/Telegram/Discord server
6
+ # aman-agent → interactive CLI (attach with: docker attach aman-agent)
7
+
8
+ services:
9
+ aman-server:
10
+ build: .
11
+ command: serve
12
+ restart: unless-stopped
13
+ ports:
14
+ - "3000:3000"
15
+ environment:
16
+ - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
17
+ - OPENAI_API_KEY=${OPENAI_API_KEY:-}
18
+ - AMAN_AI_NAME=${AMAN_AI_NAME:-Aman}
19
+ - AMAN_MODEL=${AMAN_MODEL:-claude-sonnet-4-6}
20
+ - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN:-}
21
+ - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:-}
22
+ volumes:
23
+ - aman-identity:/root/.acore
24
+ - aman-memory:/root/.amem
25
+ - aman-config:/root/.aman-agent
26
+ - aman-rules:/root/.arules
27
+ - aman-workflows:/root/.aflow
28
+ - aman-eval:/root/.aeval
29
+ - aman-skills:/root/.askill
30
+ - aman-tools:/root/.akit
31
+
32
+ volumes:
33
+ aman-identity:
34
+ aman-memory:
35
+ aman-config:
36
+ aman-rules:
37
+ aman-workflows:
38
+ aman-eval:
39
+ aman-skills:
40
+ aman-tools:
@@ -0,0 +1,165 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ # aman ecosystem — Docker entrypoint
5
+ # Modes:
6
+ # agent → interactive CLI (default)
7
+ # serve → achannel webhook/Telegram/Discord server
8
+ # setup → run ecosystem setup
9
+ # status → show ecosystem status
10
+
11
+ MODE="${1:-agent}"
12
+
13
+ # Auto-create minimal identity if none exists
14
+ if [ ! -f /root/.acore/core.md ]; then
15
+ echo " First run — creating default identity..."
16
+ AI_NAME="${AMAN_AI_NAME:-Aman}"
17
+ cat > /root/.acore/core.md << EOF
18
+ # ${AI_NAME}
19
+
20
+ ## Identity
21
+ - Role: ${AI_NAME} is your AI companion
22
+ - Personality: helpful, direct, adaptive
23
+ - Communication: clear and concise
24
+ - Values: honesty, simplicity, understanding
25
+ - Boundaries: won't pretend to be human
26
+
27
+ ---
28
+
29
+ ## Relationship
30
+ - Name: [user]
31
+ - Role: [role]
32
+ - Nicknames: []
33
+ - Communication: [updated over time]
34
+ - Detail level: balanced
35
+ - Domain: [detected from project]
36
+ - Personal: []
37
+ - Learned patterns: []
38
+
39
+ ---
40
+
41
+ ## Session
42
+ - Last updated: $(date +%Y-%m-%d)
43
+ - Resume: [starting fresh]
44
+ - Active topics: []
45
+ - Recent decisions: []
46
+ - Temp notes: []
47
+
48
+ ---
49
+
50
+ ## Dynamics
51
+
52
+ ### Trust & Rapport
53
+ - Level: 3
54
+ - Trajectory: building
55
+ - Evidence: []
56
+ - Unlocked behaviors: []
57
+
58
+ ### Emotional Patterns
59
+ - Baseline energy: steady
60
+ - Stress signals: []
61
+ - Support style: problem-solve
62
+ - Current read: fresh start
63
+
64
+ ### Conflict & Repair
65
+ - History: []
66
+ - Conflict style: direct
67
+ - Learned response: []
68
+
69
+ ---
70
+
71
+ ## Context Modes
72
+
73
+ > Active mode inferred from conversation context.
74
+
75
+ ### Default
76
+ - Tone: casual-professional
77
+ - Detail: balanced
78
+ - Initiative: proactive
79
+
80
+ ---
81
+
82
+ ## Memory Lifecycle
83
+
84
+ ### Importance
85
+ - Critical: [user boundaries, core preferences]
86
+ - Persistent: [projects, tech stack]
87
+ - Ephemeral: [temporary context]
88
+
89
+ ### Size
90
+ - Target: under 2000 tokens
91
+ EOF
92
+ echo " Identity created: ${AI_NAME}"
93
+ fi
94
+
95
+ # Auto-create aman-agent config if API key is provided
96
+ if [ ! -f /root/.aman-agent/config.json ]; then
97
+ if [ -n "$ANTHROPIC_API_KEY" ]; then
98
+ MODEL="${AMAN_MODEL:-claude-sonnet-4-6}"
99
+ cat > /root/.aman-agent/config.json << EOF
100
+ {
101
+ "provider": "anthropic",
102
+ "apiKey": "${ANTHROPIC_API_KEY}",
103
+ "model": "${MODEL}",
104
+ "hooks": {
105
+ "memoryRecall": true,
106
+ "sessionResume": true,
107
+ "rulesCheck": true,
108
+ "workflowSuggest": true,
109
+ "evalPrompt": false,
110
+ "autoSessionSave": true,
111
+ "extractMemories": true,
112
+ "featureHints": true,
113
+ "personalityAdapt": true
114
+ }
115
+ }
116
+ EOF
117
+ echo " Config created: Anthropic / ${MODEL}"
118
+ elif [ -n "$OPENAI_API_KEY" ]; then
119
+ MODEL="${AMAN_MODEL:-gpt-4o}"
120
+ cat > /root/.aman-agent/config.json << EOF
121
+ {
122
+ "provider": "openai",
123
+ "apiKey": "${OPENAI_API_KEY}",
124
+ "model": "${MODEL}",
125
+ "hooks": {
126
+ "memoryRecall": true,
127
+ "sessionResume": true,
128
+ "rulesCheck": true,
129
+ "workflowSuggest": true,
130
+ "evalPrompt": false,
131
+ "autoSessionSave": true,
132
+ "extractMemories": true,
133
+ "featureHints": true,
134
+ "personalityAdapt": true
135
+ }
136
+ }
137
+ EOF
138
+ echo " Config created: OpenAI / ${MODEL}"
139
+ fi
140
+ fi
141
+
142
+ case "$MODE" in
143
+ agent)
144
+ echo " Starting aman-agent (interactive)..."
145
+ exec aman-agent
146
+ ;;
147
+ serve)
148
+ echo " Starting achannel server on :3000..."
149
+ exec achannel serve
150
+ ;;
151
+ setup)
152
+ exec aman setup
153
+ ;;
154
+ status)
155
+ exec aman status
156
+ ;;
157
+ sh|bash)
158
+ exec /bin/sh
159
+ ;;
160
+ *)
161
+ echo "Unknown mode: $MODE"
162
+ echo "Usage: docker run aman [agent|serve|setup|status|sh]"
163
+ exit 1
164
+ ;;
165
+ esac
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aman_asmuei/aman",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Your complete AI companion — identity, memory, and tools in one command",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,7 +10,12 @@
10
10
  "files": [
11
11
  "dist",
12
12
  "bin",
13
- "template"
13
+ "template",
14
+ "deploy",
15
+ "Dockerfile",
16
+ "docker-entrypoint.sh",
17
+ "docker-compose.yml",
18
+ "docker-compose.ollama.yml"
14
19
  ],
15
20
  "scripts": {
16
21
  "build": "tsup",