natroc 0.0.1

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 (183) hide show
  1. package/AGENTS.md +494 -0
  2. package/LICENSE +7 -0
  3. package/README.md +0 -0
  4. package/install.ps1 +109 -0
  5. package/install.sh +132 -0
  6. package/package.json +77 -0
  7. package/server/dist/agent/agent-loop.d.ts +71 -0
  8. package/server/dist/agent/agent-loop.js +171 -0
  9. package/server/dist/agent/agent-loop.js.map +1 -0
  10. package/server/dist/agent/home-context.d.ts +29 -0
  11. package/server/dist/agent/home-context.js +134 -0
  12. package/server/dist/agent/home-context.js.map +1 -0
  13. package/server/dist/agent/improvement-engine.d.ts +23 -0
  14. package/server/dist/agent/improvement-engine.js +107 -0
  15. package/server/dist/agent/improvement-engine.js.map +1 -0
  16. package/server/dist/agent/tools/index.d.ts +14 -0
  17. package/server/dist/agent/tools/index.js +85 -0
  18. package/server/dist/agent/tools/index.js.map +1 -0
  19. package/server/dist/agent/tools/list-directory.d.ts +2 -0
  20. package/server/dist/agent/tools/list-directory.js +27 -0
  21. package/server/dist/agent/tools/list-directory.js.map +1 -0
  22. package/server/dist/agent/tools/read-file.d.ts +2 -0
  23. package/server/dist/agent/tools/read-file.js +30 -0
  24. package/server/dist/agent/tools/read-file.js.map +1 -0
  25. package/server/dist/agent/tools/run-command.d.ts +2 -0
  26. package/server/dist/agent/tools/run-command.js +72 -0
  27. package/server/dist/agent/tools/run-command.js.map +1 -0
  28. package/server/dist/agent/tools/system-info.d.ts +2 -0
  29. package/server/dist/agent/tools/system-info.js +28 -0
  30. package/server/dist/agent/tools/system-info.js.map +1 -0
  31. package/server/dist/agent/tools/types.d.ts +18 -0
  32. package/server/dist/agent/tools/types.js +2 -0
  33. package/server/dist/agent/tools/types.js.map +1 -0
  34. package/server/dist/agent/tools/util.d.ts +7 -0
  35. package/server/dist/agent/tools/util.js +24 -0
  36. package/server/dist/agent/tools/util.js.map +1 -0
  37. package/server/dist/agent/tools/write-file.d.ts +2 -0
  38. package/server/dist/agent/tools/write-file.js +25 -0
  39. package/server/dist/agent/tools/write-file.js.map +1 -0
  40. package/server/dist/app.d.ts +8 -0
  41. package/server/dist/app.js +39 -0
  42. package/server/dist/app.js.map +1 -0
  43. package/server/dist/auth/password.d.ts +7 -0
  44. package/server/dist/auth/password.js +20 -0
  45. package/server/dist/auth/password.js.map +1 -0
  46. package/server/dist/channels/channel-runtime.d.ts +32 -0
  47. package/server/dist/channels/channel-runtime.js +484 -0
  48. package/server/dist/channels/channel-runtime.js.map +1 -0
  49. package/server/dist/cli/agent-deliver.d.ts +14 -0
  50. package/server/dist/cli/agent-deliver.js +183 -0
  51. package/server/dist/cli/agent-deliver.js.map +1 -0
  52. package/server/dist/cli/args.d.ts +11 -0
  53. package/server/dist/cli/args.js +57 -0
  54. package/server/dist/cli/args.js.map +1 -0
  55. package/server/dist/cli/cli-token.d.ts +1 -0
  56. package/server/dist/cli/cli-token.js +22 -0
  57. package/server/dist/cli/cli-token.js.map +1 -0
  58. package/server/dist/cli/daemon.d.ts +2 -0
  59. package/server/dist/cli/daemon.js +252 -0
  60. package/server/dist/cli/daemon.js.map +1 -0
  61. package/server/dist/cli.d.ts +2 -0
  62. package/server/dist/cli.js +416 -0
  63. package/server/dist/cli.js.map +1 -0
  64. package/server/dist/config/natroc-home.d.ts +13 -0
  65. package/server/dist/config/natroc-home.js +730 -0
  66. package/server/dist/config/natroc-home.js.map +1 -0
  67. package/server/dist/gateway/agent-service.d.ts +16 -0
  68. package/server/dist/gateway/agent-service.js +261 -0
  69. package/server/dist/gateway/agent-service.js.map +1 -0
  70. package/server/dist/gateway/connection.d.ts +38 -0
  71. package/server/dist/gateway/connection.js +254 -0
  72. package/server/dist/gateway/connection.js.map +1 -0
  73. package/server/dist/gateway/gateway.d.ts +79 -0
  74. package/server/dist/gateway/gateway.js +150 -0
  75. package/server/dist/gateway/gateway.js.map +1 -0
  76. package/server/dist/gateway/index.d.ts +8 -0
  77. package/server/dist/gateway/index.js +26 -0
  78. package/server/dist/gateway/index.js.map +1 -0
  79. package/server/dist/gateway/protocol.d.ts +102 -0
  80. package/server/dist/gateway/protocol.js +63 -0
  81. package/server/dist/gateway/protocol.js.map +1 -0
  82. package/server/dist/gateway/rpc/agent.d.ts +3 -0
  83. package/server/dist/gateway/rpc/agent.js +174 -0
  84. package/server/dist/gateway/rpc/agent.js.map +1 -0
  85. package/server/dist/gateway/rpc/agents.d.ts +2 -0
  86. package/server/dist/gateway/rpc/agents.js +68 -0
  87. package/server/dist/gateway/rpc/agents.js.map +1 -0
  88. package/server/dist/gateway/rpc/auth.d.ts +3 -0
  89. package/server/dist/gateway/rpc/auth.js +180 -0
  90. package/server/dist/gateway/rpc/auth.js.map +1 -0
  91. package/server/dist/gateway/rpc/channels.d.ts +2 -0
  92. package/server/dist/gateway/rpc/channels.js +230 -0
  93. package/server/dist/gateway/rpc/channels.js.map +1 -0
  94. package/server/dist/gateway/rpc/conversations.d.ts +3 -0
  95. package/server/dist/gateway/rpc/conversations.js +36 -0
  96. package/server/dist/gateway/rpc/conversations.js.map +1 -0
  97. package/server/dist/gateway/rpc/projects.d.ts +3 -0
  98. package/server/dist/gateway/rpc/projects.js +49 -0
  99. package/server/dist/gateway/rpc/projects.js.map +1 -0
  100. package/server/dist/gateway/rpc/providers.d.ts +3 -0
  101. package/server/dist/gateway/rpc/providers.js +106 -0
  102. package/server/dist/gateway/rpc/providers.js.map +1 -0
  103. package/server/dist/gateway/rpc/usage.d.ts +2 -0
  104. package/server/dist/gateway/rpc/usage.js +41 -0
  105. package/server/dist/gateway/rpc/usage.js.map +1 -0
  106. package/server/dist/gateway/types.d.ts +43 -0
  107. package/server/dist/gateway/types.js +20 -0
  108. package/server/dist/gateway/types.js.map +1 -0
  109. package/server/dist/gateway/ws-server.d.ts +10 -0
  110. package/server/dist/gateway/ws-server.js +37 -0
  111. package/server/dist/gateway/ws-server.js.map +1 -0
  112. package/server/dist/index.d.ts +1 -0
  113. package/server/dist/index.js +9 -0
  114. package/server/dist/index.js.map +1 -0
  115. package/server/dist/local-runtime.d.ts +9 -0
  116. package/server/dist/local-runtime.js +16 -0
  117. package/server/dist/local-runtime.js.map +1 -0
  118. package/server/dist/providers/configured-adapters.d.ts +9 -0
  119. package/server/dist/providers/configured-adapters.js +34 -0
  120. package/server/dist/providers/configured-adapters.js.map +1 -0
  121. package/server/dist/providers/ollama.d.ts +23 -0
  122. package/server/dist/providers/ollama.js +164 -0
  123. package/server/dist/providers/ollama.js.map +1 -0
  124. package/server/dist/providers/openrouter.d.ts +24 -0
  125. package/server/dist/providers/openrouter.js +201 -0
  126. package/server/dist/providers/openrouter.js.map +1 -0
  127. package/server/dist/providers/thinking.d.ts +18 -0
  128. package/server/dist/providers/thinking.js +58 -0
  129. package/server/dist/providers/thinking.js.map +1 -0
  130. package/server/dist/providers/types.d.ts +55 -0
  131. package/server/dist/providers/types.js +2 -0
  132. package/server/dist/providers/types.js.map +1 -0
  133. package/server/dist/routes/schemas.d.ts +51 -0
  134. package/server/dist/routes/schemas.js +53 -0
  135. package/server/dist/routes/schemas.js.map +1 -0
  136. package/server/dist/runtime.d.ts +47 -0
  137. package/server/dist/runtime.js +29 -0
  138. package/server/dist/runtime.js.map +1 -0
  139. package/server/dist/server.d.ts +11 -0
  140. package/server/dist/server.js +19 -0
  141. package/server/dist/server.js.map +1 -0
  142. package/server/dist/storage/agent-repository.d.ts +59 -0
  143. package/server/dist/storage/agent-repository.js +192 -0
  144. package/server/dist/storage/agent-repository.js.map +1 -0
  145. package/server/dist/storage/auth-repository.d.ts +49 -0
  146. package/server/dist/storage/auth-repository.js +139 -0
  147. package/server/dist/storage/auth-repository.js.map +1 -0
  148. package/server/dist/storage/channel-repository.d.ts +152 -0
  149. package/server/dist/storage/channel-repository.js +413 -0
  150. package/server/dist/storage/channel-repository.js.map +1 -0
  151. package/server/dist/storage/conversation-repository.d.ts +63 -0
  152. package/server/dist/storage/conversation-repository.js +196 -0
  153. package/server/dist/storage/conversation-repository.js.map +1 -0
  154. package/server/dist/storage/database.d.ts +11 -0
  155. package/server/dist/storage/database.js +360 -0
  156. package/server/dist/storage/database.js.map +1 -0
  157. package/server/dist/storage/memory-repository.d.ts +70 -0
  158. package/server/dist/storage/memory-repository.js +279 -0
  159. package/server/dist/storage/memory-repository.js.map +1 -0
  160. package/server/dist/storage/project-repository.d.ts +25 -0
  161. package/server/dist/storage/project-repository.js +67 -0
  162. package/server/dist/storage/project-repository.js.map +1 -0
  163. package/server/dist/storage/provider-repository.d.ts +44 -0
  164. package/server/dist/storage/provider-repository.js +159 -0
  165. package/server/dist/storage/provider-repository.js.map +1 -0
  166. package/server/dist/storage/tool-call-repository.d.ts +35 -0
  167. package/server/dist/storage/tool-call-repository.js +83 -0
  168. package/server/dist/storage/tool-call-repository.js.map +1 -0
  169. package/server/dist/storage/usage-repository.d.ts +76 -0
  170. package/server/dist/storage/usage-repository.js +249 -0
  171. package/server/dist/storage/usage-repository.js.map +1 -0
  172. package/server/dist/storage/vault.d.ts +3 -0
  173. package/server/dist/storage/vault.js +57 -0
  174. package/server/dist/storage/vault.js.map +1 -0
  175. package/ui/README.md +0 -0
  176. package/ui/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  177. package/ui/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  178. package/ui/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  179. package/ui/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  180. package/ui/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  181. package/ui/dist/assets/index-DKaFmZNO.js +114 -0
  182. package/ui/dist/assets/index-DOfPcjx3.css +2 -0
  183. package/ui/dist/index.html +14 -0
@@ -0,0 +1,201 @@
1
+ import { OpenRouter as OpenRouterAgent, fromChatMessages, } from "@openrouter/agent";
2
+ import { OpenRouter as OpenRouterSdk } from "@openrouter/sdk";
3
+ import { getOpenRouterThinkingCapabilities, openRouterReasoningEfforts, } from "./thinking.js";
4
+ const DEFAULT_OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
5
+ const DEFAULT_OPENROUTER_MODEL = "openai/gpt-oss-20b";
6
+ export class OpenRouterAdapter {
7
+ agentClient;
8
+ sdkClient;
9
+ defaultModel;
10
+ constructor(options) {
11
+ this.defaultModel = options.defaultModel ?? DEFAULT_OPENROUTER_MODEL;
12
+ const clientOptions = {
13
+ apiKey: options.apiKey,
14
+ appTitle: "Natroc",
15
+ httpReferer: "http://localhost:18789",
16
+ serverURL: options.baseUrl ?? DEFAULT_OPENROUTER_BASE_URL,
17
+ };
18
+ this.agentClient = new OpenRouterAgent(clientOptions);
19
+ this.sdkClient = new OpenRouterSdk(clientOptions);
20
+ }
21
+ async testConnection() {
22
+ await this.listModels();
23
+ return {
24
+ ok: true,
25
+ message: "OpenRouter connection is working.",
26
+ };
27
+ }
28
+ async listModels() {
29
+ const result = await this.sdkClient.models.list();
30
+ return result.data.map((model) => ({
31
+ id: model.id,
32
+ name: model.name,
33
+ thinking: getOpenRouterThinkingCapabilities(model.supportedParameters),
34
+ }));
35
+ }
36
+ async chat(request) {
37
+ const model = request.model ?? this.defaultModel;
38
+ const reasoning = toOpenRouterReasoning(request.thinking);
39
+ const result = this.agentClient.callModel({
40
+ model,
41
+ input: toAgentInput(request),
42
+ ...(reasoning ? { reasoning } : {}),
43
+ });
44
+ return {
45
+ provider: "openrouter",
46
+ model,
47
+ content: await result.getText(),
48
+ };
49
+ }
50
+ async *streamChat(request) {
51
+ const model = request.model ?? this.defaultModel;
52
+ const reasoning = toOpenRouterReasoning(request.thinking);
53
+ const result = this.agentClient.callModel({
54
+ model,
55
+ input: toAgentInput(request),
56
+ ...(reasoning ? { reasoning } : {}),
57
+ });
58
+ yield {
59
+ type: "metadata",
60
+ provider: "openrouter",
61
+ model,
62
+ };
63
+ for await (const event of result.getFullResponsesStream()) {
64
+ if (!isRecord(event))
65
+ continue;
66
+ if (event.type === "response.output_text.delta") {
67
+ const delta = getStringField(event, "delta");
68
+ if (delta) {
69
+ yield {
70
+ type: "text",
71
+ delta,
72
+ };
73
+ }
74
+ }
75
+ if (event.type === "response.reasoning_text.delta") {
76
+ const delta = getStringField(event, "delta");
77
+ if (delta) {
78
+ yield {
79
+ type: "reasoning",
80
+ delta,
81
+ };
82
+ }
83
+ }
84
+ if (event.type === "response.completed" && isRecord(event.response)) {
85
+ const completedModel = getStringField(event.response, "model");
86
+ const usage = getUsage(event.response);
87
+ if (completedModel) {
88
+ yield {
89
+ type: "metadata",
90
+ provider: "openrouter",
91
+ model: completedModel,
92
+ };
93
+ }
94
+ if (usage) {
95
+ yield {
96
+ type: "usage",
97
+ usage,
98
+ };
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ function isRecord(value) {
105
+ return typeof value === "object" && value !== null && !Array.isArray(value);
106
+ }
107
+ function getStringField(record, key) {
108
+ const value = record[key];
109
+ return typeof value === "string" ? value : "";
110
+ }
111
+ function getNumberField(record, keys) {
112
+ for (const key of keys) {
113
+ const value = record[key];
114
+ if (typeof value === "number" && Number.isFinite(value))
115
+ return value;
116
+ }
117
+ return null;
118
+ }
119
+ function getUsage(response) {
120
+ const usageRaw = isRecord(response.usage)
121
+ ? response.usage
122
+ : isRecord(response.meta) && isRecord(response.meta.usage)
123
+ ? response.meta.usage
124
+ : null;
125
+ if (!usageRaw)
126
+ return null;
127
+ const inputTokens = getNumberField(usageRaw, [
128
+ "input_tokens",
129
+ "prompt_tokens",
130
+ "promptTokens",
131
+ ]);
132
+ const outputTokens = getNumberField(usageRaw, [
133
+ "output_tokens",
134
+ "completion_tokens",
135
+ "completionTokens",
136
+ ]);
137
+ const reasoningTokens = getNumberField(usageRaw, [
138
+ "reasoning_tokens",
139
+ "reasoningTokens",
140
+ ]);
141
+ const totalTokens = getNumberField(usageRaw, ["total_tokens", "totalTokens"]) ??
142
+ sumNullable(inputTokens, outputTokens, reasoningTokens);
143
+ const costUsd = getNumberField(usageRaw, ["cost", "cost_usd", "costUsd"]);
144
+ return {
145
+ inputTokens,
146
+ outputTokens,
147
+ reasoningTokens,
148
+ totalTokens,
149
+ costUsd,
150
+ durationMs: null,
151
+ raw: usageRaw,
152
+ };
153
+ }
154
+ function sumNullable(...values) {
155
+ let total = 0;
156
+ let hasValue = false;
157
+ for (const value of values) {
158
+ if (typeof value !== "number")
159
+ continue;
160
+ total += value;
161
+ hasValue = true;
162
+ }
163
+ return hasValue ? total : null;
164
+ }
165
+ function toOpenRouterMessages(request) {
166
+ return (request.messages?.map((message) => ({
167
+ role: message.role,
168
+ content: message.content,
169
+ })) ?? [
170
+ {
171
+ role: "user",
172
+ content: request.message,
173
+ },
174
+ ]);
175
+ }
176
+ function toAgentInput(request) {
177
+ return fromChatMessages(toOpenRouterMessages(request));
178
+ }
179
+ function toOpenRouterReasoning(thinking) {
180
+ if (!thinking?.enabled)
181
+ return undefined;
182
+ if (thinking.effort &&
183
+ thinking.effort !== "auto" &&
184
+ isOpenRouterReasoningEffort(thinking.effort)) {
185
+ return {
186
+ enabled: true,
187
+ effort: thinking.effort,
188
+ };
189
+ }
190
+ return {
191
+ enabled: true,
192
+ };
193
+ }
194
+ function isOpenRouterReasoningEffort(value) {
195
+ return openRouterReasoningEfforts.includes(value);
196
+ }
197
+ export const openRouterDefaults = {
198
+ baseUrl: DEFAULT_OPENROUTER_BASE_URL,
199
+ model: DEFAULT_OPENROUTER_MODEL,
200
+ };
201
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare const openRouterReasoningEfforts: readonly ["minimal", "low", "medium", "high", "xhigh"];
2
+ export declare const ollamaThinkingEfforts: readonly ["low", "medium", "high"];
3
+ export type ThinkingEffort = "auto" | (typeof openRouterReasoningEfforts)[number] | "ultra_high";
4
+ export type ProviderThinkingCapabilities = {
5
+ supported: boolean;
6
+ efforts: ThinkingEffort[];
7
+ };
8
+ export type ProviderThinkingRequest = {
9
+ enabled: boolean;
10
+ effort?: ThinkingEffort | string;
11
+ };
12
+ export declare function getOpenRouterThinkingCapabilities(supportedParameters: readonly string[] | undefined): ProviderThinkingCapabilities;
13
+ export declare function getOllamaThinkingCapabilities(input: {
14
+ capabilities?: readonly string[] | null;
15
+ model?: string;
16
+ name?: string;
17
+ }): ProviderThinkingCapabilities;
18
+ export declare function getThinkingEffortLabel(effort: string): string;
@@ -0,0 +1,58 @@
1
+ export const openRouterReasoningEfforts = [
2
+ "minimal",
3
+ "low",
4
+ "medium",
5
+ "high",
6
+ "xhigh",
7
+ ];
8
+ export const ollamaThinkingEfforts = ["low", "medium", "high"];
9
+ const unsupportedThinking = {
10
+ supported: false,
11
+ efforts: [],
12
+ };
13
+ const openRouterReasoningParameters = new Set([
14
+ "include_reasoning",
15
+ "reasoning",
16
+ "reasoning_effort",
17
+ ]);
18
+ const thinkingModelNamePattern = /(\b|[-_/.:])(r1|qwq|reasoning|thinking|think|gpt-oss|qwen3)(\b|[-_/.:])/i;
19
+ export function getOpenRouterThinkingCapabilities(supportedParameters) {
20
+ const parameters = new Set((supportedParameters ?? []).map((parameter) => parameter.toLowerCase()));
21
+ if (parameters.has("reasoning_effort")) {
22
+ return {
23
+ supported: true,
24
+ efforts: [...openRouterReasoningEfforts],
25
+ };
26
+ }
27
+ if ([...parameters].some((parameter) => openRouterReasoningParameters.has(parameter))) {
28
+ return {
29
+ supported: true,
30
+ efforts: ["auto"],
31
+ };
32
+ }
33
+ return unsupportedThinking;
34
+ }
35
+ export function getOllamaThinkingCapabilities(input) {
36
+ const capabilities = new Set((input.capabilities ?? []).map((capability) => capability.toLowerCase()));
37
+ const supportsThinking = capabilities.has("thinking") ||
38
+ capabilities.has("think") ||
39
+ capabilities.has("reasoning") ||
40
+ (capabilities.size === 0 &&
41
+ thinkingModelNamePattern.test(`${input.model ?? ""} ${input.name ?? ""}`));
42
+ if (!supportsThinking)
43
+ return unsupportedThinking;
44
+ return {
45
+ supported: true,
46
+ efforts: [...ollamaThinkingEfforts],
47
+ };
48
+ }
49
+ export function getThinkingEffortLabel(effort) {
50
+ const normalized = effort.replace(/[_-]+/g, " ").trim();
51
+ if (normalized.toLowerCase() === "xhigh")
52
+ return "Extra High";
53
+ return normalized
54
+ .split(/\s+/)
55
+ .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)
56
+ .join(" ");
57
+ }
58
+ //# sourceMappingURL=thinking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../src/providers/thinking.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;CACC,CAAA;AAEV,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAA;AAiBvE,MAAM,mBAAmB,GAAiC;IACxD,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,EAAE;CACZ,CAAA;AAED,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC;IAC5C,mBAAmB;IACnB,WAAW;IACX,kBAAkB;CACnB,CAAC,CAAA;AAEF,MAAM,wBAAwB,GAC5B,0EAA0E,CAAA;AAE5E,MAAM,UAAU,iCAAiC,CAC/C,mBAAkD;IAElD,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CACxE,CAAA;IAED,IAAI,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,CAAC,GAAG,0BAA0B,CAAC;SACzC,CAAA;IACH,CAAC;IAED,IACE,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACjC,6BAA6B,CAAC,GAAG,CAAC,SAAS,CAAC,CAC7C,EACD,CAAC;QACD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,CAAC,MAAM,CAAC;SAClB,CAAA;IACH,CAAC;IAED,OAAO,mBAAmB,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAI7C;IACC,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CACzE,CAAA;IACD,MAAM,gBAAgB,GACpB,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;QAC5B,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;QACzB,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC;QAC7B,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;YACtB,wBAAwB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IAE9E,IAAI,CAAC,gBAAgB;QAAE,OAAO,mBAAmB,CAAA;IAEjD,OAAO;QACL,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,CAAC,GAAG,qBAAqB,CAAC;KACpC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IAEvD,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,OAAO;QAAE,OAAO,YAAY,CAAA;IAE7D,OAAO,UAAU;SACd,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { ProviderThinkingCapabilities, ProviderThinkingRequest } from "./thinking.js";
2
+ export type { ProviderThinkingRequest } from "./thinking.js";
3
+ export type ProviderName = "openrouter" | "ollama";
4
+ export type ChatRole = "system" | "user" | "assistant";
5
+ export type ProviderChatMessage = {
6
+ role: ChatRole;
7
+ content: string;
8
+ };
9
+ export type ProviderModel = {
10
+ id: string;
11
+ name: string;
12
+ thinking?: ProviderThinkingCapabilities;
13
+ };
14
+ export type ProviderConnectionStatus = {
15
+ ok: boolean;
16
+ message: string;
17
+ };
18
+ export type ProviderChatRequest = {
19
+ message: string;
20
+ messages?: ProviderChatMessage[];
21
+ model?: string;
22
+ thinking?: ProviderThinkingRequest;
23
+ };
24
+ export type ProviderChatResponse = {
25
+ provider: ProviderName;
26
+ model: string;
27
+ content: string;
28
+ usage?: ProviderUsage;
29
+ };
30
+ export type ProviderUsage = {
31
+ inputTokens: number | null;
32
+ outputTokens: number | null;
33
+ reasoningTokens: number | null;
34
+ totalTokens: number | null;
35
+ costUsd: number | null;
36
+ durationMs: number | null;
37
+ raw: Record<string, unknown> | null;
38
+ };
39
+ export type ProviderChatStreamEvent = {
40
+ type: "metadata";
41
+ provider: ProviderName;
42
+ model: string;
43
+ } | {
44
+ type: "text" | "reasoning";
45
+ delta: string;
46
+ } | {
47
+ type: "usage";
48
+ usage: ProviderUsage;
49
+ };
50
+ export type ProviderAdapter = {
51
+ testConnection: () => Promise<ProviderConnectionStatus>;
52
+ listModels: () => Promise<ProviderModel[]>;
53
+ chat: (request: ProviderChatRequest) => Promise<ProviderChatResponse>;
54
+ streamChat: (request: ProviderChatRequest) => AsyncIterable<ProviderChatStreamEvent>;
55
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+ export declare const openRouterSetupSchema: z.ZodObject<{
3
+ apiKey: z.ZodString;
4
+ baseUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
5
+ defaultModel: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
6
+ }, z.core.$strip>;
7
+ export declare const ollamaSetupSchema: z.ZodObject<{
8
+ baseUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
9
+ defaultModel: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
10
+ }, z.core.$strip>;
11
+ export declare const chatSchema: z.ZodObject<{
12
+ conversationId: z.ZodOptional<z.ZodString>;
13
+ agentId: z.ZodOptional<z.ZodString>;
14
+ message: z.ZodString;
15
+ model: z.ZodOptional<z.ZodString>;
16
+ thinking: z.ZodOptional<z.ZodObject<{
17
+ enabled: z.ZodDefault<z.ZodBoolean>;
18
+ effort: z.ZodOptional<z.ZodString>;
19
+ }, z.core.$strip>>;
20
+ }, z.core.$strip>;
21
+ export declare const activeProviderSchema: z.ZodObject<{
22
+ providerId: z.ZodString;
23
+ }, z.core.$strip>;
24
+ export declare const improveConversationSchema: z.ZodObject<{
25
+ conversationId: z.ZodOptional<z.ZodString>;
26
+ model: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>;
28
+ export declare const createProjectSchema: z.ZodObject<{
29
+ name: z.ZodString;
30
+ description: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$strip>;
32
+ export declare const updateProjectSchema: z.ZodObject<{
33
+ name: z.ZodOptional<z.ZodString>;
34
+ description: z.ZodOptional<z.ZodString>;
35
+ }, z.core.$strip>;
36
+ export declare const registerSchema: z.ZodObject<{
37
+ username: z.ZodString;
38
+ fullName: z.ZodString;
39
+ password: z.ZodString;
40
+ }, z.core.$strip>;
41
+ export declare const loginSchema: z.ZodObject<{
42
+ username: z.ZodString;
43
+ password: z.ZodString;
44
+ }, z.core.$strip>;
45
+ export declare const updatePasswordSchema: z.ZodObject<{
46
+ currentPassword: z.ZodString;
47
+ newPassword: z.ZodString;
48
+ }, z.core.$strip>;
49
+ export declare const updateAvatarSchema: z.ZodObject<{
50
+ dataUrl: z.ZodNullable<z.ZodString>;
51
+ }, z.core.$strip>;
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ export const openRouterSetupSchema = z.object({
3
+ apiKey: z.string().min(1),
4
+ baseUrl: z.string().url().optional().or(z.literal("")),
5
+ defaultModel: z.string().optional().or(z.literal("")),
6
+ });
7
+ export const ollamaSetupSchema = z.object({
8
+ baseUrl: z.string().url().optional().or(z.literal("")),
9
+ defaultModel: z.string().optional().or(z.literal("")),
10
+ });
11
+ const thinkingSchema = z.object({
12
+ enabled: z.boolean().default(true),
13
+ effort: z.string().min(1).optional(),
14
+ });
15
+ export const chatSchema = z.object({
16
+ conversationId: z.string().optional(),
17
+ agentId: z.string().optional(),
18
+ message: z.string().min(1),
19
+ model: z.string().optional(),
20
+ thinking: thinkingSchema.optional(),
21
+ });
22
+ export const activeProviderSchema = z.object({
23
+ providerId: z.string().min(1),
24
+ });
25
+ export const improveConversationSchema = z.object({
26
+ conversationId: z.string().optional(),
27
+ model: z.string().optional(),
28
+ });
29
+ export const createProjectSchema = z.object({
30
+ name: z.string().min(1),
31
+ description: z.string().optional(),
32
+ });
33
+ export const updateProjectSchema = z.object({
34
+ name: z.string().min(1).optional(),
35
+ description: z.string().optional(),
36
+ });
37
+ export const registerSchema = z.object({
38
+ username: z.string().min(3).max(40),
39
+ fullName: z.string().min(1).max(120),
40
+ password: z.string().min(6).max(200),
41
+ });
42
+ export const loginSchema = z.object({
43
+ username: z.string().min(1),
44
+ password: z.string().min(1),
45
+ });
46
+ export const updatePasswordSchema = z.object({
47
+ currentPassword: z.string().min(1),
48
+ newPassword: z.string().min(6).max(200),
49
+ });
50
+ export const updateAvatarSchema = z.object({
51
+ dataUrl: z.string().min(1).max(4_200_000).nullable(),
52
+ });
53
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/routes/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { DatabaseConnection } from "./storage/database.js";
2
+ import { AgentRepository } from "./storage/agent-repository.js";
3
+ import { AuthRepository } from "./storage/auth-repository.js";
4
+ import { ChannelRepository, type ChannelAccountRecord } from "./storage/channel-repository.js";
5
+ import { ConversationRepository } from "./storage/conversation-repository.js";
6
+ import { MemoryRepository } from "./storage/memory-repository.js";
7
+ import { ProjectRepository } from "./storage/project-repository.js";
8
+ import { ProviderRepository } from "./storage/provider-repository.js";
9
+ import { ToolCallRepository } from "./storage/tool-call-repository.js";
10
+ import { UsageRepository } from "./storage/usage-repository.js";
11
+ import type { NatrocPaths } from "./config/natroc-home.js";
12
+ export type RuntimeState = {
13
+ db: DatabaseConnection;
14
+ masterKey: Buffer;
15
+ paths?: NatrocPaths;
16
+ providers: ProviderRepository;
17
+ agents: AgentRepository;
18
+ usage: UsageRepository;
19
+ channels: ChannelRepository;
20
+ channelRuntime?: {
21
+ startEnabledAccounts: () => Promise<void>;
22
+ connectAccount: (userId: string, accountId: string) => Promise<ChannelAccountRecord>;
23
+ disconnectAccount: (userId: string, accountId: string) => Promise<ChannelAccountRecord>;
24
+ sendOutbound: (input: {
25
+ userId: string;
26
+ accountId: string;
27
+ peer: string;
28
+ text: string;
29
+ bindingId?: string | null;
30
+ }) => Promise<void>;
31
+ getStatus: (userId: string, accountId: string) => Record<string, unknown> | null;
32
+ };
33
+ conversations: ConversationRepository;
34
+ memories: MemoryRepository;
35
+ toolCalls: ToolCallRepository;
36
+ projects: ProjectRepository;
37
+ auth: AuthRepository;
38
+ /**
39
+ * Broadcaster server-push events (di-set oleh gateway saat bootstrap).
40
+ * Modul lain memanggil `runtime.broadcaster?.broadcast(...)` untuk
41
+ * mengirim event `tick`/`presence`/`health` ke seluruh koneksi.
42
+ */
43
+ broadcaster?: {
44
+ broadcast: (event: string, payload: unknown) => void;
45
+ };
46
+ };
47
+ export declare function createRuntime(db: DatabaseConnection, masterKey: Buffer, paths?: NatrocPaths): RuntimeState;
@@ -0,0 +1,29 @@
1
+ import { ChannelRuntimeManager } from "./channels/channel-runtime.js";
2
+ import { AgentRepository } from "./storage/agent-repository.js";
3
+ import { AuthRepository } from "./storage/auth-repository.js";
4
+ import { ChannelRepository, } from "./storage/channel-repository.js";
5
+ import { ConversationRepository } from "./storage/conversation-repository.js";
6
+ import { MemoryRepository } from "./storage/memory-repository.js";
7
+ import { ProjectRepository } from "./storage/project-repository.js";
8
+ import { ProviderRepository } from "./storage/provider-repository.js";
9
+ import { ToolCallRepository } from "./storage/tool-call-repository.js";
10
+ import { UsageRepository } from "./storage/usage-repository.js";
11
+ export function createRuntime(db, masterKey, paths) {
12
+ const runtime = {
13
+ db,
14
+ masterKey,
15
+ paths,
16
+ providers: new ProviderRepository(db),
17
+ agents: new AgentRepository(db),
18
+ usage: new UsageRepository(db),
19
+ channels: new ChannelRepository(db),
20
+ conversations: new ConversationRepository(db),
21
+ memories: new MemoryRepository(db),
22
+ toolCalls: new ToolCallRepository(db),
23
+ projects: new ProjectRepository(db),
24
+ auth: new AuthRepository(db)
25
+ };
26
+ runtime.channelRuntime = new ChannelRuntimeManager(runtime);
27
+ return runtime;
28
+ }
29
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EACL,iBAAiB,GAElB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAgD/D,MAAM,UAAU,aAAa,CAC3B,EAAsB,EACtB,SAAiB,EACjB,KAAmB;IAEnB,MAAM,OAAO,GAAiB;QAC5B,EAAE;QACF,SAAS;QACT,KAAK;QACL,SAAS,EAAE,IAAI,kBAAkB,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,IAAI,eAAe,CAAC,EAAE,CAAC;QAC/B,KAAK,EAAE,IAAI,eAAe,CAAC,EAAE,CAAC;QAC9B,QAAQ,EAAE,IAAI,iBAAiB,CAAC,EAAE,CAAC;QACnC,aAAa,EAAE,IAAI,sBAAsB,CAAC,EAAE,CAAC;QAC7C,QAAQ,EAAE,IAAI,gBAAgB,CAAC,EAAE,CAAC;QAClC,SAAS,EAAE,IAAI,kBAAkB,CAAC,EAAE,CAAC;QACrC,QAAQ,EAAE,IAAI,iBAAiB,CAAC,EAAE,CAAC;QACnC,IAAI,EAAE,IAAI,cAAc,CAAC,EAAE,CAAC;KAC7B,CAAA;IACD,OAAO,CAAC,cAAc,GAAG,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAE3D,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type StartServerOptions = {
2
+ host?: string;
3
+ port?: number;
4
+ };
5
+ export declare function startServer(options?: StartServerOptions): Promise<{
6
+ app: import("fastify").FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault> & PromiseLike<import("fastify").FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>> & {
7
+ __linterBrands: "SafePromiseLike";
8
+ };
9
+ host: string;
10
+ port: number;
11
+ }>;
@@ -0,0 +1,19 @@
1
+ import { buildApp } from "./app.js";
2
+ import { createLocalRuntime } from "./local-runtime.js";
3
+ export async function startServer(options = {}) {
4
+ const PORT = options.port ?? Number(process.env.NATROC_SERVER_PORT ?? 18789);
5
+ const HOST = options.host ?? process.env.NATROC_SERVER_HOST ?? "127.0.0.1";
6
+ const { runtime } = await createLocalRuntime();
7
+ await runtime.channelRuntime?.startEnabledAccounts();
8
+ const app = buildApp({ runtime });
9
+ await app.listen({
10
+ host: HOST,
11
+ port: PORT
12
+ });
13
+ return {
14
+ app,
15
+ host: HOST,
16
+ port: PORT
17
+ };
18
+ }
19
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAOvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAA8B,EAAE;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC,CAAA;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,WAAW,CAAA;IAC1E,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAA;IAC9C,MAAM,OAAO,CAAC,cAAc,EAAE,oBAAoB,EAAE,CAAA;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAEjC,MAAM,GAAG,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;KACX,CAAC,CAAA;IAEF,OAAO;QACL,GAAG;QACH,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;KACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { type DatabaseConnection } from "./database.js";
2
+ import type { ProviderName } from "../providers/types.js";
3
+ export type AgentRecord = {
4
+ id: string;
5
+ userId: string;
6
+ name: string;
7
+ description: string;
8
+ defaultProvider: ProviderName | null;
9
+ defaultModel: string | null;
10
+ workspace: string | null;
11
+ systemPrompt: string;
12
+ config: Record<string, unknown>;
13
+ isEnabled: boolean;
14
+ isDefault: boolean;
15
+ createdAt: string;
16
+ updatedAt: string;
17
+ };
18
+ export type CreateAgentInput = {
19
+ userId: string;
20
+ name: string;
21
+ description?: string | null;
22
+ defaultProvider?: ProviderName | null;
23
+ defaultModel?: string | null;
24
+ workspace?: string | null;
25
+ systemPrompt?: string | null;
26
+ config?: Record<string, unknown> | null;
27
+ isEnabled?: boolean;
28
+ isDefault?: boolean;
29
+ };
30
+ export type UpdateAgentInput = Partial<Omit<CreateAgentInput, "userId" | "isDefault">> & {
31
+ userId: string;
32
+ id: string;
33
+ isDefault?: boolean;
34
+ };
35
+ export declare class AgentRepository {
36
+ private readonly db;
37
+ constructor(db: DatabaseConnection);
38
+ list(options: {
39
+ userId: string;
40
+ }): AgentRecord[];
41
+ get(options: {
42
+ userId: string;
43
+ id: string;
44
+ }): AgentRecord | null;
45
+ getDefault(options: {
46
+ userId: string;
47
+ }): AgentRecord | null;
48
+ create(input: CreateAgentInput): AgentRecord;
49
+ update(input: UpdateAgentInput): AgentRecord;
50
+ setDefault(options: {
51
+ userId: string;
52
+ id: string;
53
+ }): AgentRecord;
54
+ delete(options: {
55
+ userId: string;
56
+ id: string;
57
+ }): boolean;
58
+ private clearDefault;
59
+ }