@jait/gateway 0.1.274 → 0.1.276

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 (125) hide show
  1. package/dist/clawhub/client.d.ts +105 -0
  2. package/dist/clawhub/client.d.ts.map +1 -0
  3. package/dist/clawhub/client.js +123 -0
  4. package/dist/clawhub/client.js.map +1 -0
  5. package/dist/db/migrations.d.ts.map +1 -1
  6. package/dist/db/migrations.js +22 -0
  7. package/dist/db/migrations.js.map +1 -1
  8. package/dist/db/schema.d.ts +216 -0
  9. package/dist/db/schema.d.ts.map +1 -1
  10. package/dist/db/schema.js +14 -0
  11. package/dist/db/schema.js.map +1 -1
  12. package/dist/foundation.d.ts +4 -1
  13. package/dist/foundation.d.ts.map +1 -1
  14. package/dist/foundation.js +2 -0
  15. package/dist/foundation.js.map +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +54 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/plugins/contracts.d.ts +44 -0
  20. package/dist/plugins/contracts.d.ts.map +1 -1
  21. package/dist/plugins/contracts.js +9 -0
  22. package/dist/plugins/contracts.js.map +1 -1
  23. package/dist/plugins/manager.d.ts +65 -0
  24. package/dist/plugins/manager.d.ts.map +1 -0
  25. package/dist/plugins/manager.js +393 -0
  26. package/dist/plugins/manager.js.map +1 -0
  27. package/dist/plugins/manifest.d.ts +69 -0
  28. package/dist/plugins/manifest.d.ts.map +1 -0
  29. package/dist/plugins/manifest.js +28 -0
  30. package/dist/plugins/manifest.js.map +1 -0
  31. package/dist/plugins/openclaw-adapter.d.ts +42 -0
  32. package/dist/plugins/openclaw-adapter.d.ts.map +1 -0
  33. package/dist/plugins/openclaw-adapter.js +236 -0
  34. package/dist/plugins/openclaw-adapter.js.map +1 -0
  35. package/dist/routes/chat.d.ts +2 -0
  36. package/dist/routes/chat.d.ts.map +1 -1
  37. package/dist/routes/chat.js +26 -3
  38. package/dist/routes/chat.js.map +1 -1
  39. package/dist/routes/mcp-server.d.ts.map +1 -1
  40. package/dist/routes/mcp-server.js +3 -0
  41. package/dist/routes/mcp-server.js.map +1 -1
  42. package/dist/routes/plugins.d.ts +16 -0
  43. package/dist/routes/plugins.d.ts.map +1 -0
  44. package/dist/routes/plugins.js +84 -0
  45. package/dist/routes/plugins.js.map +1 -0
  46. package/dist/routes/skills.d.ts +11 -0
  47. package/dist/routes/skills.d.ts.map +1 -0
  48. package/dist/routes/skills.js +39 -0
  49. package/dist/routes/skills.js.map +1 -0
  50. package/dist/routes/store.d.ts +21 -0
  51. package/dist/routes/store.d.ts.map +1 -0
  52. package/dist/routes/store.js +149 -0
  53. package/dist/routes/store.js.map +1 -0
  54. package/dist/routes/threads.d.ts +2 -0
  55. package/dist/routes/threads.d.ts.map +1 -1
  56. package/dist/routes/threads.js +9 -1
  57. package/dist/routes/threads.js.map +1 -1
  58. package/dist/server.d.ts +3 -0
  59. package/dist/server.d.ts.map +1 -1
  60. package/dist/server.js +20 -0
  61. package/dist/server.js.map +1 -1
  62. package/dist/skills/index.d.ts +71 -0
  63. package/dist/skills/index.d.ts.map +1 -0
  64. package/dist/skills/index.js +176 -0
  65. package/dist/skills/index.js.map +1 -0
  66. package/dist/tools/prompts/prompt-registry.d.ts +3 -0
  67. package/dist/tools/prompts/prompt-registry.d.ts.map +1 -1
  68. package/dist/tools/prompts/prompt-registry.js +5 -0
  69. package/dist/tools/prompts/prompt-registry.js.map +1 -1
  70. package/package.json +1 -1
  71. package/web-dist/assets/{_basePickBy-_w8ADSKe.js → _basePickBy-SHIq-9-M.js} +1 -1
  72. package/web-dist/assets/{_baseUniq-DoTWg3g_.js → _baseUniq-DvuVM3FL.js} +1 -1
  73. package/web-dist/assets/{arc-EhnKDCZM.js → arc-rRRDxwm9.js} +1 -1
  74. package/web-dist/assets/{architectureDiagram-2XIMDMQ5-CGSsPfai.js → architectureDiagram-2XIMDMQ5-6Ie8gkit.js} +1 -1
  75. package/web-dist/assets/{blockDiagram-WCTKOSBZ-BI0bxzbF.js → blockDiagram-WCTKOSBZ-DyFAm0Wv.js} +1 -1
  76. package/web-dist/assets/{c4Diagram-IC4MRINW-B7Esq86v.js → c4Diagram-IC4MRINW-CFf9-N6D.js} +1 -1
  77. package/web-dist/assets/channel-C1a8HTQY.js +1 -0
  78. package/web-dist/assets/{chunk-4BX2VUAB-CiXYSUcF.js → chunk-4BX2VUAB-BXSP-ZXZ.js} +1 -1
  79. package/web-dist/assets/{chunk-55IACEB6-DLQFD8im.js → chunk-55IACEB6-DZz9Zfm4.js} +1 -1
  80. package/web-dist/assets/{chunk-FMBD7UC4-DZm4Tm5l.js → chunk-FMBD7UC4-BinqNBeA.js} +1 -1
  81. package/web-dist/assets/{chunk-JSJVCQXG-Du80znG3.js → chunk-JSJVCQXG-BEkDIiGt.js} +1 -1
  82. package/web-dist/assets/{chunk-KX2RTZJC-C3G1hqKb.js → chunk-KX2RTZJC-DRvcMdOS.js} +1 -1
  83. package/web-dist/assets/{chunk-NQ4KR5QH-GHNL_fKu.js → chunk-NQ4KR5QH-D7Qm-vTv.js} +1 -1
  84. package/web-dist/assets/{chunk-QZHKN3VN-DdFDd2Sp.js → chunk-QZHKN3VN-4EQs-zb4.js} +1 -1
  85. package/web-dist/assets/{chunk-WL4C6EOR-Bh5yMWT0.js → chunk-WL4C6EOR-C4J0wAQ1.js} +1 -1
  86. package/web-dist/assets/classDiagram-VBA2DB6C-kXFPuDdZ.js +1 -0
  87. package/web-dist/assets/classDiagram-v2-RAHNMMFH-kXFPuDdZ.js +1 -0
  88. package/web-dist/assets/clone-XznVhxYJ.js +1 -0
  89. package/web-dist/assets/{cose-bilkent-S5V4N54A-BsMcTEg-.js → cose-bilkent-S5V4N54A-pomS5wGN.js} +1 -1
  90. package/web-dist/assets/{dagre-KLK3FWXG-E0Llm070.js → dagre-KLK3FWXG-B-w30MG4.js} +1 -1
  91. package/web-dist/assets/{diagram-E7M64L7V-7H43VOx9.js → diagram-E7M64L7V-edXvdd7B.js} +1 -1
  92. package/web-dist/assets/{diagram-IFDJBPK2-Dy8iZsNw.js → diagram-IFDJBPK2-BJVALpLi.js} +1 -1
  93. package/web-dist/assets/{diagram-P4PSJMXO-3z8FT-4H.js → diagram-P4PSJMXO-B9llufAx.js} +1 -1
  94. package/web-dist/assets/{erDiagram-INFDFZHY-CGF2mp1V.js → erDiagram-INFDFZHY-D7r6WG_I.js} +1 -1
  95. package/web-dist/assets/{flowDiagram-PKNHOUZH-dt-pVRuj.js → flowDiagram-PKNHOUZH-BzOT4Umo.js} +1 -1
  96. package/web-dist/assets/{ganttDiagram-A5KZAMGK-CA4So_R2.js → ganttDiagram-A5KZAMGK-Cjbc4Lgp.js} +1 -1
  97. package/web-dist/assets/{gitGraphDiagram-K3NZZRJ6-CSyJ3OFu.js → gitGraphDiagram-K3NZZRJ6-B62CN_CL.js} +1 -1
  98. package/web-dist/assets/{graph-BDXwNkS1.js → graph-VLok1XGR.js} +1 -1
  99. package/web-dist/assets/index-BSVKCxiM.css +32 -0
  100. package/web-dist/assets/{index-B3CNIt2G.js → index-VURYXd1Z.js} +383 -373
  101. package/web-dist/assets/{infoDiagram-LFFYTUFH-x-RWNcIW.js → infoDiagram-LFFYTUFH-339hVOss.js} +1 -1
  102. package/web-dist/assets/{ishikawaDiagram-PHBUUO56-0esHI7MO.js → ishikawaDiagram-PHBUUO56-VRStan0c.js} +1 -1
  103. package/web-dist/assets/{journeyDiagram-4ABVD52K-BM496EwS.js → journeyDiagram-4ABVD52K-C_GmHh2b.js} +1 -1
  104. package/web-dist/assets/{kanban-definition-K7BYSVSG-YEIVwtYF.js → kanban-definition-K7BYSVSG-CT4QBteH.js} +1 -1
  105. package/web-dist/assets/{layout-jzHvv-vA.js → layout-BaAZzhOL.js} +1 -1
  106. package/web-dist/assets/{linear-D_zozBny.js → linear-t_udGhm_.js} +1 -1
  107. package/web-dist/assets/{mindmap-definition-YRQLILUH-By0PoNnz.js → mindmap-definition-YRQLILUH-DrP8dGq6.js} +1 -1
  108. package/web-dist/assets/{pieDiagram-SKSYHLDU-CrQAAH7f.js → pieDiagram-SKSYHLDU-CJiUjmMN.js} +1 -1
  109. package/web-dist/assets/{quadrantDiagram-337W2JSQ-arpVQ9oG.js → quadrantDiagram-337W2JSQ-WSyvax55.js} +1 -1
  110. package/web-dist/assets/{requirementDiagram-Z7DCOOCP-BXgkFODs.js → requirementDiagram-Z7DCOOCP-ll0s5py9.js} +1 -1
  111. package/web-dist/assets/{sankeyDiagram-WA2Y5GQK-BDi51cAi.js → sankeyDiagram-WA2Y5GQK-DYrhz3im.js} +1 -1
  112. package/web-dist/assets/{sequenceDiagram-2WXFIKYE-i39OfAbQ.js → sequenceDiagram-2WXFIKYE-Dp6ZSJqi.js} +1 -1
  113. package/web-dist/assets/{stateDiagram-RAJIS63D-CNgp8Vs6.js → stateDiagram-RAJIS63D-CfkOX-qK.js} +1 -1
  114. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-BcJtPvOh.js +1 -0
  115. package/web-dist/assets/{timeline-definition-YZTLITO2-CBbqCMVi.js → timeline-definition-YZTLITO2-BGgyc2hn.js} +1 -1
  116. package/web-dist/assets/{treemap-KZPCXAKY-yDy9DP9O.js → treemap-KZPCXAKY-B3S5xd6G.js} +1 -1
  117. package/web-dist/assets/{vennDiagram-LZ73GAT5-BnZoghxR.js → vennDiagram-LZ73GAT5-n7918zRF.js} +1 -1
  118. package/web-dist/assets/{xychartDiagram-JWTSCODW-DBzQzD9W.js → xychartDiagram-JWTSCODW-wrqHya8i.js} +1 -1
  119. package/web-dist/index.html +2 -2
  120. package/web-dist/assets/channel-CINGP9LA.js +0 -1
  121. package/web-dist/assets/classDiagram-VBA2DB6C-BKWxO77f.js +0 -1
  122. package/web-dist/assets/classDiagram-v2-RAHNMMFH-BKWxO77f.js +0 -1
  123. package/web-dist/assets/clone-BramF8dO.js +0 -1
  124. package/web-dist/assets/index-DAgf0tm_.css +0 -32
  125. package/web-dist/assets/stateDiagram-v2-FVOUBMTO-DIScS6y6.js +0 -1
@@ -0,0 +1,236 @@
1
+ /**
2
+ * OpenClaw compatibility adapter.
3
+ *
4
+ * Loads OpenClaw-format plugins (openclaw.plugin.json + index.ts using
5
+ * definePluginEntry) and bridges them into Jait's plugin system.
6
+ *
7
+ * Supported:
8
+ * - Tool registration (registerTool) → Jait ToolDefinition
9
+ * - Plugin config passthrough
10
+ * - Scoped logging
11
+ *
12
+ * Unsupported registrations (channels, speech providers, CLI backends, etc.)
13
+ * are silently captured so the plugin doesn't throw, but they are not wired
14
+ * into Jait's runtime. They are logged at debug level.
15
+ */
16
+ import { readdir, readFile, stat } from "node:fs/promises";
17
+ import { join, resolve } from "node:path";
18
+ function createStubApi(manifest, pluginConfig, log) {
19
+ const collected = { tools: [], unsupported: [] };
20
+ const noop = (method) => (...args) => {
21
+ collected.unsupported.push({ method, args });
22
+ log.info(`[openclaw-compat] ${manifest.id}: skipped ${method} (not supported in Jait)`);
23
+ };
24
+ // Build a minimal shape that satisfies OpenClawPluginApi
25
+ const api = {
26
+ id: manifest.id,
27
+ name: manifest.name ?? manifest.id,
28
+ version: manifest.version,
29
+ description: manifest.description,
30
+ source: `openclaw:${manifest.id}`,
31
+ rootDir: undefined, // set later
32
+ registrationMode: "full",
33
+ config: {}, // OpenClaw global config — empty in Jait context
34
+ pluginConfig,
35
+ runtime: {}, // Empty runtime object
36
+ logger: log,
37
+ // ── Supported: tool registration ──────────────────────────────
38
+ registerTool: (tool) => {
39
+ if (typeof tool === "function") {
40
+ // Factory pattern (OpenClawPluginToolFactory)
41
+ try {
42
+ const resolved = tool();
43
+ collected.tools.push(resolved);
44
+ }
45
+ catch (err) {
46
+ log.warn(`[openclaw-compat] ${manifest.id}: tool factory threw: ${err}`);
47
+ }
48
+ }
49
+ else if (tool && typeof tool === "object" && "name" in tool) {
50
+ collected.tools.push(tool);
51
+ }
52
+ },
53
+ // ── Unsupported — captured but not wired ──────────────────────
54
+ registerHook: noop("registerHook"),
55
+ registerHttpRoute: noop("registerHttpRoute"),
56
+ registerChannel: noop("registerChannel"),
57
+ registerGatewayMethod: noop("registerGatewayMethod"),
58
+ registerCli: noop("registerCli"),
59
+ registerService: noop("registerService"),
60
+ registerCliBackend: noop("registerCliBackend"),
61
+ registerProvider: noop("registerProvider"),
62
+ registerSpeechProvider: noop("registerSpeechProvider"),
63
+ registerRealtimeTranscriptionProvider: noop("registerRealtimeTranscriptionProvider"),
64
+ registerRealtimeVoiceProvider: noop("registerRealtimeVoiceProvider"),
65
+ registerMediaUnderstandingProvider: noop("registerMediaUnderstandingProvider"),
66
+ registerImageGenerationProvider: noop("registerImageGenerationProvider"),
67
+ registerWebFetchProvider: noop("registerWebFetchProvider"),
68
+ registerWebSearchProvider: noop("registerWebSearchProvider"),
69
+ registerInteractiveHandler: noop("registerInteractiveHandler"),
70
+ onConversationBindingResolved: noop("onConversationBindingResolved"),
71
+ registerCommand: noop("registerCommand"),
72
+ registerContextEngine: noop("registerContextEngine"),
73
+ registerMemoryPromptSection: noop("registerMemoryPromptSection"),
74
+ registerMemoryFlushPlan: noop("registerMemoryFlushPlan"),
75
+ registerMemoryRuntime: noop("registerMemoryRuntime"),
76
+ registerMemoryEmbeddingProvider: noop("registerMemoryEmbeddingProvider"),
77
+ // ── Utility stubs ─────────────────────────────────────────────
78
+ resolvePath: (p) => p,
79
+ on: noop("on"),
80
+ };
81
+ return api;
82
+ }
83
+ /* ------------------------------------------------------------------ */
84
+ /* Convert OpenClaw tool → Jait PluginToolDeclaration */
85
+ /* ------------------------------------------------------------------ */
86
+ function convertTool(_pluginId, tool) {
87
+ return {
88
+ name: tool.name,
89
+ description: tool.description ?? tool.label ?? tool.name,
90
+ parameters: tool.parameters ?? {
91
+ type: "object",
92
+ properties: {},
93
+ },
94
+ tier: "external",
95
+ category: "external",
96
+ risk: "high",
97
+ defaultConsentLevel: "dangerous",
98
+ execute: async (input, _ctx) => {
99
+ const toolCallId = `jait-${Date.now()}`;
100
+ const params = (input && typeof input === "object" ? input : {});
101
+ try {
102
+ const result = await tool.execute(toolCallId, params);
103
+ const text = typeof result === "string" ? result : JSON.stringify(result, null, 2);
104
+ return { ok: true, message: text };
105
+ }
106
+ catch (err) {
107
+ const msg = err instanceof Error ? err.message : String(err);
108
+ return { ok: false, message: `Error: ${msg}` };
109
+ }
110
+ },
111
+ };
112
+ }
113
+ /* ------------------------------------------------------------------ */
114
+ /* Discovery — find openclaw.plugin.json in a directory */
115
+ /* ------------------------------------------------------------------ */
116
+ export async function discoverOpenClawPlugins(extensionsDir) {
117
+ const results = [];
118
+ let entries;
119
+ try {
120
+ entries = await readdir(extensionsDir);
121
+ }
122
+ catch {
123
+ return results;
124
+ }
125
+ for (const entry of entries) {
126
+ const dir = join(extensionsDir, entry);
127
+ const dirStat = await stat(dir).catch(() => null);
128
+ if (!dirStat?.isDirectory())
129
+ continue;
130
+ const manifestPath = join(dir, "openclaw.plugin.json");
131
+ try {
132
+ const raw = JSON.parse(await readFile(manifestPath, "utf-8"));
133
+ if (!raw.id || typeof raw.id !== "string")
134
+ continue;
135
+ results.push({ manifest: raw, dir });
136
+ }
137
+ catch {
138
+ // No OpenClaw manifest — skip
139
+ }
140
+ }
141
+ return results;
142
+ }
143
+ /* ------------------------------------------------------------------ */
144
+ /* Convert OpenClaw manifest → Jait manifest (for UI display) */
145
+ /* ------------------------------------------------------------------ */
146
+ export function openclawToJaitManifest(oc, _dir) {
147
+ return {
148
+ id: `openclaw:${oc.id}`,
149
+ displayName: oc.name ?? oc.id,
150
+ version: oc.version ?? "0.0.0",
151
+ description: oc.description,
152
+ author: "OpenClaw",
153
+ main: "index.ts",
154
+ categories: ["openclaw"],
155
+ configSchema: oc.configSchema,
156
+ contributes: {
157
+ tools: oc.contracts?.tools?.map((name) => ({ name, description: name })),
158
+ },
159
+ };
160
+ }
161
+ /* ------------------------------------------------------------------ */
162
+ /* Load a single OpenClaw plugin as a Jait PluginModule */
163
+ /* ------------------------------------------------------------------ */
164
+ export function createOpenClawPluginModule(manifest, dir) {
165
+ const jaitId = `openclaw:${manifest.id}`;
166
+ let disposeCallbacks = [];
167
+ return {
168
+ id: jaitId,
169
+ displayName: manifest.name ?? manifest.id,
170
+ async setup(ctx) {
171
+ const pluginConfig = ctx.getConfig();
172
+ const api = createStubApi(manifest, pluginConfig, ctx.log);
173
+ api.rootDir = dir;
174
+ // Try to import the plugin entry
175
+ // OpenClaw plugins use index.ts or index.js
176
+ const candidates = ["index.ts", "index.js", "index.mjs"];
177
+ let loaded = false;
178
+ for (const candidate of candidates) {
179
+ const entryPath = resolve(dir, candidate);
180
+ try {
181
+ const entryStat = await stat(entryPath).catch(() => null);
182
+ if (!entryStat?.isFile())
183
+ continue;
184
+ const mod = await import(entryPath);
185
+ const definition = mod.default ?? mod.plugin ?? mod;
186
+ if (typeof definition === "function") {
187
+ // Direct function export: (api) => void
188
+ await definition(api);
189
+ loaded = true;
190
+ break;
191
+ }
192
+ else if (definition && typeof definition === "object") {
193
+ if (typeof definition.register === "function") {
194
+ await definition.register(api);
195
+ loaded = true;
196
+ break;
197
+ }
198
+ else if (typeof definition.activate === "function") {
199
+ await definition.activate(api);
200
+ loaded = true;
201
+ break;
202
+ }
203
+ }
204
+ }
205
+ catch (err) {
206
+ ctx.log.warn(`Failed to load OpenClaw plugin entry ${entryPath}: ${err}`);
207
+ }
208
+ }
209
+ if (!loaded) {
210
+ ctx.log.warn(`OpenClaw plugin ${manifest.id}: no loadable entry found in ${dir}`);
211
+ }
212
+ // Convert collected tools
213
+ const tools = api.tools.map((t) => convertTool(jaitId, t));
214
+ const unsupported = api.unsupported;
215
+ if (unsupported.length > 0) {
216
+ const methods = [...new Set(unsupported.map((u) => u.method))];
217
+ ctx.log.info(`OpenClaw plugin ${manifest.id}: ${tools.length} tool(s) bridged, ` +
218
+ `${unsupported.length} unsupported registration(s) skipped (${methods.join(", ")})`);
219
+ }
220
+ else if (tools.length > 0) {
221
+ ctx.log.info(`OpenClaw plugin ${manifest.id}: ${tools.length} tool(s) bridged`);
222
+ }
223
+ return { tools };
224
+ },
225
+ async dispose() {
226
+ for (const cb of disposeCallbacks) {
227
+ try {
228
+ await cb();
229
+ }
230
+ catch { /* best effort */ }
231
+ }
232
+ disposeCallbacks = [];
233
+ },
234
+ };
235
+ }
236
+ //# sourceMappingURL=openclaw-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-adapter.js","sourceRoot":"","sources":["../../src/plugins/openclaw-adapter.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ import type { WsControlPlane } from "../ws.js";
13
13
  import type { SessionStateService } from "../services/session-state.js";
14
14
  import type { WorkspaceService } from "../services/workspaces.js";
15
15
  import type { ProviderRegistry } from "../providers/registry.js";
16
+ import type { SkillRegistry } from "../skills/index.js";
16
17
  export declare function getExternalFileMutationPath(tool: string, args: unknown): string | null;
17
18
  export interface ChatRouteDeps {
18
19
  db?: JaitDB;
@@ -26,6 +27,7 @@ export interface ChatRouteDeps {
26
27
  sessionState?: SessionStateService;
27
28
  workspaceService?: WorkspaceService;
28
29
  providerRegistry?: ProviderRegistry;
30
+ skillRegistry?: SkillRegistry;
29
31
  toolExecutor?: (toolName: string, input: unknown, context: ToolContext, options?: {
30
32
  dryRun?: boolean;
31
33
  consentTimeoutMs?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/routes/chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,uBAAuB,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA6NjE,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAyCtF;AA+WD,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,CACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,KACtD,OAAO,CAAC,UAAU,CAAC,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EACjC,iBAAiB,CAAC,EAAE,cAAc,QA+kDnC"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/routes/chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,uBAAuB,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA4BjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAmMxD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAyCtF;AA+WD,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,CACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,KACtD,OAAO,CAAC,UAAU,CAAC,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,EACjC,iBAAiB,CAAC,EAAE,cAAc,QAsmDnC"}
@@ -14,6 +14,7 @@ import { runAgentLoop, retryToolCall, buildTieredToolSchemas, fromOpenAIName, St
14
14
  import { interventionRunResumeRegistry } from "../services/intervention-run-resume.js";
15
15
  import { isValidChatMode, } from "../tools/chat-modes.js";
16
16
  import { buildSystemPrompt } from "../tools/prompts/index.js";
17
+ import { formatSkillsForPrompt } from "../skills/index.js";
17
18
  function parseUserDisplaySegments(raw) {
18
19
  if (!Array.isArray(raw))
19
20
  return undefined;
@@ -479,6 +480,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
479
480
  let sessionStateService;
480
481
  let workspaceService;
481
482
  let providerRegistry;
483
+ let skillRegistry;
482
484
  if (depsOrDb && typeof depsOrDb === "object" && "sessionService" in depsOrDb) {
483
485
  const deps = depsOrDb;
484
486
  db = deps.db;
@@ -493,6 +495,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
493
495
  sessionStateService = deps.sessionState;
494
496
  workspaceService = deps.workspaceService;
495
497
  providerRegistry = deps.providerRegistry;
498
+ skillRegistry = deps.skillRegistry;
496
499
  }
497
500
  else {
498
501
  db = depsOrDb;
@@ -817,7 +820,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
817
820
  const wsRoot = surfaceRegistry
818
821
  ? resolveWorkspaceRoot(surfaceRegistry, sessionId, workspaceRecord?.rootPath ?? sessionRecord?.workspacePath)
819
822
  : ((workspaceRecord?.rootPath ?? sessionRecord?.workspacePath)?.trim() || process.cwd());
820
- const promptCtx = { workspaceRoot: wsRoot };
823
+ const promptCtx = { workspaceRoot: wsRoot, skills: skillRegistry?.listEnabled() };
821
824
  if (!sessionHistory.has(sessionId)) {
822
825
  sessionHistory.set(sessionId, [
823
826
  { role: "system", content: buildSystemPrompt(chatMode, modelEndpoint, promptCtx) },
@@ -986,6 +989,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
986
989
  // ── Reuse an existing CLI session if one is alive for this Jait session ──
987
990
  const cachedCliSession = activeCliSessions.get(sessionId);
988
991
  let providerSessionId;
992
+ let isNewCliSession = false;
989
993
  if (cachedCliSession && cachedCliSession.providerId === requestProvider && cachedCliSession.runtimeMode === runtimeMode) {
990
994
  // Existing session with the same provider — try to reuse it
991
995
  providerSessionId = cachedCliSession.providerSessionId;
@@ -1009,6 +1013,7 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1009
1013
  mcpServers,
1010
1014
  });
1011
1015
  providerSessionId = session.id;
1016
+ isNewCliSession = true;
1012
1017
  activeCliSessions.set(sessionId, { providerId: requestProvider, runtimeMode, providerSessionId, provider: cliProvider });
1013
1018
  console.log(`[chat/cli] Started new ${requestProvider}/${runtimeMode}${isRemote ? " (remote)" : ""} session ${providerSessionId} for ${sessionId}`);
1014
1019
  }
@@ -1201,9 +1206,18 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1201
1206
  break;
1202
1207
  }
1203
1208
  });
1209
+ // ── Prepend skills context on the first turn of a new CLI session ──
1210
+ let cliContent = content;
1211
+ if (isNewCliSession && skillRegistry) {
1212
+ const enabledSkills = skillRegistry.listEnabled();
1213
+ const skillsBlock = formatSkillsForPrompt(enabledSkills);
1214
+ if (skillsBlock) {
1215
+ cliContent = `${skillsBlock}\n\n${content}`;
1216
+ }
1217
+ }
1204
1218
  // Send the turn — with recovery if the cached session died between messages
1205
1219
  try {
1206
- await cliProvider.sendTurn(providerSessionId, content);
1220
+ await cliProvider.sendTurn(providerSessionId, cliContent);
1207
1221
  }
1208
1222
  catch (sendErr) {
1209
1223
  // Session likely died (process exited) — start a fresh one
@@ -1219,7 +1233,16 @@ export function registerChatRoutes(app, config, depsOrDb, sessionServiceArg) {
1219
1233
  providerSessionId = freshSession.id;
1220
1234
  activeCliSessions.set(sessionId, { providerId: requestProvider, runtimeMode, providerSessionId, provider: cliProvider });
1221
1235
  console.log(`[chat/cli] Recovered with new ${requestProvider}/${runtimeMode} session ${providerSessionId}`);
1222
- await cliProvider.sendTurn(providerSessionId, content);
1236
+ // Fresh session — re-inject skills context
1237
+ let recoveryContent = content;
1238
+ if (skillRegistry) {
1239
+ const enabledSkills = skillRegistry.listEnabled();
1240
+ const skillsBlock = formatSkillsForPrompt(enabledSkills);
1241
+ if (skillsBlock) {
1242
+ recoveryContent = `${skillsBlock}\n\n${content}`;
1243
+ }
1244
+ }
1245
+ await cliProvider.sendTurn(providerSessionId, recoveryContent);
1223
1246
  }
1224
1247
  // Wait for turn completion or error
1225
1248
  await new Promise((resolve) => {