jinn-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/dist/bin/jimmy.d.ts +3 -0
  2. package/dist/bin/jimmy.d.ts.map +1 -0
  3. package/dist/bin/jimmy.js +148 -0
  4. package/dist/bin/jimmy.js.map +1 -0
  5. package/dist/src/cli/chrome-allow.d.ts +5 -0
  6. package/dist/src/cli/chrome-allow.d.ts.map +1 -0
  7. package/dist/src/cli/chrome-allow.js +241 -0
  8. package/dist/src/cli/chrome-allow.js.map +1 -0
  9. package/dist/src/cli/create.d.ts +2 -0
  10. package/dist/src/cli/create.d.ts.map +1 -0
  11. package/dist/src/cli/create.js +72 -0
  12. package/dist/src/cli/create.js.map +1 -0
  13. package/dist/src/cli/instances.d.ts +14 -0
  14. package/dist/src/cli/instances.d.ts.map +1 -0
  15. package/dist/src/cli/instances.js +43 -0
  16. package/dist/src/cli/instances.js.map +1 -0
  17. package/dist/src/cli/list.d.ts +2 -0
  18. package/dist/src/cli/list.d.ts.map +1 -0
  19. package/dist/src/cli/list.js +38 -0
  20. package/dist/src/cli/list.js.map +1 -0
  21. package/dist/src/cli/migrate.d.ts +5 -0
  22. package/dist/src/cli/migrate.d.ts.map +1 -0
  23. package/dist/src/cli/migrate.js +203 -0
  24. package/dist/src/cli/migrate.js.map +1 -0
  25. package/dist/src/cli/nuke.d.ts +2 -0
  26. package/dist/src/cli/nuke.d.ts.map +1 -0
  27. package/dist/src/cli/nuke.js +91 -0
  28. package/dist/src/cli/nuke.js.map +1 -0
  29. package/dist/src/cli/remove.d.ts +4 -0
  30. package/dist/src/cli/remove.d.ts.map +1 -0
  31. package/dist/src/cli/remove.js +47 -0
  32. package/dist/src/cli/remove.js.map +1 -0
  33. package/dist/src/cli/setup.d.ts +4 -0
  34. package/dist/src/cli/setup.d.ts.map +1 -0
  35. package/dist/src/cli/setup.js +483 -0
  36. package/dist/src/cli/setup.js.map +1 -0
  37. package/dist/src/cli/skills.d.ts +28 -0
  38. package/dist/src/cli/skills.d.ts.map +1 -0
  39. package/dist/src/cli/skills.js +284 -0
  40. package/dist/src/cli/skills.js.map +1 -0
  41. package/dist/src/cli/start.d.ts +5 -0
  42. package/dist/src/cli/start.d.ts.map +1 -0
  43. package/dist/src/cli/start.js +34 -0
  44. package/dist/src/cli/start.js.map +1 -0
  45. package/dist/src/cli/status.d.ts +2 -0
  46. package/dist/src/cli/status.d.ts.map +1 -0
  47. package/dist/src/cli/status.js +60 -0
  48. package/dist/src/cli/status.js.map +1 -0
  49. package/dist/src/cli/stop.d.ts +2 -0
  50. package/dist/src/cli/stop.d.ts.map +1 -0
  51. package/dist/src/cli/stop.js +11 -0
  52. package/dist/src/cli/stop.js.map +1 -0
  53. package/dist/src/connectors/slack/format.d.ts +10 -0
  54. package/dist/src/connectors/slack/format.d.ts.map +1 -0
  55. package/dist/src/connectors/slack/format.js +55 -0
  56. package/dist/src/connectors/slack/format.js.map +1 -0
  57. package/dist/src/connectors/slack/index.d.ts +18 -0
  58. package/dist/src/connectors/slack/index.d.ts.map +1 -0
  59. package/dist/src/connectors/slack/index.js +122 -0
  60. package/dist/src/connectors/slack/index.js.map +1 -0
  61. package/dist/src/connectors/slack/threads.d.ts +2 -0
  62. package/dist/src/connectors/slack/threads.d.ts.map +1 -0
  63. package/dist/src/connectors/slack/threads.js +10 -0
  64. package/dist/src/connectors/slack/threads.js.map +1 -0
  65. package/dist/src/cron/jobs.d.ts +5 -0
  66. package/dist/src/cron/jobs.d.ts.map +1 -0
  67. package/dist/src/cron/jobs.js +23 -0
  68. package/dist/src/cron/jobs.js.map +1 -0
  69. package/dist/src/cron/runner.d.ts +3 -0
  70. package/dist/src/cron/runner.d.ts.map +1 -0
  71. package/dist/src/cron/runner.js +118 -0
  72. package/dist/src/cron/runner.js.map +1 -0
  73. package/dist/src/cron/scheduler.d.ts +5 -0
  74. package/dist/src/cron/scheduler.d.ts.map +1 -0
  75. package/dist/src/cron/scheduler.js +39 -0
  76. package/dist/src/cron/scheduler.js.map +1 -0
  77. package/dist/src/engines/claude.d.ts +14 -0
  78. package/dist/src/engines/claude.d.ts.map +1 -0
  79. package/dist/src/engines/claude.js +264 -0
  80. package/dist/src/engines/claude.js.map +1 -0
  81. package/dist/src/engines/codex.d.ts +15 -0
  82. package/dist/src/engines/codex.d.ts.map +1 -0
  83. package/dist/src/engines/codex.js +346 -0
  84. package/dist/src/engines/codex.js.map +1 -0
  85. package/dist/src/gateway/api.d.ts +13 -0
  86. package/dist/src/gateway/api.d.ts.map +1 -0
  87. package/dist/src/gateway/api.js +819 -0
  88. package/dist/src/gateway/api.js.map +1 -0
  89. package/dist/src/gateway/daemon-entry.d.ts +2 -0
  90. package/dist/src/gateway/daemon-entry.d.ts.map +1 -0
  91. package/dist/src/gateway/daemon-entry.js +12 -0
  92. package/dist/src/gateway/daemon-entry.js.map +1 -0
  93. package/dist/src/gateway/lifecycle.d.ts +10 -0
  94. package/dist/src/gateway/lifecycle.d.ts.map +1 -0
  95. package/dist/src/gateway/lifecycle.js +124 -0
  96. package/dist/src/gateway/lifecycle.js.map +1 -0
  97. package/dist/src/gateway/org.d.ts +10 -0
  98. package/dist/src/gateway/org.d.ts.map +1 -0
  99. package/dist/src/gateway/org.js +71 -0
  100. package/dist/src/gateway/org.js.map +1 -0
  101. package/dist/src/gateway/server.d.ts +4 -0
  102. package/dist/src/gateway/server.d.ts.map +1 -0
  103. package/dist/src/gateway/server.js +301 -0
  104. package/dist/src/gateway/server.js.map +1 -0
  105. package/dist/src/gateway/watcher.d.ts +14 -0
  106. package/dist/src/gateway/watcher.d.ts.map +1 -0
  107. package/dist/src/gateway/watcher.js +104 -0
  108. package/dist/src/gateway/watcher.js.map +1 -0
  109. package/dist/src/index.d.ts +5 -0
  110. package/dist/src/index.d.ts.map +1 -0
  111. package/dist/src/index.js +4 -0
  112. package/dist/src/index.js.map +1 -0
  113. package/dist/src/sessions/context.d.ts +20 -0
  114. package/dist/src/sessions/context.d.ts.map +1 -0
  115. package/dist/src/sessions/context.js +532 -0
  116. package/dist/src/sessions/context.js.map +1 -0
  117. package/dist/src/sessions/manager.d.ts +38 -0
  118. package/dist/src/sessions/manager.d.ts.map +1 -0
  119. package/dist/src/sessions/manager.js +208 -0
  120. package/dist/src/sessions/manager.js.map +1 -0
  121. package/dist/src/sessions/queue.d.ts +14 -0
  122. package/dist/src/sessions/queue.d.ts.map +1 -0
  123. package/dist/src/sessions/queue.js +42 -0
  124. package/dist/src/sessions/queue.js.map +1 -0
  125. package/dist/src/sessions/registry.d.ts +46 -0
  126. package/dist/src/sessions/registry.d.ts.map +1 -0
  127. package/dist/src/sessions/registry.js +193 -0
  128. package/dist/src/sessions/registry.js.map +1 -0
  129. package/dist/src/shared/config.d.ts +3 -0
  130. package/dist/src/shared/config.d.ts.map +1 -0
  131. package/dist/src/shared/config.js +11 -0
  132. package/dist/src/shared/config.js.map +1 -0
  133. package/dist/src/shared/logger.d.ts +12 -0
  134. package/dist/src/shared/logger.d.ts.map +1 -0
  135. package/dist/src/shared/logger.js +35 -0
  136. package/dist/src/shared/logger.js.map +1 -0
  137. package/dist/src/shared/paths.d.ts +19 -0
  138. package/dist/src/shared/paths.d.ts.map +1 -0
  139. package/dist/src/shared/paths.js +31 -0
  140. package/dist/src/shared/paths.js.map +1 -0
  141. package/dist/src/shared/types.d.ts +166 -0
  142. package/dist/src/shared/types.d.ts.map +1 -0
  143. package/dist/src/shared/types.js +4 -0
  144. package/dist/src/shared/types.js.map +1 -0
  145. package/dist/src/shared/version.d.ts +15 -0
  146. package/dist/src/shared/version.d.ts.map +1 -0
  147. package/dist/src/shared/version.js +56 -0
  148. package/dist/src/shared/version.js.map +1 -0
  149. package/dist/web/404.html +1 -0
  150. package/dist/web/_next/static/chunks/198-fd91406a158c5c25.js +1 -0
  151. package/dist/web/_next/static/chunks/517.62389e8d3c929c43.js +1 -0
  152. package/dist/web/_next/static/chunks/534-17c49c944e0d0fe1.js +1 -0
  153. package/dist/web/_next/static/chunks/573-070537ec2452d03e.js +1 -0
  154. package/dist/web/_next/static/chunks/590-2c34156c7417317e.js +1 -0
  155. package/dist/web/_next/static/chunks/704-af2893821e1d18dc.js +1 -0
  156. package/dist/web/_next/static/chunks/7273c211.06e3b6021d90b73f.js +1 -0
  157. package/dist/web/_next/static/chunks/73-c226535579393e21.js +1 -0
  158. package/dist/web/_next/static/chunks/743-5bb03adbb0e4ddec.js +1 -0
  159. package/dist/web/_next/static/chunks/874.97d5a27895061057.js +1 -0
  160. package/dist/web/_next/static/chunks/8e6518bb-c26e82767f1faf66.js +1 -0
  161. package/dist/web/_next/static/chunks/app/_not-found/page-bb075b0779827928.js +1 -0
  162. package/dist/web/_next/static/chunks/app/chat/page-6d5bc707a45c92c6.js +1 -0
  163. package/dist/web/_next/static/chunks/app/costs/page-d6c03718defdb599.js +1 -0
  164. package/dist/web/_next/static/chunks/app/cron/page-4c563eef2b6231fe.js +1 -0
  165. package/dist/web/_next/static/chunks/app/kanban/page-55a73165a36f4077.js +1 -0
  166. package/dist/web/_next/static/chunks/app/layout-5129b67d5f126cf0.js +1 -0
  167. package/dist/web/_next/static/chunks/app/logs/page-e18889d67e48c9c9.js +1 -0
  168. package/dist/web/_next/static/chunks/app/org/page-d5cd8d9b7864737b.js +1 -0
  169. package/dist/web/_next/static/chunks/app/page-b81992940fd1dbc6.js +1 -0
  170. package/dist/web/_next/static/chunks/app/sessions/page-2eef6ac7882a28ba.js +1 -0
  171. package/dist/web/_next/static/chunks/app/settings/page-4fb01b9b09500170.js +1 -0
  172. package/dist/web/_next/static/chunks/app/skills/page-df9465e314561bb5.js +1 -0
  173. package/dist/web/_next/static/chunks/framework-077b27ad7787463c.js +1 -0
  174. package/dist/web/_next/static/chunks/main-app-437f51faf74fbb3b.js +1 -0
  175. package/dist/web/_next/static/chunks/main-f1c74cefd4965abf.js +1 -0
  176. package/dist/web/_next/static/chunks/pages/_app-77a85fe7d6bca671.js +1 -0
  177. package/dist/web/_next/static/chunks/pages/_error-68febf4b34900064.js +1 -0
  178. package/dist/web/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  179. package/dist/web/_next/static/chunks/webpack-0f39b7e91dce9791.js +1 -0
  180. package/dist/web/_next/static/css/4a6a5bca9238c104.css +1 -0
  181. package/dist/web/_next/static/vLvOwhC8JocJzSHTHKKOv/_buildManifest.js +1 -0
  182. package/dist/web/_next/static/vLvOwhC8JocJzSHTHKKOv/_ssgManifest.js +1 -0
  183. package/dist/web/chat.html +1 -0
  184. package/dist/web/chat.txt +20 -0
  185. package/dist/web/costs.html +16 -0
  186. package/dist/web/costs.txt +20 -0
  187. package/dist/web/cron.html +1 -0
  188. package/dist/web/cron.txt +20 -0
  189. package/dist/web/index.html +1 -0
  190. package/dist/web/index.txt +20 -0
  191. package/dist/web/kanban.html +1 -0
  192. package/dist/web/kanban.txt +20 -0
  193. package/dist/web/logs.html +7 -0
  194. package/dist/web/logs.txt +20 -0
  195. package/dist/web/org.html +1 -0
  196. package/dist/web/org.txt +20 -0
  197. package/dist/web/sessions.html +1 -0
  198. package/dist/web/sessions.txt +20 -0
  199. package/dist/web/settings.html +1 -0
  200. package/dist/web/settings.txt +20 -0
  201. package/dist/web/skills.html +1 -0
  202. package/dist/web/skills.txt +20 -0
  203. package/package.json +43 -0
  204. package/template/AGENTS.md +167 -0
  205. package/template/CLAUDE.md +106 -0
  206. package/template/config.default.yaml +27 -0
  207. package/template/docs/architecture.md +74 -0
  208. package/template/docs/connectors.md +72 -0
  209. package/template/docs/cron.md +137 -0
  210. package/template/docs/org.md +105 -0
  211. package/template/docs/overview.md +39 -0
  212. package/template/docs/self-modification.md +65 -0
  213. package/template/docs/skills.md +58 -0
  214. package/template/knowledge/.gitkeep +0 -0
  215. package/template/migrations/.gitkeep +0 -0
  216. package/template/migrations/0.1.0/MIGRATION.md +25 -0
  217. package/template/skills/cron-manager/SKILL.md +127 -0
  218. package/template/skills/find-and-install/SKILL.md +92 -0
  219. package/template/skills/management/SKILL.md +203 -0
  220. package/template/skills/migrate/SKILL.md +154 -0
  221. package/template/skills/new/SKILL.md +19 -0
  222. package/template/skills/onboarding/SKILL.md +106 -0
  223. package/template/skills/self-heal/SKILL.md +114 -0
  224. package/template/skills/skill-creator/SKILL.md +112 -0
  225. package/template/skills/status/SKILL.md +19 -0
  226. package/template/skills/sync/SKILL.md +67 -0
  227. package/template/skills.json +3 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=jimmy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jimmy.d.ts","sourceRoot":"","sources":["../../bin/jimmy.ts"],"names":[],"mappings":""}
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ const program = new Command();
6
+ program
7
+ .name("jinn")
8
+ .description("Lightweight AI gateway daemon")
9
+ .version("0.1.0")
10
+ .option("-i, --instance <name>", "Target a specific instance (default: jinn)");
11
+ // Pre-parse to set JINN_HOME before any module imports resolve paths
12
+ program.hook("preAction", (thisCommand) => {
13
+ const opts = thisCommand.opts();
14
+ if (opts.instance) {
15
+ process.env.JINN_INSTANCE = opts.instance;
16
+ process.env.JINN_HOME = path.join(os.homedir(), `.${opts.instance}`);
17
+ }
18
+ });
19
+ program
20
+ .command("setup")
21
+ .description("Initialize Jinn and install dependencies")
22
+ .option("--force", "Delete existing home dir and reinitialize from scratch")
23
+ .action(async (opts) => {
24
+ const { runSetup } = await import("../src/cli/setup.js");
25
+ await runSetup(opts);
26
+ });
27
+ program
28
+ .command("start")
29
+ .description("Start the gateway daemon")
30
+ .option("--daemon", "Run in background")
31
+ .option("-p, --port <port>", "Override the gateway port from config")
32
+ .action(async (opts) => {
33
+ const { runStart } = await import("../src/cli/start.js");
34
+ await runStart({ daemon: opts.daemon, port: opts.port ? parseInt(opts.port, 10) : undefined });
35
+ });
36
+ program
37
+ .command("stop")
38
+ .description("Stop the gateway daemon")
39
+ .option("-p, --port <port>", "Port to kill the process on (default: from config or 7777)")
40
+ .action(async (opts) => {
41
+ const { runStop } = await import("../src/cli/stop.js");
42
+ await runStop(opts.port ? parseInt(opts.port, 10) : undefined);
43
+ });
44
+ program
45
+ .command("status")
46
+ .description("Show gateway status")
47
+ .action(async () => {
48
+ const { runStatus } = await import("../src/cli/status.js");
49
+ await runStatus();
50
+ });
51
+ program
52
+ .command("create <name>")
53
+ .description("Create a new Jinn instance")
54
+ .option("-p, --port <port>", "Set gateway port (auto-assigned if omitted)")
55
+ .action(async (name, opts) => {
56
+ const { runCreate } = await import("../src/cli/create.js");
57
+ await runCreate(name, opts.port ? parseInt(opts.port, 10) : undefined);
58
+ });
59
+ program
60
+ .command("list")
61
+ .description("List all Jinn instances")
62
+ .action(async () => {
63
+ const { runList } = await import("../src/cli/list.js");
64
+ await runList();
65
+ });
66
+ program
67
+ .command("remove <name>")
68
+ .description("Remove a Jinn instance from the registry")
69
+ .option("--force", "Also delete the instance home directory")
70
+ .action(async (name, opts) => {
71
+ const { runRemove } = await import("../src/cli/remove.js");
72
+ await runRemove(name, opts);
73
+ });
74
+ program
75
+ .command("nuke [name]")
76
+ .description("Permanently delete a Jinn instance and all its data")
77
+ .action(async (name) => {
78
+ const { runNuke } = await import("../src/cli/nuke.js");
79
+ await runNuke(name);
80
+ });
81
+ program
82
+ .command("migrate")
83
+ .description("Apply pending template migrations to update this instance")
84
+ .option("--check", "Only check for pending migrations, don't apply")
85
+ .option("--auto", "Apply safe changes automatically without launching AI")
86
+ .action(async (opts) => {
87
+ const { runMigrate } = await import("../src/cli/migrate.js");
88
+ await runMigrate(opts);
89
+ });
90
+ // Skills subcommands (jinn skills find|add|remove|list|update|restore)
91
+ {
92
+ const skillsCmd = program
93
+ .command("skills")
94
+ .description("Manage skills from the skills.sh registry");
95
+ skillsCmd
96
+ .command("find [query]")
97
+ .description("Search the skills.sh registry")
98
+ .action(async (query) => {
99
+ const { skillsFind } = await import("../src/cli/skills.js");
100
+ skillsFind(query);
101
+ });
102
+ skillsCmd
103
+ .command("add <package>")
104
+ .description("Install a skill from skills.sh")
105
+ .action(async (pkg) => {
106
+ const { skillsAdd } = await import("../src/cli/skills.js");
107
+ skillsAdd(pkg);
108
+ });
109
+ skillsCmd
110
+ .command("remove <name>")
111
+ .description("Remove a skill from this instance")
112
+ .action(async (name) => {
113
+ const { skillsRemove } = await import("../src/cli/skills.js");
114
+ skillsRemove(name);
115
+ });
116
+ skillsCmd
117
+ .command("list")
118
+ .description("List installed skills")
119
+ .action(async () => {
120
+ const { skillsList } = await import("../src/cli/skills.js");
121
+ skillsList();
122
+ });
123
+ skillsCmd
124
+ .command("update")
125
+ .description("Re-install all skills to get latest versions")
126
+ .action(async () => {
127
+ const { skillsUpdate } = await import("../src/cli/skills.js");
128
+ skillsUpdate();
129
+ });
130
+ skillsCmd
131
+ .command("restore")
132
+ .description("Install all skills listed in skills.json")
133
+ .action(async () => {
134
+ const { skillsRestore } = await import("../src/cli/skills.js");
135
+ skillsRestore();
136
+ });
137
+ }
138
+ program
139
+ .command("chrome-allow")
140
+ .description("Pre-approve all sites for the Claude Chrome extension")
141
+ .option("--no-restart", "Don't restart Chrome automatically")
142
+ .option("--comet-browser", "Target Comet browser instead of Google Chrome")
143
+ .action(async (opts) => {
144
+ const { runChromeAllow } = await import("../src/cli/chrome-allow.js");
145
+ await runChromeAllow(opts);
146
+ });
147
+ program.parse();
148
+ //# sourceMappingURL=jimmy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jimmy.js","sourceRoot":"","sources":["../../bin/jimmy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function runChromeAllow(opts: {
2
+ restart?: boolean;
3
+ cometBrowser?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=chrome-allow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-allow.d.ts","sourceRoot":"","sources":["../../../src/cli/chrome-allow.ts"],"names":[],"mappings":"AA+OA,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BvG"}
@@ -0,0 +1,241 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+ import { randomUUID } from "node:crypto";
5
+ import { execSync } from "node:child_process";
6
+ const GREEN = "\x1b[32m";
7
+ const YELLOW = "\x1b[33m";
8
+ const RED = "\x1b[31m";
9
+ const DIM = "\x1b[2m";
10
+ const RESET = "\x1b[0m";
11
+ const EXTENSION_ID = "fcoeoabgfenejglbffodgkkbkcdhcgfn";
12
+ /** Wildcard TLD patterns — *.com matches anything ending in .com */
13
+ const TLDS = [
14
+ "com", "org", "net", "io", "dev", "co", "ai", "app", "me", "us",
15
+ "uk", "de", "fr", "es", "it", "nl", "se", "no", "dk", "fi",
16
+ "jp", "kr", "cn", "in", "au", "nz", "ca", "br", "mx", "ar",
17
+ "ru", "pl", "cz", "at", "ch", "be", "pt", "ie", "bg",
18
+ "edu", "gov", "mil", "info", "biz", "pro", "xyz", "site",
19
+ "online", "tech", "store", "cloud", "design", "world", "today",
20
+ "life", "space", "fun", "club", "page", "so", "is", "im", "la",
21
+ "tv", "fm", "am", "ly", "to", "cc", "gg", "sh", "gl", "tf",
22
+ "ws", "cx", "sx", "ag", "vc", "mobi", "tel", "coop", "aero",
23
+ "jobs", "eu", "asia", "africa", "run", "tools", "systems",
24
+ "software", "solutions", "services", "network", "digital",
25
+ "agency", "studio", "media", "group", "team", "work", "zone",
26
+ "live", "rocks", "ninja", "guru", "land", "house", "center",
27
+ "academy", "link", "click", "help", "how", "watch", "review",
28
+ "guide", "news", "blog", "wiki", "email", "chat", "social",
29
+ "video", "photo", "music", "game", "games", "travel", "health",
30
+ "bio", "eco", "green", "shop", "boutique", "fashion", "style",
31
+ "art", "gallery", "photography", "builders", "construction",
32
+ "energy", "technology", "computer", "mobile", "hosting",
33
+ "domains", "website", "web", "codes", "engineering", "science",
34
+ "legal", "law", "consulting", "training", "education", "school",
35
+ "realty", "estate", "properties", "delivery", "express", "direct",
36
+ "supply", "parts", "tools", "repair", "support", "care",
37
+ "recipes", "restaurant", "bar", "cafe", "pub", "pizza", "coffee",
38
+ "deals", "cheap", "discount", "sale", "rent", "loan", "credit",
39
+ "insurance", "finance", "capital", "fund", "exchange", "market",
40
+ "co.uk", "co.jp", "co.kr", "co.in", "co.nz", "co.za",
41
+ "com.au", "com.br", "com.mx", "com.ar", "com.cn", "com.tw",
42
+ "org.uk", "net.au", "ac.uk",
43
+ ];
44
+ const BROWSERS = {
45
+ chrome: {
46
+ name: "Google Chrome",
47
+ processName: "Google Chrome",
48
+ macAppName: "Google Chrome",
49
+ macDataDir: path.join("Google", "Chrome"),
50
+ linuxDataDir: "google-chrome",
51
+ winDataDir: path.join("Google", "Chrome", "User Data"),
52
+ },
53
+ comet: {
54
+ name: "Comet",
55
+ processName: "Comet",
56
+ macAppName: "Comet",
57
+ macDataDir: "Comet",
58
+ linuxDataDir: "comet",
59
+ winDataDir: "Comet",
60
+ },
61
+ };
62
+ function getExtensionDbPath(browser) {
63
+ const home = os.homedir();
64
+ const platform = os.platform();
65
+ const candidates = [];
66
+ const profiles = ["Default", "Profile 1", "Profile 2"];
67
+ if (platform === "darwin") {
68
+ for (const profile of profiles) {
69
+ candidates.push(path.join(home, "Library", "Application Support", browser.macDataDir, profile, "Local Extension Settings", EXTENSION_ID));
70
+ }
71
+ }
72
+ else if (platform === "linux") {
73
+ for (const profile of profiles) {
74
+ candidates.push(path.join(home, ".config", browser.linuxDataDir, profile, "Local Extension Settings", EXTENSION_ID));
75
+ }
76
+ }
77
+ else if (platform === "win32") {
78
+ const appData = process.env.LOCALAPPDATA || path.join(home, "AppData", "Local");
79
+ for (const profile of profiles) {
80
+ candidates.push(path.join(appData, browser.winDataDir, profile, "Local Extension Settings", EXTENSION_ID));
81
+ }
82
+ }
83
+ for (const candidate of candidates) {
84
+ if (fs.existsSync(candidate))
85
+ return candidate;
86
+ }
87
+ return null;
88
+ }
89
+ function isBrowserRunning(browser) {
90
+ try {
91
+ const platform = os.platform();
92
+ if (platform === "darwin") {
93
+ execSync(`pgrep -x '${browser.processName}'`, { stdio: "ignore" });
94
+ }
95
+ else if (platform === "linux") {
96
+ execSync(`pgrep -x '${browser.processName.toLowerCase()}'`, { stdio: "ignore" });
97
+ }
98
+ else if (platform === "win32") {
99
+ const exe = browser.processName.toLowerCase().replace(/ /g, "") + ".exe";
100
+ execSync(`tasklist /FI "IMAGENAME eq ${exe}" | findstr ${exe}`, { stdio: "ignore" });
101
+ }
102
+ return true;
103
+ }
104
+ catch {
105
+ return false;
106
+ }
107
+ }
108
+ function quitBrowser(browser) {
109
+ try {
110
+ const platform = os.platform();
111
+ if (platform === "darwin") {
112
+ execSync(`osascript -e 'tell application "${browser.macAppName}" to quit'`, { stdio: "ignore", timeout: 10000 });
113
+ }
114
+ else if (platform === "linux") {
115
+ execSync(`pkill -TERM '${browser.processName.toLowerCase()}'`, { stdio: "ignore" });
116
+ }
117
+ else if (platform === "win32") {
118
+ const exe = browser.processName.toLowerCase().replace(/ /g, "") + ".exe";
119
+ execSync(`taskkill /IM ${exe}`, { stdio: "ignore" });
120
+ }
121
+ const deadline = Date.now() + 10000;
122
+ while (Date.now() < deadline) {
123
+ if (!isBrowserRunning(browser))
124
+ return true;
125
+ execSync("sleep 0.5");
126
+ }
127
+ return !isBrowserRunning(browser);
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ }
133
+ function openBrowser(browser) {
134
+ try {
135
+ const platform = os.platform();
136
+ if (platform === "darwin") {
137
+ execSync(`open -a '${browser.macAppName}'`, { stdio: "ignore" });
138
+ }
139
+ else if (platform === "linux") {
140
+ execSync(`${browser.processName.toLowerCase()} &`, { stdio: "ignore" });
141
+ }
142
+ else if (platform === "win32") {
143
+ execSync(`start ${browser.processName.toLowerCase().replace(/ /g, "")}`, { stdio: "ignore" });
144
+ }
145
+ }
146
+ catch {
147
+ // User can open browser manually
148
+ }
149
+ }
150
+ async function allowAllForBrowser(browser, ClassicLevel, opts) {
151
+ const label = browser.name;
152
+ // Find the extension DB
153
+ const dbPath = getExtensionDbPath(browser);
154
+ if (!dbPath) {
155
+ console.log(`${YELLOW}⚠${RESET} Claude extension not found for ${label} — skipping.`);
156
+ return;
157
+ }
158
+ // Browser must be closed to write to LevelDB
159
+ const wasRunning = isBrowserRunning(browser);
160
+ if (wasRunning) {
161
+ if (opts.restart === false) {
162
+ console.error(`${RED}Error:${RESET} ${label} is running. Close it first or remove ${DIM}--no-restart${RESET}.`);
163
+ process.exit(1);
164
+ }
165
+ console.log(`${YELLOW}Closing ${label}...${RESET}`);
166
+ const closed = quitBrowser(browser);
167
+ if (!closed) {
168
+ console.error(`${RED}Error:${RESET} Failed to close ${label}. Please close it manually and try again.`);
169
+ process.exit(1);
170
+ }
171
+ console.log(`${GREEN}${label} closed.${RESET}`);
172
+ }
173
+ // Open LevelDB and write permissions
174
+ const db = new ClassicLevel(dbPath, { keyEncoding: "utf8", valueEncoding: "utf8" });
175
+ let data;
176
+ try {
177
+ const raw = await db.get("permissionStorage");
178
+ data = JSON.parse(raw);
179
+ }
180
+ catch {
181
+ data = { permissions: [] };
182
+ }
183
+ const existingNetlocs = new Set(data.permissions
184
+ .filter((p) => p.scope?.type === "netloc")
185
+ .map((p) => p.scope.netloc));
186
+ const now = Date.now();
187
+ let added = 0;
188
+ for (const tld of TLDS) {
189
+ const netloc = `*.${tld}`;
190
+ if (!existingNetlocs.has(netloc)) {
191
+ data.permissions.push({
192
+ action: "allow",
193
+ createdAt: now,
194
+ duration: "always",
195
+ id: randomUUID(),
196
+ scope: { netloc, type: "netloc" },
197
+ });
198
+ added++;
199
+ }
200
+ }
201
+ if (added === 0) {
202
+ console.log(`${GREEN}[${label}]${RESET} All ${TLDS.length} TLD wildcards already present. Nothing to do.`);
203
+ }
204
+ else {
205
+ await db.put("permissionStorage", JSON.stringify(data));
206
+ console.log(`${GREEN}[${label}]${RESET} ✓ Added ${added} wildcard permissions (${TLDS.length} TLDs covered)`);
207
+ }
208
+ await db.close();
209
+ // Restart browser if it was running
210
+ if (wasRunning && opts.restart !== false) {
211
+ console.log(`${DIM}Reopening ${label}...${RESET}`);
212
+ openBrowser(browser);
213
+ console.log(`${GREEN}[${label}]${RESET} ✓ Restarted. All sites pre-approved.`);
214
+ }
215
+ }
216
+ export async function runChromeAllow(opts) {
217
+ // Check for classic-level
218
+ let ClassicLevel;
219
+ try {
220
+ const mod = await import("classic-level");
221
+ ClassicLevel = mod.ClassicLevel;
222
+ }
223
+ catch {
224
+ console.error(`${RED}Error:${RESET} classic-level is required but not installed.`);
225
+ console.error(`Run: ${DIM}npm install -g classic-level${RESET} or ${DIM}pnpm add classic-level${RESET}`);
226
+ process.exit(1);
227
+ }
228
+ const targets = [];
229
+ if (opts.cometBrowser) {
230
+ targets.push(BROWSERS.comet);
231
+ }
232
+ else {
233
+ // Default: Chrome only
234
+ targets.push(BROWSERS.chrome);
235
+ }
236
+ for (const browser of targets) {
237
+ await allowAllForBrowser(browser, ClassicLevel, opts);
238
+ }
239
+ console.log(`\n${GREEN}✓${RESET} Done. All sites will be pre-approved for the Claude extension.`);
240
+ }
241
+ //# sourceMappingURL=chrome-allow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-allow.js","sourceRoot":"","sources":["../../../src/cli/chrome-allow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runCreate(name: string, port?: number): Promise<void>;
2
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/create.ts"],"names":[],"mappings":"AAgBA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqE1E"}
@@ -0,0 +1,72 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import { execFileSync } from "node:child_process";
5
+ import { loadInstances, saveInstances, nextAvailablePort, } from "./instances.js";
6
+ const GREEN = "\x1b[32m";
7
+ const DIM = "\x1b[2m";
8
+ const RED = "\x1b[31m";
9
+ const RESET = "\x1b[0m";
10
+ export async function runCreate(name, port) {
11
+ // Validate name
12
+ if (!/^[a-z][a-z0-9-]*$/.test(name)) {
13
+ console.error(`${RED}Error:${RESET} Instance name must be lowercase alphanumeric with hyphens (e.g. "atlas", "my-bot").`);
14
+ process.exit(1);
15
+ }
16
+ if (name === "jinn") {
17
+ console.error(`${RED}Error:${RESET} "jinn" is the default instance. Use "jinn setup" instead.`);
18
+ process.exit(1);
19
+ }
20
+ const instances = loadInstances();
21
+ if (instances.some((i) => i.name === name)) {
22
+ console.error(`${RED}Error:${RESET} Instance "${name}" already exists.`);
23
+ process.exit(1);
24
+ }
25
+ const assignedPort = port ?? nextAvailablePort(instances);
26
+ const home = path.join(os.homedir(), `.${name}`);
27
+ // Check if home dir already exists
28
+ if (fs.existsSync(home)) {
29
+ console.error(`${RED}Error:${RESET} Directory ${home} already exists. Remove it first or choose a different name.`);
30
+ process.exit(1);
31
+ }
32
+ // Run setup in a subprocess with JINN_HOME set so paths.ts resolves correctly.
33
+ // This avoids Node module caching issues — paths.ts evaluates fresh in the child.
34
+ const jinnBin = process.argv[1];
35
+ try {
36
+ execFileSync(process.execPath, [jinnBin, "setup"], {
37
+ env: { ...process.env, JINN_HOME: home, JINN_INSTANCE: name },
38
+ stdio: "inherit",
39
+ });
40
+ }
41
+ catch {
42
+ console.error(`${RED}Error:${RESET} Failed to run setup for instance "${name}".`);
43
+ process.exit(1);
44
+ }
45
+ // Patch the config with the correct port and portal name
46
+ const configPath = path.join(home, "config.yaml");
47
+ if (fs.existsSync(configPath)) {
48
+ let config = fs.readFileSync(configPath, "utf-8");
49
+ config = config.replace(/port:\s*\d+/, `port: ${assignedPort}`);
50
+ // Set portal name to capitalized instance name
51
+ const displayName = name.charAt(0).toUpperCase() + name.slice(1);
52
+ if (config.includes("portal: {}")) {
53
+ config = config.replace("portal: {}", `portal:\n portalName: "${displayName}"`);
54
+ }
55
+ fs.writeFileSync(configPath, config);
56
+ }
57
+ // Register the instance
58
+ const instance = {
59
+ name,
60
+ port: assignedPort,
61
+ home,
62
+ createdAt: new Date().toISOString(),
63
+ };
64
+ instances.push(instance);
65
+ saveInstances(instances);
66
+ console.log(`\n${GREEN}Instance "${name}" created successfully.${RESET}`);
67
+ console.log(` Home: ${DIM}${home}${RESET}`);
68
+ console.log(` Port: ${DIM}${assignedPort}${RESET}`);
69
+ console.log(`\nStart with: ${DIM}jinn -i ${name} start${RESET}`);
70
+ console.log(`Or: ${DIM}jinn -i ${name} start --daemon${RESET}\n`);
71
+ }
72
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface Instance {
2
+ name: string;
3
+ port: number;
4
+ home: string;
5
+ createdAt: string;
6
+ }
7
+ export declare function loadInstances(): Instance[];
8
+ export declare function saveInstances(instances: Instance[]): void;
9
+ /** Find the next available port starting from 7777, skipping ports already used by instances. */
10
+ export declare function nextAvailablePort(instances: Instance[]): number;
11
+ /** Ensure the default "jinn" instance is registered. */
12
+ export declare function ensureDefaultInstance(): void;
13
+ export declare function findInstance(name: string): Instance | undefined;
14
+ //# sourceMappingURL=instances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instances.d.ts","sourceRoot":"","sources":["../../../src/cli/instances.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,IAAI,QAAQ,EAAE,CAO1C;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,CAGzD;AAED,iGAAiG;AACjG,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAK/D;AAED,wDAAwD;AACxD,wBAAgB,qBAAqB,IAAI,IAAI,CAU5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE/D"}
@@ -0,0 +1,43 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import { INSTANCES_REGISTRY } from "../shared/paths.js";
5
+ export function loadInstances() {
6
+ if (!fs.existsSync(INSTANCES_REGISTRY))
7
+ return [];
8
+ try {
9
+ return JSON.parse(fs.readFileSync(INSTANCES_REGISTRY, "utf-8"));
10
+ }
11
+ catch {
12
+ return [];
13
+ }
14
+ }
15
+ export function saveInstances(instances) {
16
+ fs.mkdirSync(path.dirname(INSTANCES_REGISTRY), { recursive: true });
17
+ fs.writeFileSync(INSTANCES_REGISTRY, JSON.stringify(instances, null, 2) + "\n");
18
+ }
19
+ /** Find the next available port starting from 7777, skipping ports already used by instances. */
20
+ export function nextAvailablePort(instances) {
21
+ const usedPorts = new Set(instances.map((i) => i.port));
22
+ let port = 7777;
23
+ while (usedPorts.has(port))
24
+ port++;
25
+ return port;
26
+ }
27
+ /** Ensure the default "jinn" instance is registered. */
28
+ export function ensureDefaultInstance() {
29
+ const instances = loadInstances();
30
+ if (instances.some((i) => i.name === "jinn"))
31
+ return;
32
+ instances.unshift({
33
+ name: "jinn",
34
+ port: 7777,
35
+ home: path.join(os.homedir(), ".jinn"),
36
+ createdAt: new Date().toISOString(),
37
+ });
38
+ saveInstances(instances);
39
+ }
40
+ export function findInstance(name) {
41
+ return loadInstances().find((i) => i.name === name);
42
+ }
43
+ //# sourceMappingURL=instances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instances.js","sourceRoot":"","sources":["../../../src/cli/instances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAgB,MAAM,oBAAoB,CAAC;AAStE,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAAE,OAAO,EAAE,CAAC;IAClD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAqB;IACjD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAClF,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,iBAAiB,CAAC,SAAqB;IACrD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,IAAI,EAAE,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,qBAAqB;IACnC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;QAAE,OAAO;IACrD,SAAS,CAAC,OAAO,CAAC;QAChB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC;QACtC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IACH,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runList(): Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/list.ts"],"names":[],"mappings":"AAUA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAkC7C"}
@@ -0,0 +1,38 @@
1
+ import { loadInstances, ensureDefaultInstance } from "./instances.js";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ const GREEN = "\x1b[32m";
5
+ const RED = "\x1b[31m";
6
+ const DIM = "\x1b[2m";
7
+ const RESET = "\x1b[0m";
8
+ export async function runList() {
9
+ ensureDefaultInstance();
10
+ const instances = loadInstances();
11
+ if (instances.length === 0) {
12
+ console.log("No instances found. Run \"jinn setup\" to create the default instance.");
13
+ return;
14
+ }
15
+ console.log("\nJinn Instances\n");
16
+ console.log(` ${"Name".padEnd(16)} ${"Port".padEnd(8)} ${"Status".padEnd(12)} Home`);
17
+ console.log(` ${"─".repeat(16)} ${"─".repeat(8)} ${"─".repeat(12)} ${"─".repeat(30)}`);
18
+ for (const inst of instances) {
19
+ // Check if PID file exists and process is alive
20
+ const pidFile = path.join(inst.home, "gateway.pid");
21
+ let status = "stopped";
22
+ if (fs.existsSync(pidFile)) {
23
+ try {
24
+ const pid = parseInt(fs.readFileSync(pidFile, "utf-8").trim(), 10);
25
+ process.kill(pid, 0);
26
+ status = "running";
27
+ }
28
+ catch {
29
+ status = "stopped";
30
+ }
31
+ }
32
+ const statusColor = status === "running" ? GREEN : RED;
33
+ const homeDisplay = inst.home.replace(process.env.HOME || "", "~");
34
+ console.log(` ${inst.name.padEnd(16)} ${String(inst.port).padEnd(8)} ${statusColor}${status.padEnd(12)}${RESET} ${DIM}${homeDisplay}${RESET}`);
35
+ }
36
+ console.log("");
37
+ }
38
+ //# sourceMappingURL=list.js.map