@caplets/core 0.18.9 → 0.20.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 (132) hide show
  1. package/dist/attach/options.d.ts +10 -0
  2. package/dist/attach/server.d.ts +5 -0
  3. package/dist/caplet-files-bundle.d.ts +430 -0
  4. package/dist/caplet-files.d.ts +3 -266
  5. package/dist/caplet-source/bundle.d.ts +7 -0
  6. package/dist/caplet-source/filesystem.d.ts +7 -0
  7. package/dist/caplet-source/filesystem.js +2 -0
  8. package/dist/caplet-source/index.d.ts +4 -0
  9. package/dist/caplet-source/parse.d.ts +35 -0
  10. package/dist/caplet-source/types.d.ts +9 -0
  11. package/dist/caplet-source.js +7011 -0
  12. package/dist/cli/auth.d.ts +40 -2
  13. package/dist/cli/cloud-add.d.ts +8 -0
  14. package/dist/cli/code-mode.d.ts +16 -0
  15. package/dist/cli/commands.d.ts +8 -1
  16. package/dist/cli/doctor.d.ts +21 -0
  17. package/dist/cli/setup-caplet.d.ts +12 -0
  18. package/dist/cli/setup.d.ts +11 -0
  19. package/dist/cli-tools.d.ts +1 -1
  20. package/dist/cli.d.ts +8 -1
  21. package/dist/cloud/apply.d.ts +36 -0
  22. package/dist/cloud/client.d.ts +30 -0
  23. package/dist/cloud/presence.d.ts +29 -0
  24. package/dist/cloud/project-root.d.ts +2 -0
  25. package/dist/cloud/runtime-adapter.d.ts +23 -0
  26. package/dist/cloud/runtime-http.d.ts +6 -0
  27. package/dist/cloud/sync.d.ts +10 -0
  28. package/dist/cloud-auth/client.d.ts +57 -0
  29. package/dist/cloud-auth/errors.d.ts +11 -0
  30. package/dist/cloud-auth/open-url.d.ts +7 -0
  31. package/dist/cloud-auth/store.d.ts +35 -0
  32. package/dist/cloud-auth/types.d.ts +67 -0
  33. package/dist/code-mode/api.d.ts +32 -0
  34. package/dist/code-mode/declarations.d.ts +5 -0
  35. package/dist/code-mode/diagnostics.d.ts +8 -0
  36. package/dist/code-mode/index.d.ts +4 -0
  37. package/dist/code-mode/logs.d.ts +21 -0
  38. package/dist/code-mode/runner.d.ts +15 -0
  39. package/dist/code-mode/runtime-api.generated.d.ts +1 -0
  40. package/dist/code-mode/sandbox.d.ts +28 -0
  41. package/dist/code-mode/static-analysis.d.ts +2 -0
  42. package/dist/code-mode/tool.d.ts +11 -0
  43. package/dist/code-mode/types.d.ts +120 -0
  44. package/dist/code-mode.js +147855 -0
  45. package/dist/{completion-RqzHpHRY.js → completion-CbazRAiL.js} +20 -1
  46. package/dist/config/paths.d.ts +2 -0
  47. package/dist/config-runtime.d.ts +183 -0
  48. package/dist/config-runtime.js +421 -0
  49. package/dist/config.d.ts +76 -9
  50. package/dist/downstream.d.ts +20 -2
  51. package/dist/engine.d.ts +20 -0
  52. package/dist/exposure/direct-names.d.ts +9 -0
  53. package/dist/exposure/discovery.d.ts +75 -0
  54. package/dist/exposure/policy.d.ts +8 -0
  55. package/dist/filesystem-Kkg32TOJ.js +66 -0
  56. package/dist/generated-tool-input-schema.d.ts +89 -59
  57. package/dist/generated-tool-input-schema.js +172 -1
  58. package/dist/graphql.d.ts +1 -1
  59. package/dist/http-actions.d.ts +1 -1
  60. package/dist/index.d.ts +48 -0
  61. package/dist/index.js +4176 -501
  62. package/dist/native/options.d.ts +22 -3
  63. package/dist/native/remote.d.ts +2 -1
  64. package/dist/native/service.d.ts +13 -3
  65. package/dist/native/tools.d.ts +2 -0
  66. package/dist/native.d.ts +1 -1
  67. package/dist/native.js +3 -431
  68. package/dist/observed-output-shapes/extract.d.ts +5 -0
  69. package/dist/observed-output-shapes/file-store.d.ts +17 -0
  70. package/dist/observed-output-shapes/index.d.ts +7 -0
  71. package/dist/observed-output-shapes/key.d.ts +14 -0
  72. package/dist/observed-output-shapes/merge.d.ts +2 -0
  73. package/dist/observed-output-shapes/pure.d.ts +5 -0
  74. package/dist/observed-output-shapes/pure.js +241 -0
  75. package/dist/observed-output-shapes/schema.d.ts +1 -0
  76. package/dist/observed-output-shapes/types.d.ts +84 -0
  77. package/dist/observed-output-shapes/typescript.d.ts +7 -0
  78. package/dist/observed-output-shapes-uzAMQPhg.js +485 -0
  79. package/dist/observed-output-shapes.js +2 -0
  80. package/dist/openapi.d.ts +1 -1
  81. package/dist/project-binding/attach.d.ts +46 -0
  82. package/dist/project-binding/errors.d.ts +17 -0
  83. package/dist/project-binding/gitignore.d.ts +5 -0
  84. package/dist/project-binding/index.d.ts +2 -0
  85. package/dist/project-binding/mutagen.d.ts +65 -0
  86. package/dist/project-binding/routes.d.ts +9 -0
  87. package/dist/project-binding/session.d.ts +82 -0
  88. package/dist/project-binding/sync-filter.d.ts +19 -0
  89. package/dist/project-binding/sync-size.d.ts +27 -0
  90. package/dist/project-binding/transport.d.ts +21 -0
  91. package/dist/project-binding/types.d.ts +31 -0
  92. package/dist/project-binding/workspaces.d.ts +60 -0
  93. package/dist/project-binding.js +22 -0
  94. package/dist/redaction.d.ts +14 -0
  95. package/dist/redaction.js +30 -0
  96. package/dist/registry.d.ts +4 -0
  97. package/dist/remote/options.d.ts +44 -0
  98. package/dist/remote/selection.d.ts +26 -0
  99. package/dist/remote-control/types.d.ts +1 -1
  100. package/dist/runtime-plan/features.d.ts +7 -0
  101. package/dist/runtime-plan/index.d.ts +4 -0
  102. package/dist/runtime-plan/planner.d.ts +5 -0
  103. package/dist/runtime-plan/resources.d.ts +13 -0
  104. package/dist/runtime-plan/types.d.ts +82 -0
  105. package/dist/runtime-plan.js +281 -0
  106. package/dist/schemas-1HZ0kFpx.js +4270 -0
  107. package/dist/{generated-tool-input-schema--kVuUNc5.js → schemas-BZ6BBrh7.js} +1 -161
  108. package/dist/serve/daemon/config.d.ts +8 -0
  109. package/dist/serve/daemon/index.d.ts +16 -0
  110. package/dist/serve/daemon/paths.d.ts +3 -0
  111. package/dist/serve/daemon/platform-darwin.d.ts +2 -0
  112. package/dist/serve/daemon/platform-linux.d.ts +2 -0
  113. package/dist/serve/daemon/platform-windows.d.ts +2 -0
  114. package/dist/serve/daemon/platform.d.ts +9 -0
  115. package/dist/serve/daemon/process.d.ts +5 -0
  116. package/dist/serve/daemon/types.d.ts +86 -0
  117. package/dist/serve/http.d.ts +8 -0
  118. package/dist/serve/index.d.ts +5 -1
  119. package/dist/serve/native-session.d.ts +19 -0
  120. package/dist/serve/options.d.ts +1 -0
  121. package/dist/serve/session.d.ts +15 -3
  122. package/dist/server/options.d.ts +1 -1
  123. package/dist/{options-DnOUjft1.js → service-D0MwLNyb.js} +38003 -27618
  124. package/dist/setup/hash.d.ts +3 -0
  125. package/dist/setup/local-store.d.ts +34 -0
  126. package/dist/setup/runner.d.ts +40 -0
  127. package/dist/setup/types.d.ts +52 -0
  128. package/dist/stable-json.d.ts +3 -0
  129. package/dist/stable-json.js +26 -0
  130. package/dist/tools.d.ts +38 -12
  131. package/dist/validation-CdqbI2zN.js +174 -0
  132. package/package.json +48 -6
@@ -1,15 +1,25 @@
1
- import { type CapletsMode, type CapletsServerEnv, type CapletsServerInput } from "../server/options";
1
+ import { type CapletsServerEnv, type CapletsServerInput } from "../server/options";
2
+ import { type CapletsRemoteEnv } from "../remote/options";
3
+ type CapletsMode = "auto" | "local" | "remote" | "cloud";
2
4
  export type NativeCapletsMode = CapletsMode;
3
5
  export type NativeRemoteCapletsOptions = {
4
6
  pollIntervalMs?: number;
5
7
  fetch?: typeof fetch;
8
+ cloud?: NativeCloudPresenceInput;
9
+ };
10
+ export type NativeCloudPresenceInput = {
11
+ url?: string;
12
+ accessToken?: string;
13
+ workspaceId?: string;
14
+ projectRoot?: string;
15
+ heartbeatIntervalMs?: number;
6
16
  };
7
17
  export type NativeCapletsServiceResolutionInput = {
8
18
  mode?: NativeCapletsMode;
9
19
  server?: CapletsServerInput;
10
20
  remote?: NativeRemoteCapletsOptions;
11
21
  };
12
- export type NativeCapletsEnv = CapletsServerEnv;
22
+ export type NativeCapletsEnv = CapletsServerEnv & CapletsRemoteEnv;
13
23
  export type NativeRemoteAuthOptions = {
14
24
  enabled: false;
15
25
  user: string;
@@ -21,13 +31,22 @@ export type NativeRemoteAuthOptions = {
21
31
  export type ResolvedNativeCapletsServiceOptions = {
22
32
  mode: "local";
23
33
  } | {
24
- mode: "remote";
34
+ mode: "remote" | "cloud";
25
35
  remote: {
26
36
  url: URL;
27
37
  auth: NativeRemoteAuthOptions;
28
38
  pollIntervalMs: number;
29
39
  requestInit: RequestInit;
40
+ cloud?: ResolvedNativeCloudPresenceOptions;
30
41
  fetch?: typeof fetch;
31
42
  };
32
43
  };
33
44
  export declare function resolveNativeCapletsServiceOptions(input?: NativeCapletsServiceResolutionInput, env?: NativeCapletsEnv): ResolvedNativeCapletsServiceOptions;
45
+ export type ResolvedNativeCloudPresenceOptions = {
46
+ url: URL;
47
+ accessToken: string;
48
+ workspaceId: string;
49
+ projectRoot?: string;
50
+ heartbeatIntervalMs: number;
51
+ };
52
+ export {};
@@ -13,12 +13,13 @@ export type RemoteCapletsClient = {
13
13
  close(): Promise<void>;
14
14
  };
15
15
  export type RemoteCapletsClientOptions = ResolvedNativeCapletsServiceOptions & {
16
- mode: "remote";
16
+ mode: "remote" | "cloud";
17
17
  };
18
18
  export type RemoteNativeCapletsServiceOptions = {
19
19
  client: RemoteCapletsClient;
20
20
  clientFactory?: () => RemoteCapletsClient;
21
21
  pollIntervalMs: number;
22
+ authKind?: "self_hosted_remote" | "hosted_cloud";
22
23
  writeErr?: (value: string) => void;
23
24
  };
24
25
  export declare function createSdkRemoteCapletsClient(options: RemoteCapletsClientOptions["remote"]): RemoteCapletsClient;
@@ -1,6 +1,7 @@
1
1
  import type { NativeCapletsServiceResolutionInput } from "./options";
2
2
  import { resolveNativeCapletsServiceOptions } from "./options";
3
3
  import { type RemoteCapletsClient } from "./remote";
4
+ import type { CodeModeCallableCaplet } from "../code-mode/types";
4
5
  import { type CapletsConfig } from "../config";
5
6
  import { generatedToolInputJsonSchemaForCaplet } from "../generated-tool-input-schema";
6
7
  export type NativeCapletsServiceOptions = NativeCapletsServiceResolutionInput & {
@@ -10,9 +11,7 @@ export type NativeCapletsServiceOptions = NativeCapletsServiceResolutionInput &
10
11
  watchDebounceMs?: number;
11
12
  watch?: boolean;
12
13
  writeErr?: (value: string) => void;
13
- remoteClientFactory?: (options: Extract<ReturnType<typeof resolveNativeCapletsServiceOptions>, {
14
- mode: "remote";
15
- }>["remote"]) => RemoteCapletsClient;
14
+ remoteClientFactory?: (options: ResolvedNativeRemoteOptions) => RemoteCapletsClient;
16
15
  localServiceFactory?: (options: LocalNativeCapletsServiceOptions) => NativeCapletsService;
17
16
  };
18
17
  export type NativeCapletTool = {
@@ -20,9 +19,14 @@ export type NativeCapletTool = {
20
19
  toolName: string;
21
20
  title: string;
22
21
  description: string;
22
+ codeModeRun?: boolean;
23
+ useWhen?: string;
24
+ avoidWhen?: string;
23
25
  promptGuidance: string[];
24
26
  inputSchema?: ReturnType<typeof generatedToolInputJsonSchemaForCaplet> | Record<string, unknown>;
27
+ outputSchema?: Record<string, unknown>;
25
28
  operationNames?: string[];
29
+ codeModeCaplets?: CodeModeCallableCaplet[];
26
30
  };
27
31
  export type NativeCapletsToolsChangedListener = (tools: NativeCapletTool[]) => void;
28
32
  export type NativeCapletsService = {
@@ -33,7 +37,13 @@ export type NativeCapletsService = {
33
37
  close(): Promise<void>;
34
38
  };
35
39
  export declare function createNativeCapletsService(options?: NativeCapletsServiceOptions): NativeCapletsService;
40
+ export declare function resetNativeProjectBindingFallbackWarningForTests(): void;
36
41
  type LocalNativeCapletsServiceOptions = NativeCapletsServiceOptions & {
37
42
  configLoader?: (configPath: string, projectConfigPath: string) => CapletsConfig;
38
43
  };
44
+ type ResolvedNativeRemoteOptions = Extract<Exclude<ReturnType<typeof resolveNativeCapletsServiceOptions>, {
45
+ mode: "local";
46
+ }>, {
47
+ remote: unknown;
48
+ }>["remote"];
39
49
  export {};
@@ -1,4 +1,6 @@
1
1
  import type { CapletConfig } from "../config";
2
+ export declare const nativeCodeModeToolId = "code_mode";
3
+ export declare const nativeCodeModeToolName = "caplets__code_mode";
2
4
  export declare function nativeCapletToolName(capletId: string): string;
3
5
  export declare function nativeCapletsSystemGuidance(toolNames: string[]): string;
4
6
  export declare function nativeCapletPromptGuidance(toolName: string, caplet: CapletConfig): string[];
package/dist/native.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { createNativeCapletsService, type NativeCapletTool, type NativeCapletsService, type NativeCapletsServiceOptions, type NativeCapletsToolsChangedListener, } from "./native/service";
2
2
  export { registerNativeCapletsProcessCleanup, type NativeCapletsProcessCleanupOptions, } from "./native/process-cleanup";
3
- export { nativeCapletPromptGuidance, nativeCapletToolDescription, nativeCapletToolName, nativeCapletsSystemGuidance, } from "./native/tools";
3
+ export { nativeCapletPromptGuidance, nativeCapletToolDescription, nativeCapletToolName, nativeCapletsSystemGuidance, nativeCodeModeToolId, nativeCodeModeToolName, } from "./native/tools";
4
4
  export { generatedToolInputSchema } from "./tools";
5
5
  export { generatedToolInputJsonSchema } from "./generated-tool-input-schema";
6
6
  export { resolveNativeCapletsServiceOptions, type NativeCapletsEnv, type NativeCapletsMode, type NativeCapletsServiceResolutionInput, type NativeRemoteAuthOptions, type NativeRemoteCapletsOptions, type ResolvedNativeCapletsServiceOptions, } from "./native/options";
package/dist/native.js CHANGED
@@ -1,433 +1,5 @@
1
- import { Pt as CapletsError, Q as ToolListChangedNotificationSchema, _ as StreamableHTTPClientTransport, a as resolveCapletsServer, b as Client, bt as parseConfig, i as resolveCapletsMode, l as capabilityDescription, n as mcpUrlForBase, o as CapletsEngine, vt as loadLocalOverlayConfigWithSources } from "./options-DnOUjft1.js";
2
- import { a as generatedToolInputJsonSchemaForCaplet, i as generatedToolInputJsonSchema, l as operations, o as generatedToolInputSchema } from "./generated-tool-input-schema--kVuUNc5.js";
3
- //#region src/native/options.ts
4
- const DEFAULT_POLL_INTERVAL_MS = 3e4;
5
- function resolveNativeCapletsServiceOptions(input = {}, env = process.env) {
6
- if (resolveCapletsMode({
7
- ...input.mode ? { mode: input.mode } : {},
8
- ...input.server?.url ? { serverUrl: input.server.url } : {}
9
- }, env).mode === "local") return { mode: "local" };
10
- const serverFetch = input.remote?.fetch ?? input.server?.fetch;
11
- const server = resolveCapletsServer({
12
- ...input.server,
13
- ...serverFetch ? { fetch: serverFetch } : {}
14
- }, env);
15
- return {
16
- mode: "remote",
17
- remote: {
18
- url: mcpUrlForBase(server.baseUrl),
19
- auth: server.auth,
20
- pollIntervalMs: parsePollInterval(input.remote?.pollIntervalMs),
21
- requestInit: server.requestInit,
22
- ...server.fetch ? { fetch: server.fetch } : {}
23
- }
24
- };
25
- }
26
- function parsePollInterval(value) {
27
- if (value === void 0) return DEFAULT_POLL_INTERVAL_MS;
28
- if (!Number.isInteger(value) || value < 1e3) throw new CapletsError("REQUEST_INVALID", "remote.pollIntervalMs must be an integer >= 1000.");
29
- return value;
30
- }
31
- //#endregion
32
- //#region src/native/tools.ts
33
- function nativeCapletToolName(capletId) {
34
- return `caplets_${capletId.replace(/_/g, "__").replace(/-/g, "_")}`;
35
- }
36
- function nativeCapletsSystemGuidance(toolNames) {
37
- return [
38
- "## Caplets Native Tools",
39
- "",
40
- "Caplets tools expose configured capability domains through progressive discovery.",
41
- "",
42
- "Available Caplets native tools:",
43
- toolNames.length > 0 ? toolNames.map((tool) => `- ${tool}`).join("\n") : "- none",
44
- "",
45
- "Flow: inspect when the domain is unfamiliar; use search_tools/list_tools for actions; MCP-backed Caplets may also expose resources, prompts, and completions in their tool schema.",
46
- "Use fields on call_tool when a non-GraphQL downstream outputSchema allows selecting only needed structured paths."
47
- ].join("\n");
48
- }
49
- function nativeCapletPromptGuidance(toolName, caplet) {
50
- return caplet.backend === "mcp" ? [`Use ${toolName} for the ${caplet.name} Caplet capability domain.`, "Prefer resources for readable context, prompts for reusable workflows, and tools for actions."] : [`Use ${toolName} for the ${caplet.name} Caplet capability domain.`];
51
- }
52
- function nativeCapletToolDescription(toolName, caplet) {
53
- return [
54
- capabilityDescription(caplet),
55
- "",
56
- `Native tool name: ${toolName}`,
57
- `Original Caplet ID: ${caplet.server}`
58
- ].join("\n");
59
- }
60
- //#endregion
61
- //#region src/native/remote.ts
62
- function createSdkRemoteCapletsClient(options) {
63
- const client = new Client({
64
- name: "caplets-native",
65
- version: "1.0.0"
66
- }, { capabilities: {} });
67
- const transport = new StreamableHTTPClientTransport(options.url, {
68
- requestInit: options.requestInit,
69
- ...options.fetch ? { fetch: options.fetch } : {}
70
- });
71
- const ready = client.connect(transport);
72
- const readyObserved = ready.catch(() => void 0);
73
- const listeners = /* @__PURE__ */ new Set();
74
- client.setNotificationHandler(ToolListChangedNotificationSchema, () => {
75
- for (const listener of listeners) listener();
76
- });
77
- return {
78
- async listTools() {
79
- await ready;
80
- return ((await client.listTools()).tools ?? []).map((tool) => ({
81
- name: tool.name,
82
- ...tool.title ? { title: tool.title } : {},
83
- ...tool.description ? { description: tool.description } : {},
84
- ...tool.inputSchema ? { inputSchema: tool.inputSchema } : {}
85
- }));
86
- },
87
- async callTool(name, args) {
88
- await ready;
89
- const toolArguments = args && typeof args === "object" && !Array.isArray(args) ? args : void 0;
90
- return await client.callTool({
91
- name,
92
- arguments: toolArguments
93
- });
94
- },
95
- onToolsChanged(listener) {
96
- listeners.add(listener);
97
- return () => listeners.delete(listener);
98
- },
99
- async close() {
100
- listeners.clear();
101
- await readyObserved;
102
- await transport.terminateSession().catch(() => void 0);
103
- await client.close();
104
- }
105
- };
106
- }
107
- var RemoteNativeCapletsService = class {
108
- options;
109
- tools = [];
110
- listeners = /* @__PURE__ */ new Set();
111
- clientFactory;
112
- client;
113
- unsubscribeRemote;
114
- pollTimer;
115
- closed = false;
116
- resetInFlight;
117
- constructor(options) {
118
- this.options = options;
119
- this.client = options.client;
120
- this.clientFactory = options.clientFactory ?? (() => options.client);
121
- this.unsubscribeRemote = this.subscribeRemote(this.client);
122
- this.pollTimer = setInterval(() => {
123
- this.reload();
124
- }, options.pollIntervalMs);
125
- this.pollTimer.unref?.();
126
- }
127
- listTools() {
128
- return [...this.tools];
129
- }
130
- async execute(capletId, request) {
131
- try {
132
- return await this.client.callTool(capletId, request);
133
- } catch (error) {
134
- if (isAuthFailure(error)) throw remoteAuthError();
135
- if (isSessionFailure(error)) {
136
- if (!await this.resetClient() || this.closed) throw error;
137
- try {
138
- return await this.client.callTool(capletId, request);
139
- } catch (retryError) {
140
- if (isAuthFailure(retryError)) throw remoteAuthError();
141
- throw retryError;
142
- }
143
- }
144
- throw error;
145
- }
146
- }
147
- async reload() {
148
- if (this.closed) return false;
149
- try {
150
- await this.reloadFromClient();
151
- return true;
152
- } catch (error) {
153
- if (isSessionFailure(error)) try {
154
- if (!await this.resetClient() || this.closed) return false;
155
- await this.reloadFromClient();
156
- return !this.closed;
157
- } catch (retryError) {
158
- this.warn(`Could not reload remote Caplets tools: ${errorMessage$2(retryError)}\n`);
159
- return false;
160
- }
161
- this.warn(`Could not reload remote Caplets tools: ${errorMessage$2(error)}\n`);
162
- return false;
163
- }
164
- }
165
- onToolsChanged(listener) {
166
- this.listeners.add(listener);
167
- return () => this.listeners.delete(listener);
168
- }
169
- async close() {
170
- if (this.closed) return;
171
- this.closed = true;
172
- clearInterval(this.pollTimer);
173
- this.unsubscribeRemote();
174
- this.listeners.clear();
175
- await this.client.close();
176
- }
177
- async reloadFromClient() {
178
- const tools = (await this.client.listTools()).map(remoteToolToNativeTool);
179
- const changed = JSON.stringify(tools) !== JSON.stringify(this.tools);
180
- this.tools = tools;
181
- if (changed) this.emitToolsChanged();
182
- }
183
- subscribeRemote(client) {
184
- return client.onToolsChanged(() => {
185
- this.reload();
186
- });
187
- }
188
- async resetClient() {
189
- if (this.resetInFlight) return await this.resetInFlight;
190
- this.resetInFlight = this.doResetClient();
191
- try {
192
- return await this.resetInFlight;
193
- } finally {
194
- this.resetInFlight = void 0;
195
- }
196
- }
197
- async doResetClient() {
198
- if (this.closed) return false;
199
- this.unsubscribeRemote();
200
- await this.client.close().catch(() => void 0);
201
- if (this.closed) return false;
202
- const nextClient = this.clientFactory();
203
- if (this.closed) {
204
- await nextClient.close().catch(() => void 0);
205
- return false;
206
- }
207
- this.client = nextClient;
208
- this.unsubscribeRemote = this.subscribeRemote(this.client);
209
- return true;
210
- }
211
- emitToolsChanged() {
212
- const tools = this.listTools();
213
- for (const listener of this.listeners) listener(tools);
214
- }
215
- warn(message) {
216
- this.options.writeErr?.(message);
217
- }
218
- };
219
- function remoteToolToNativeTool(tool) {
220
- const toolName = nativeCapletToolName(tool.name);
221
- const inputSchema = isPlainObject(tool.inputSchema) ? tool.inputSchema : generatedToolInputJsonSchemaForCaplet({ backend: "tool" });
222
- return {
223
- caplet: tool.name,
224
- toolName,
225
- title: tool.title ?? tool.name,
226
- description: [
227
- tool.description ?? "Remote Caplets tool.",
228
- "",
229
- `Native tool name: ${toolName}`,
230
- `Remote Caplet ID: ${tool.name}`
231
- ].join("\n"),
232
- promptGuidance: [`Use ${toolName} through the remote Caplets service.`],
233
- inputSchema,
234
- operationNames: operationNamesFromSchema(inputSchema)
235
- };
236
- }
237
- function operationNamesFromSchema(schema) {
238
- const properties = schema.properties;
239
- if (!isPlainObject(properties)) return [...operations];
240
- const operation = properties.operation;
241
- if (!isPlainObject(operation) || !Array.isArray(operation.enum)) return [...operations];
242
- return operation.enum.filter((value) => typeof value === "string");
243
- }
244
- function isPlainObject(value) {
245
- return value !== null && typeof value === "object" && !Array.isArray(value);
246
- }
247
- function errorMessage$2(error) {
248
- return error instanceof Error ? error.message : String(error);
249
- }
250
- function remoteAuthError() {
251
- return new CapletsError("AUTH_FAILED", "Remote Caplets authentication failed; check CAPLETS_SERVER_USER and CAPLETS_SERVER_PASSWORD.");
252
- }
253
- function isSessionFailure(error) {
254
- const message = errorMessage$2(error).toLowerCase();
255
- return /session|transport|connection|connect|closed|invalid/u.test(message);
256
- }
257
- function isAuthFailure(error) {
258
- const candidate = error;
259
- const status = typeof candidate?.status === "number" ? candidate.status : void 0;
260
- const statusCode = typeof candidate?.statusCode === "number" ? candidate.statusCode : void 0;
261
- const code = typeof candidate?.code === "number" ? candidate.code : void 0;
262
- if (status === 401 || status === 403 || statusCode === 401 || statusCode === 403 || code === 401 || code === 403) return true;
263
- return /\b(401|403|unauthorized|forbidden)\b/iu.test(errorMessage$2(error));
264
- }
265
- //#endregion
266
- //#region src/native/service.ts
267
- function createNativeCapletsService(options = {}) {
268
- const resolved = resolveNativeCapletsServiceOptions(options);
269
- if (resolved.mode === "remote") {
270
- const localOptions = {
271
- ...options,
272
- mode: "local",
273
- configLoader: createLocalOverlayConfigLoader(options)
274
- };
275
- const local = (options.localServiceFactory ?? createDefaultNativeCapletsService)(localOptions);
276
- try {
277
- return new CompositeNativeCapletsService(new RemoteNativeCapletsService({
278
- client: (options.remoteClientFactory ?? createSdkRemoteCapletsClient)(resolved.remote),
279
- clientFactory: () => (options.remoteClientFactory ?? createSdkRemoteCapletsClient)(resolved.remote),
280
- pollIntervalMs: resolved.remote.pollIntervalMs,
281
- ...options.writeErr ? { writeErr: options.writeErr } : {}
282
- }), local, options);
283
- } catch (error) {
284
- local.close().catch((closeError) => {
285
- writeErr(options, `Could not close local overlay Caplets service: ${errorMessage$1(closeError)}\n`);
286
- });
287
- throw error;
288
- }
289
- }
290
- return new DefaultNativeCapletsService(options);
291
- }
292
- var DefaultNativeCapletsService = class {
293
- engine;
294
- constructor(options) {
295
- this.engine = new CapletsEngine({
296
- ...options,
297
- writeErr: options.writeErr ?? (() => void 0)
298
- });
299
- }
300
- listTools() {
301
- return this.engine.enabledServers().map((caplet) => {
302
- const toolName = nativeCapletToolName(caplet.server);
303
- const inputSchema = generatedToolInputJsonSchemaForCaplet(caplet);
304
- return {
305
- caplet: caplet.server,
306
- toolName,
307
- title: caplet.name,
308
- description: nativeCapletToolDescription(toolName, caplet),
309
- promptGuidance: nativeCapletPromptGuidance(toolName, caplet),
310
- inputSchema,
311
- operationNames: [...inputSchema.properties.operation.enum]
312
- };
313
- });
314
- }
315
- async execute(capletId, request) {
316
- return await this.engine.execute(capletId, request);
317
- }
318
- async reload() {
319
- return await this.engine.reload();
320
- }
321
- onToolsChanged(listener) {
322
- return this.engine.onReload(() => listener(this.listTools()));
323
- }
324
- async close() {
325
- await this.engine.close();
326
- }
327
- };
328
- function createDefaultNativeCapletsService(options) {
329
- return new DefaultNativeCapletsService(options);
330
- }
331
- var CompositeNativeCapletsService = class {
332
- remote;
333
- local;
334
- options;
335
- listeners = /* @__PURE__ */ new Set();
336
- unsubscribers;
337
- tools = [];
338
- closed = false;
339
- batchingReload = false;
340
- constructor(remote, local, options) {
341
- this.remote = remote;
342
- this.local = local;
343
- this.options = options;
344
- this.unsubscribers = [this.remote.onToolsChanged(() => this.updateMergedTools()), this.local.onToolsChanged(() => this.updateMergedTools())];
345
- this.tools = this.mergeTools();
346
- }
347
- listTools() {
348
- return [...this.tools];
349
- }
350
- async execute(capletId, request) {
351
- if (this.local.listTools().some((tool) => tool.caplet === capletId)) return await this.local.execute(capletId, request);
352
- return await this.remote.execute(capletId, request);
353
- }
354
- async reload() {
355
- if (this.closed) return false;
356
- this.batchingReload = true;
357
- const remoteReloaded = await this.reloadChild(this.remote, "remote");
358
- const localReloaded = await this.reloadChild(this.local, "local overlay");
359
- this.batchingReload = false;
360
- if (remoteReloaded === void 0 || localReloaded === void 0) return false;
361
- this.updateMergedTools();
362
- return remoteReloaded || localReloaded;
363
- }
364
- onToolsChanged(listener) {
365
- this.listeners.add(listener);
366
- return () => this.listeners.delete(listener);
367
- }
368
- async close() {
369
- if (this.closed) return;
370
- this.closed = true;
371
- for (const unsubscribe of this.unsubscribers.splice(0)) unsubscribe();
372
- this.listeners.clear();
373
- await Promise.all([this.remote.close(), this.local.close()]);
374
- }
375
- updateMergedTools() {
376
- if (this.closed || this.batchingReload) return;
377
- const tools = this.mergeTools();
378
- if (JSON.stringify(tools) === JSON.stringify(this.tools)) return;
379
- this.tools = tools;
380
- for (const listener of this.listeners) try {
381
- listener(this.listTools());
382
- } catch (error) {
383
- writeErr(this.options, `Caplets tools-changed listener failed: ${errorMessage$1(error)}\n`);
384
- }
385
- }
386
- mergeTools() {
387
- const localTools = this.local.listTools();
388
- const localIds = new Set(localTools.map((tool) => tool.caplet));
389
- return [...this.remote.listTools().filter((tool) => !localIds.has(tool.caplet)), ...localTools];
390
- }
391
- async reloadChild(service, label) {
392
- try {
393
- return await service.reload();
394
- } catch (error) {
395
- writeErr(this.options, `Could not reload composite Caplets tools from ${label}: ${errorMessage$1(error)}\n`);
396
- return;
397
- }
398
- }
399
- };
400
- function createLocalOverlayConfigLoader(options) {
401
- let hasLoaded = false;
402
- let previousWarnings = /* @__PURE__ */ new Set();
403
- return (configPath, projectConfigPath) => {
404
- let result;
405
- try {
406
- result = loadLocalOverlayConfigWithSources(configPath, projectConfigPath);
407
- } catch (error) {
408
- writeErr(options, `Caplets local overlay warning: Could not load local overlay config: ${errorMessage$1(error)}\n`);
409
- if (hasLoaded) throw new CapletsError("CONFIG_INVALID", "Caplets local overlay reload failed; keeping last known-good config.", error);
410
- hasLoaded = true;
411
- return parseConfig({});
412
- }
413
- for (const warning of result.warnings) writeErr(options, `Caplets local overlay warning${typeof warning.path === "string" ? ` at ${warning.path}` : ""}: ${warning.message}\n`);
414
- const warnings = new Set(result.warnings.map(warningKey));
415
- if (hasLoaded && [...warnings].some((warning) => !previousWarnings.has(warning))) throw new CapletsError("CONFIG_INVALID", "Caplets local overlay reload produced new warnings; keeping last known-good config.");
416
- previousWarnings = warnings;
417
- hasLoaded = true;
418
- return result.config;
419
- };
420
- }
421
- function warningKey(warning) {
422
- return `${warning.kind}\0${warning.path}\0${warning.message}`;
423
- }
424
- function writeErr(options, message) {
425
- options.writeErr?.(message);
426
- }
427
- function errorMessage$1(error) {
428
- return error instanceof Error ? error.message : String(error);
429
- }
430
- //#endregion
1
+ import { C as nativeCapletToolName, E as nativeCodeModeToolName, S as nativeCapletToolDescription, T as nativeCodeModeToolId, f as RemoteNativeCapletsService, h as resolveNativeCapletsServiceOptions, p as createSdkRemoteCapletsClient, t as createNativeCapletsService, w as nativeCapletsSystemGuidance, x as nativeCapletPromptGuidance } from "./service-D0MwLNyb.js";
2
+ import { generatedToolInputJsonSchema, generatedToolInputSchema } from "./generated-tool-input-schema.js";
431
3
  //#region src/native/process-cleanup.ts
432
4
  function registerNativeCapletsProcessCleanup(service, options = {}) {
433
5
  let closed = false;
@@ -457,4 +29,4 @@ function errorMessage(error) {
457
29
  return error instanceof Error ? error.message : String(error);
458
30
  }
459
31
  //#endregion
460
- export { RemoteNativeCapletsService, createNativeCapletsService, createSdkRemoteCapletsClient, generatedToolInputJsonSchema, generatedToolInputSchema, nativeCapletPromptGuidance, nativeCapletToolDescription, nativeCapletToolName, nativeCapletsSystemGuidance, registerNativeCapletsProcessCleanup, resolveNativeCapletsServiceOptions };
32
+ export { RemoteNativeCapletsService, createNativeCapletsService, createSdkRemoteCapletsClient, generatedToolInputJsonSchema, generatedToolInputSchema, nativeCapletPromptGuidance, nativeCapletToolDescription, nativeCapletToolName, nativeCapletsSystemGuidance, nativeCodeModeToolId, nativeCodeModeToolName, registerNativeCapletsProcessCleanup, resolveNativeCapletsServiceOptions };
@@ -0,0 +1,5 @@
1
+ import { type ExtractObservedOutputShapeInput, type JsonShape, type ObservedOutputShape } from "./types";
2
+ export declare function observeOutputShape(input: ExtractObservedOutputShapeInput): ObservedOutputShape | undefined;
3
+ export declare function extractJsonShape(value: unknown): JsonShape | undefined;
4
+ export declare function parseShapeableJsonText(value: unknown): unknown | undefined;
5
+ export declare function normalizedObservableValue(result: unknown): unknown | undefined;
@@ -0,0 +1,17 @@
1
+ import { type ObservedOutputShape, type ObservedOutputShapeKey, type ObservedOutputShapePruneResult, type ObservedOutputShapeStore, type ObservedOutputShapeStoreHealth } from "./types";
2
+ export declare class FileObservedOutputShapeStore implements ObservedOutputShapeStore {
3
+ private readonly cacheDir;
4
+ private readonly options;
5
+ constructor(cacheDir: string, options?: {
6
+ ttlMs?: number | undefined;
7
+ maxEntries?: number | undefined;
8
+ });
9
+ read(key: ObservedOutputShapeKey): Promise<ObservedOutputShape | undefined>;
10
+ write(key: ObservedOutputShapeKey, shape: ObservedOutputShape): Promise<void>;
11
+ prune(now?: Date): Promise<ObservedOutputShapePruneResult>;
12
+ health(): Promise<ObservedOutputShapeStoreHealth>;
13
+ private pathFor;
14
+ private entries;
15
+ private ttlMs;
16
+ private maxEntries;
17
+ }
@@ -0,0 +1,7 @@
1
+ export { FileObservedOutputShapeStore } from "./file-store";
2
+ export { extractJsonShape, normalizedObservableValue, observeOutputShape, parseShapeableJsonText, } from "./extract";
3
+ export { backendFingerprint, observedOutputShapeKey, observedOutputShapeStorageKey, stableHash, } from "./key";
4
+ export { mergeJsonShapes } from "./merge";
5
+ export { usefulOutputSchema } from "./schema";
6
+ export { hasTruncatedShape, shapeToTypeScript, shapeType } from "./typescript";
7
+ export { OBSERVED_OUTPUT_SHAPE_LIMITS, OBSERVED_OUTPUT_SHAPE_VERSION, type JsonShape, type ObservedOutputShape, type ObservedOutputShapeKey, type ObservedOutputShapePruneResult, type ObservedOutputShapeStore, type ObservedOutputShapeStoreHealth, } from "./types";
@@ -0,0 +1,14 @@
1
+ import type { CapletConfig } from "../config";
2
+ import { type ObservedOutputShapeKey } from "./types";
3
+ export declare function observedOutputShapeStorageKey(key: ObservedOutputShapeKey): string;
4
+ export declare function observedOutputShapeKey(input: {
5
+ scope: ObservedOutputShapeKey["scope"];
6
+ workspaceId?: string | undefined;
7
+ projectFingerprint?: string | undefined;
8
+ caplet: CapletConfig;
9
+ toolName: string;
10
+ toolDescriptor?: unknown;
11
+ outputSchema?: unknown;
12
+ }): ObservedOutputShapeKey;
13
+ export declare function backendFingerprint(caplet: CapletConfig): string;
14
+ export declare function stableHash(value: unknown): string;
@@ -0,0 +1,2 @@
1
+ import { type JsonShape } from "./types";
2
+ export declare function mergeJsonShapes(left: JsonShape, right: JsonShape): JsonShape;
@@ -0,0 +1,5 @@
1
+ export { extractJsonShape, normalizedObservableValue, observeOutputShape, parseShapeableJsonText, } from "./extract";
2
+ export { mergeJsonShapes } from "./merge";
3
+ export { usefulOutputSchema } from "./schema";
4
+ export { hasTruncatedShape, shapeToTypeScript, shapeType } from "./typescript";
5
+ export { OBSERVED_OUTPUT_SHAPE_LIMITS, OBSERVED_OUTPUT_SHAPE_VERSION, type JsonShape, type ObservedOutputShape, type ExtractObservedOutputShapeInput, } from "./types";