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,208 @@
1
+ import { createSession, getSessionBySourceRef, updateSession, deleteSession, insertMessage, } from "./registry.js";
2
+ import { buildContext } from "./context.js";
3
+ import { SessionQueue } from "./queue.js";
4
+ import { JINN_HOME } from "../shared/paths.js";
5
+ import { logger } from "../shared/logger.js";
6
+ export class SessionManager {
7
+ config;
8
+ engines;
9
+ connectorNames;
10
+ queue = new SessionQueue();
11
+ constructor(config, engines, connectorNames = []) {
12
+ this.config = config;
13
+ this.engines = engines;
14
+ this.connectorNames = connectorNames;
15
+ }
16
+ /**
17
+ * Get an engine by name.
18
+ */
19
+ getEngine(name) {
20
+ return this.engines.get(name);
21
+ }
22
+ /**
23
+ * Get the session queue (used by api.ts for mid-turn handling).
24
+ */
25
+ getQueue() {
26
+ return this.queue;
27
+ }
28
+ /**
29
+ * Main entry point: route an incoming message to the right session.
30
+ */
31
+ async route(msg, connector, employee) {
32
+ // Check for commands first
33
+ if (await this.handleCommand(msg, connector))
34
+ return;
35
+ const sourceRef = this.buildSourceRef(msg);
36
+ let session = getSessionBySourceRef(sourceRef);
37
+ if (!session) {
38
+ session = createSession({
39
+ engine: employee?.engine ?? this.config.engines.default,
40
+ source: msg.source,
41
+ sourceRef,
42
+ employee: employee?.name ?? undefined,
43
+ model: employee?.model ?? undefined,
44
+ portalName: this.config.portal?.portalName,
45
+ });
46
+ logger.info(`Created new session ${session.id} for ${sourceRef}${employee ? ` (employee: ${employee.name})` : ""}`);
47
+ }
48
+ const target = {
49
+ channel: msg.channel,
50
+ thread: msg.thread,
51
+ messageTs: msg.raw?.ts,
52
+ };
53
+ const attachmentPaths = msg.attachments
54
+ .map((a) => a.localPath)
55
+ .filter((p) => !!p);
56
+ // If a turn is already running, queue the next one and serialize by source.
57
+ if (session.status === "running" && this.queue.isRunning(sourceRef)) {
58
+ await connector.addReaction(target, "clock1").catch(() => { });
59
+ }
60
+ await this.queue.enqueue(sourceRef, () => this.runSession(session, msg.text, msg.user, attachmentPaths, connector, target, employee));
61
+ }
62
+ /**
63
+ * Run engine for a session, handling reactions and status updates.
64
+ */
65
+ async runSession(session, prompt, user, attachments, connector, target, employee) {
66
+ const engine = this.engines.get(session.engine);
67
+ if (!engine) {
68
+ logger.error(`Engine "${session.engine}" not found for session ${session.id}`);
69
+ await connector.sendMessage(target, `Error: engine "${session.engine}" not available.`);
70
+ return;
71
+ }
72
+ // Persist user message
73
+ insertMessage(session.id, "user", prompt);
74
+ // Add eyes reaction to the user's message
75
+ await connector.addReaction(target, "eyes").catch(() => { });
76
+ // Post a "thinking" placeholder message
77
+ const thinkingTs = await connector.sendMessage({ channel: target.channel, thread: target.thread || target.messageTs }, "_Thinking..._").catch(() => undefined);
78
+ updateSession(session.id, {
79
+ status: "running",
80
+ lastActivity: new Date().toISOString(),
81
+ });
82
+ try {
83
+ const systemPrompt = buildContext({
84
+ source: session.source,
85
+ channel: target.channel,
86
+ thread: target.thread,
87
+ user,
88
+ employee,
89
+ connectors: this.connectorNames,
90
+ config: this.config,
91
+ sessionId: session.id,
92
+ });
93
+ const engineConfig = session.engine === "codex"
94
+ ? this.config.engines.codex
95
+ : this.config.engines.claude;
96
+ const result = await engine.run({
97
+ prompt,
98
+ resumeSessionId: session.engineSessionId ?? undefined,
99
+ systemPrompt,
100
+ cwd: JINN_HOME,
101
+ bin: engineConfig.bin,
102
+ model: session.model ?? engineConfig.model,
103
+ effortLevel: engineConfig.effortLevel,
104
+ cliFlags: employee?.cliFlags,
105
+ attachments: attachments.length > 0 ? attachments : undefined,
106
+ sessionId: session.id,
107
+ });
108
+ // Edit the thinking message with the actual response, or send new if edit fails
109
+ const responseText = result.result?.trim()
110
+ ? result.result
111
+ : result.error || "(No response from engine)";
112
+ // Persist assistant response
113
+ insertMessage(session.id, "assistant", responseText);
114
+ if (thinkingTs) {
115
+ await connector.editMessage({ channel: target.channel, thread: target.thread || target.messageTs, messageTs: thinkingTs }, responseText).catch(async () => {
116
+ await connector.sendMessage({ channel: target.channel, thread: target.thread || target.messageTs }, responseText);
117
+ });
118
+ }
119
+ else {
120
+ await connector.sendMessage({ channel: target.channel, thread: target.thread || target.messageTs }, responseText);
121
+ }
122
+ // Remove eyes reaction
123
+ await connector.removeReaction(target, "eyes").catch(() => { });
124
+ // Update session with engine session id for resume
125
+ updateSession(session.id, {
126
+ engineSessionId: result.sessionId,
127
+ status: "idle",
128
+ lastActivity: new Date().toISOString(),
129
+ lastError: result.error ?? null,
130
+ });
131
+ logger.info(`Session ${session.id} completed in ${result.durationMs ?? 0}ms` +
132
+ (result.cost ? ` ($${result.cost.toFixed(4)})` : ""));
133
+ }
134
+ catch (err) {
135
+ const errMsg = err instanceof Error ? err.message : String(err);
136
+ logger.error(`Session ${session.id} error: ${errMsg}`);
137
+ updateSession(session.id, {
138
+ status: "error",
139
+ lastActivity: new Date().toISOString(),
140
+ lastError: errMsg,
141
+ });
142
+ // Edit thinking message with error, or send new
143
+ if (thinkingTs) {
144
+ await connector.editMessage({ channel: target.channel, thread: target.thread || target.messageTs, messageTs: thinkingTs }, `Error: ${errMsg}`).catch(() => { });
145
+ }
146
+ else {
147
+ await connector.sendMessage(target, `Error: ${errMsg}`).catch(() => { });
148
+ }
149
+ await connector.removeReaction(target, "eyes").catch(() => { });
150
+ }
151
+ }
152
+ /**
153
+ * Handle slash commands. Returns true if a command was handled.
154
+ */
155
+ async handleCommand(msg, connector) {
156
+ const text = msg.text.trim();
157
+ const target = { channel: msg.channel, thread: msg.thread };
158
+ if (text === "/new" || text.startsWith("/new ")) {
159
+ const sourceRef = this.buildSourceRef(msg);
160
+ this.resetSession(sourceRef);
161
+ await connector.sendMessage(target, "Session reset. Starting fresh.");
162
+ logger.info(`Session reset for ${sourceRef}`);
163
+ return true;
164
+ }
165
+ if (text === "/status" || text.startsWith("/status ")) {
166
+ const sourceRef = this.buildSourceRef(msg);
167
+ const session = getSessionBySourceRef(sourceRef);
168
+ if (session) {
169
+ const info = [
170
+ `Session: ${session.id}`,
171
+ `Engine: ${session.engine}`,
172
+ `Status: ${session.status}`,
173
+ `Created: ${session.createdAt}`,
174
+ `Last activity: ${session.lastActivity}`,
175
+ session.lastError ? `Last error: ${session.lastError}` : null,
176
+ ]
177
+ .filter(Boolean)
178
+ .join("\n");
179
+ await connector.sendMessage(target, info);
180
+ }
181
+ else {
182
+ await connector.sendMessage(target, "No active session for this conversation.");
183
+ }
184
+ return true;
185
+ }
186
+ return false;
187
+ }
188
+ /**
189
+ * Delete existing session for a source ref.
190
+ */
191
+ resetSession(sourceRef) {
192
+ const session = getSessionBySourceRef(sourceRef);
193
+ if (session) {
194
+ deleteSession(session.id);
195
+ logger.info(`Deleted session ${session.id}`);
196
+ }
197
+ }
198
+ /**
199
+ * Build a source ref string from a message.
200
+ */
201
+ buildSourceRef(msg) {
202
+ let ref = `${msg.source}:${msg.channel}`;
203
+ if (msg.thread)
204
+ ref += `:${msg.thread}`;
205
+ return ref;
206
+ }
207
+ }
208
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/sessions/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare class SessionQueue {
2
+ private queues;
3
+ /** Track which sessions are currently running */
4
+ private running;
5
+ /**
6
+ * Check if a session is currently running.
7
+ */
8
+ isRunning(sessionKey: string): boolean;
9
+ /**
10
+ * Enqueue a task for a session. Tasks are serialized per session key.
11
+ */
12
+ enqueue(sessionKey: string, fn: () => Promise<void>): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/sessions/queue.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAoC;IAClD,iDAAiD;IACjD,OAAO,CAAC,OAAO,CAAqB;IAEpC;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CA4B1E"}
@@ -0,0 +1,42 @@
1
+ export class SessionQueue {
2
+ queues = new Map();
3
+ /** Track which sessions are currently running */
4
+ running = new Set();
5
+ /**
6
+ * Check if a session is currently running.
7
+ */
8
+ isRunning(sessionKey) {
9
+ return this.running.has(sessionKey);
10
+ }
11
+ /**
12
+ * Enqueue a task for a session. Tasks are serialized per session key.
13
+ */
14
+ async enqueue(sessionKey, fn) {
15
+ const prev = this.queues.get(sessionKey) || Promise.resolve();
16
+ const next = prev.then(async () => {
17
+ this.running.add(sessionKey);
18
+ try {
19
+ await fn();
20
+ }
21
+ finally {
22
+ this.running.delete(sessionKey);
23
+ }
24
+ }, async () => {
25
+ this.running.add(sessionKey);
26
+ try {
27
+ await fn();
28
+ }
29
+ finally {
30
+ this.running.delete(sessionKey);
31
+ }
32
+ });
33
+ this.queues.set(sessionKey, next);
34
+ void next.finally(() => {
35
+ if (this.queues.get(sessionKey) === next) {
36
+ this.queues.delete(sessionKey);
37
+ }
38
+ });
39
+ return next;
40
+ }
41
+ }
42
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/sessions/queue.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAY;IACf,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAClD,iDAAiD;IACzC,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC;;OAEG;IACH,SAAS,CAAC,UAAkB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,EAAuB;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CACpB,KAAK,IAAI,EAAE;YACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,EAAE,EAAE,CAAC;YACb,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,EACD,KAAK,IAAI,EAAE;YACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,EAAE,EAAE,CAAC;YACb,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CACF,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACrB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,46 @@
1
+ import Database from 'better-sqlite3';
2
+ import type { Session } from '../shared/types.js';
3
+ export declare function initDb(): Database.Database;
4
+ export interface CreateSessionOpts {
5
+ engine: string;
6
+ source: string;
7
+ sourceRef: string;
8
+ employee?: string;
9
+ model?: string;
10
+ title?: string;
11
+ parentSessionId?: string;
12
+ }
13
+ export declare function createSession(opts: CreateSessionOpts & {
14
+ prompt?: string;
15
+ portalName?: string;
16
+ }): Session;
17
+ export declare function getSession(id: string): Session | undefined;
18
+ export declare function getSessionBySourceRef(sourceRef: string): Session | undefined;
19
+ export interface UpdateSessionFields {
20
+ engineSessionId?: string;
21
+ status?: Session['status'];
22
+ lastActivity?: string;
23
+ lastError?: string | null;
24
+ }
25
+ export declare function updateSession(id: string, updates: UpdateSessionFields): Session | undefined;
26
+ export interface ListSessionsFilter {
27
+ status?: Session['status'];
28
+ source?: string;
29
+ engine?: string;
30
+ }
31
+ export declare function listSessions(filter?: ListSessionsFilter): Session[];
32
+ /**
33
+ * Mark any sessions stuck in "running" status as "error".
34
+ * Called on gateway startup — if the gateway is starting, no sessions can actually be running.
35
+ */
36
+ export declare function recoverStaleSessions(): number;
37
+ export declare function deleteSession(id: string): boolean;
38
+ export interface SessionMessage {
39
+ id: string;
40
+ role: string;
41
+ content: string;
42
+ timestamp: number;
43
+ }
44
+ export declare function insertMessage(sessionId: string, role: string, content: string): void;
45
+ export declare function getMessages(sessionId: string): SessionMessage[];
46
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/sessions/registry.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAoDlD,wBAAgB,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAoB1C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CA2BzG;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAI1D;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAI5E;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,GAAG,SAAS,CA2B3F;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,EAAE,CAqBnE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAO7C;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAKjD;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIpF;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE,CAG/D"}
@@ -0,0 +1,193 @@
1
+ import path from 'node:path';
2
+ import { mkdirSync } from 'node:fs';
3
+ import Database from 'better-sqlite3';
4
+ import { v4 as uuidv4 } from 'uuid';
5
+ import { SESSIONS_DB } from '../shared/paths.js';
6
+ let db;
7
+ const CREATE_TABLE = `
8
+ CREATE TABLE IF NOT EXISTS sessions (
9
+ id TEXT PRIMARY KEY,
10
+ engine TEXT NOT NULL,
11
+ engine_session_id TEXT,
12
+ source TEXT NOT NULL,
13
+ source_ref TEXT NOT NULL,
14
+ employee TEXT,
15
+ model TEXT,
16
+ title TEXT,
17
+ parent_session_id TEXT,
18
+ status TEXT DEFAULT 'idle',
19
+ created_at TEXT NOT NULL,
20
+ last_activity TEXT NOT NULL,
21
+ last_error TEXT
22
+ )`;
23
+ const CREATE_MESSAGES_TABLE = `
24
+ CREATE TABLE IF NOT EXISTS messages (
25
+ id TEXT PRIMARY KEY,
26
+ session_id TEXT NOT NULL,
27
+ role TEXT NOT NULL,
28
+ content TEXT NOT NULL,
29
+ timestamp INTEGER NOT NULL
30
+ )`;
31
+ const CREATE_MESSAGES_INDEX = `
32
+ CREATE INDEX IF NOT EXISTS idx_messages_session ON messages (session_id, timestamp)
33
+ `;
34
+ function rowToSession(row) {
35
+ return {
36
+ id: row.id,
37
+ engine: row.engine,
38
+ engineSessionId: row.engine_session_id ?? null,
39
+ source: row.source,
40
+ sourceRef: row.source_ref,
41
+ employee: row.employee ?? null,
42
+ model: row.model ?? null,
43
+ title: row.title ?? null,
44
+ parentSessionId: row.parent_session_id ?? null,
45
+ status: row.status,
46
+ createdAt: row.created_at,
47
+ lastActivity: row.last_activity,
48
+ lastError: row.last_error ?? null,
49
+ };
50
+ }
51
+ export function initDb() {
52
+ if (db)
53
+ return db;
54
+ mkdirSync(path.dirname(SESSIONS_DB), { recursive: true });
55
+ db = new Database(SESSIONS_DB);
56
+ db.pragma('journal_mode = WAL');
57
+ db.exec(CREATE_TABLE);
58
+ db.exec(CREATE_MESSAGES_TABLE);
59
+ db.exec(CREATE_MESSAGES_INDEX);
60
+ // Migrate: add title column if missing
61
+ const cols = db.prepare('PRAGMA table_info(sessions)').all();
62
+ const colNames = new Set(cols.map((c) => c.name));
63
+ if (!colNames.has('title')) {
64
+ db.exec('ALTER TABLE sessions ADD COLUMN title TEXT');
65
+ }
66
+ if (!colNames.has('parent_session_id')) {
67
+ db.exec('ALTER TABLE sessions ADD COLUMN parent_session_id TEXT');
68
+ }
69
+ return db;
70
+ }
71
+ function getNextSessionNumber() {
72
+ const db = initDb();
73
+ const row = db.prepare('SELECT COUNT(*) as count FROM sessions').get();
74
+ return row.count + 1;
75
+ }
76
+ function generateTitle(prompt) {
77
+ const num = getNextSessionNumber();
78
+ if (!prompt)
79
+ return `#${num}`;
80
+ const cleaned = prompt.replace(/\n/g, ' ').replace(/@\w+/g, '').replace(/\s+/g, ' ').trim();
81
+ if (!cleaned)
82
+ return `#${num}`;
83
+ const summary = cleaned.slice(0, 30).trim();
84
+ return `#${num} - ${summary}${cleaned.length > 30 ? '...' : ''}`;
85
+ }
86
+ export function createSession(opts) {
87
+ const db = initDb();
88
+ const now = new Date().toISOString();
89
+ const id = uuidv4();
90
+ const title = opts.title ?? generateTitle(opts.prompt);
91
+ const stmt = db.prepare(`
92
+ INSERT INTO sessions (id, engine, source, source_ref, employee, model, title, parent_session_id, status, created_at, last_activity)
93
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'idle', ?, ?)
94
+ `);
95
+ stmt.run(id, opts.engine, opts.source, opts.sourceRef, opts.employee ?? null, opts.model ?? null, title, opts.parentSessionId ?? null, now, now);
96
+ return {
97
+ id,
98
+ engine: opts.engine,
99
+ engineSessionId: null,
100
+ source: opts.source,
101
+ sourceRef: opts.sourceRef,
102
+ employee: opts.employee ?? null,
103
+ model: opts.model ?? null,
104
+ title,
105
+ parentSessionId: opts.parentSessionId ?? null,
106
+ status: 'idle',
107
+ createdAt: now,
108
+ lastActivity: now,
109
+ lastError: null,
110
+ };
111
+ }
112
+ export function getSession(id) {
113
+ const db = initDb();
114
+ const row = db.prepare('SELECT * FROM sessions WHERE id = ?').get(id);
115
+ return row ? rowToSession(row) : undefined;
116
+ }
117
+ export function getSessionBySourceRef(sourceRef) {
118
+ const db = initDb();
119
+ const row = db.prepare('SELECT * FROM sessions WHERE source_ref = ? ORDER BY last_activity DESC LIMIT 1').get(sourceRef);
120
+ return row ? rowToSession(row) : undefined;
121
+ }
122
+ export function updateSession(id, updates) {
123
+ const db = initDb();
124
+ const sets = [];
125
+ const values = [];
126
+ if (updates.engineSessionId !== undefined) {
127
+ sets.push('engine_session_id = ?');
128
+ values.push(updates.engineSessionId);
129
+ }
130
+ if (updates.status !== undefined) {
131
+ sets.push('status = ?');
132
+ values.push(updates.status);
133
+ }
134
+ if (updates.lastActivity !== undefined) {
135
+ sets.push('last_activity = ?');
136
+ values.push(updates.lastActivity);
137
+ }
138
+ if (updates.lastError !== undefined) {
139
+ sets.push('last_error = ?');
140
+ values.push(updates.lastError);
141
+ }
142
+ if (sets.length === 0)
143
+ return getSession(id);
144
+ values.push(id);
145
+ db.prepare(`UPDATE sessions SET ${sets.join(', ')} WHERE id = ?`).run(...values);
146
+ return getSession(id);
147
+ }
148
+ export function listSessions(filter) {
149
+ const db = initDb();
150
+ const conditions = [];
151
+ const values = [];
152
+ if (filter?.status) {
153
+ conditions.push('status = ?');
154
+ values.push(filter.status);
155
+ }
156
+ if (filter?.source) {
157
+ conditions.push('source = ?');
158
+ values.push(filter.source);
159
+ }
160
+ if (filter?.engine) {
161
+ conditions.push('engine = ?');
162
+ values.push(filter.engine);
163
+ }
164
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
165
+ const rows = db.prepare(`SELECT * FROM sessions ${where} ORDER BY last_activity DESC`).all(...values);
166
+ return rows.map(rowToSession);
167
+ }
168
+ /**
169
+ * Mark any sessions stuck in "running" status as "error".
170
+ * Called on gateway startup — if the gateway is starting, no sessions can actually be running.
171
+ */
172
+ export function recoverStaleSessions() {
173
+ const db = initDb();
174
+ const now = new Date().toISOString();
175
+ const result = db.prepare("UPDATE sessions SET status = 'error', last_activity = ?, last_error = 'Interrupted: gateway restarted while session was running' WHERE status = 'running'").run(now);
176
+ return result.changes;
177
+ }
178
+ export function deleteSession(id) {
179
+ const db = initDb();
180
+ db.prepare('DELETE FROM messages WHERE session_id = ?').run(id);
181
+ const result = db.prepare('DELETE FROM sessions WHERE id = ?').run(id);
182
+ return result.changes > 0;
183
+ }
184
+ export function insertMessage(sessionId, role, content) {
185
+ const db = initDb();
186
+ const id = uuidv4();
187
+ db.prepare('INSERT INTO messages (id, session_id, role, content, timestamp) VALUES (?, ?, ?, ?, ?)').run(id, sessionId, role, content, Date.now());
188
+ }
189
+ export function getMessages(sessionId) {
190
+ const db = initDb();
191
+ return db.prepare('SELECT id, role, content, timestamp FROM messages WHERE session_id = ? ORDER BY timestamp ASC').all(sessionId);
192
+ }
193
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/sessions/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { JinnConfig } from "./types.js";
2
+ export declare function loadConfig(): JinnConfig;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/shared/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,UAAU,IAAI,UAAU,CAQvC"}
@@ -0,0 +1,11 @@
1
+ import fs from "node:fs";
2
+ import yaml from "js-yaml";
3
+ import { CONFIG_PATH } from "./paths.js";
4
+ export function loadConfig() {
5
+ if (!fs.existsSync(CONFIG_PATH)) {
6
+ throw new Error(`Jinn config not found at ${CONFIG_PATH}. Run "jinn setup" first.`);
7
+ }
8
+ const raw = fs.readFileSync(CONFIG_PATH, "utf-8");
9
+ return yaml.load(raw);
10
+ }
11
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/shared/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,4BAA4B,WAAW,2BAA2B,CACnE,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAe,CAAC;AACtC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function configureLogger(opts: {
2
+ level?: string;
3
+ stdout?: boolean;
4
+ file?: boolean;
5
+ }): void;
6
+ export declare const logger: {
7
+ debug: (msg: string) => void;
8
+ info: (msg: string) => void;
9
+ warn: (msg: string) => void;
10
+ error: (msg: string) => void;
11
+ };
12
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/shared/logger.ts"],"names":[],"mappings":"AAWA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,QASA;AASD,eAAO,MAAM,MAAM;iBACJ,MAAM;gBACP,MAAM;gBACN,MAAM;iBACL,MAAM;CACpB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { LOGS_DIR } from "./paths.js";
4
+ const LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
5
+ let minLevel = "info";
6
+ let writeToStdout = true;
7
+ let logStream = null;
8
+ export function configureLogger(opts) {
9
+ if (opts.level && opts.level in LEVELS)
10
+ minLevel = opts.level;
11
+ if (opts.stdout !== undefined)
12
+ writeToStdout = opts.stdout;
13
+ if (opts.file !== false) {
14
+ fs.mkdirSync(LOGS_DIR, { recursive: true });
15
+ logStream = fs.createWriteStream(path.join(LOGS_DIR, "gateway.log"), {
16
+ flags: "a",
17
+ });
18
+ }
19
+ }
20
+ function log(level, message) {
21
+ if (LEVELS[level] < LEVELS[minLevel])
22
+ return;
23
+ const line = `${new Date().toISOString()} [${level.toUpperCase()}] ${message}`;
24
+ if (writeToStdout)
25
+ console.log(line);
26
+ if (logStream)
27
+ logStream.write(line + "\n");
28
+ }
29
+ export const logger = {
30
+ debug: (msg) => log("debug", msg),
31
+ info: (msg) => log("info", msg),
32
+ warn: (msg) => log("warn", msg),
33
+ error: (msg) => log("error", msg),
34
+ };
35
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/shared/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAW,CAAC;AAGjE,IAAI,QAAQ,GAAa,MAAM,CAAC;AAChC,IAAI,aAAa,GAAG,IAAI,CAAC;AACzB,IAAI,SAAS,GAA0B,IAAI,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,IAI/B;IACC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM;QAAE,QAAQ,GAAG,IAAI,CAAC,KAAiB,CAAC;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,SAAS,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;YACnE,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,KAAe,EAAE,OAAe;IAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO;IAC7C,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;IAC/E,IAAI,aAAa;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,SAAS;QAAE,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;IACzC,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IACvC,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IACvC,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;CAC1C,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const JINN_HOME: string;
2
+ export declare const CONFIG_PATH: string;
3
+ export declare const SESSIONS_DB: string;
4
+ export declare const CRON_JOBS: string;
5
+ export declare const CRON_RUNS: string;
6
+ export declare const ORG_DIR: string;
7
+ export declare const SKILLS_DIR: string;
8
+ export declare const DOCS_DIR: string;
9
+ export declare const LOGS_DIR: string;
10
+ export declare const TMP_DIR: string;
11
+ export declare const PID_FILE: string;
12
+ export declare const CLAUDE_SKILLS_DIR: string;
13
+ export declare const AGENTS_SKILLS_DIR: string;
14
+ export declare const TEMPLATE_DIR: string;
15
+ export declare const MIGRATIONS_DIR: string;
16
+ export declare const TEMPLATE_MIGRATIONS_DIR: string;
17
+ /** Path to the global instances registry (always in default ~/.jinn/) */
18
+ export declare const INSTANCES_REGISTRY: string;
19
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/shared/paths.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,SAAS,QAAgB,CAAC;AACvC,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAAkD,CAAC;AAC3E,eAAO,MAAM,SAAS,QAA4C,CAAC;AACnE,eAAO,MAAM,SAAS,QAAuC,CAAC;AAC9D,eAAO,MAAM,OAAO,QAA8B,CAAC;AACnD,eAAO,MAAM,UAAU,QAAiC,CAAC;AACzD,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,OAAO,QAA8B,CAAC;AACnD,eAAO,MAAM,QAAQ,QAAsC,CAAC;AAC5D,eAAO,MAAM,iBAAiB,QAA4C,CAAC;AAC3E,eAAO,MAAM,iBAAiB,QAA4C,CAAC;AAC3E,eAAO,MAAM,YAAY,QAAqD,CAAC;AAC/E,eAAO,MAAM,cAAc,QAAqC,CAAC;AACjE,eAAO,MAAM,uBAAuB,QAAwC,CAAC;AAE7E,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,QAAqD,CAAC"}