@caplets/opencode 0.6.0 → 0.6.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.
package/README.md CHANGED
@@ -8,6 +8,8 @@ MCP-backed Caplets advertise resource, prompt, template, and completion operatio
8
8
 
9
9
  Use `caplets__code_mode` for multi-step workflows that benefit from Code Mode: TypeScript with generated `caplets.<id>` handles, progressive discovery, downstream tool calls, filtering, joins, and compact synthesis in one native OpenCode call.
10
10
 
11
+ For adjacent workflows, omit top-level `sessionId` to start a fresh reusable Code Mode session, then pass the returned `meta.sessionId` as top-level `sessionId` on later calls that should reuse live helper functions, `var` bindings, and runtime state while the session remains available. Unknown or expired sessions fail before execution; use recovery metadata for audit or manual reconstruction rather than automatic replay.
12
+
11
13
  ```jsonc
12
14
  {
13
15
  "plugin": ["@caplets/opencode"],
@@ -48,11 +50,9 @@ export default {
48
50
  "@caplets/opencode",
49
51
  {
50
52
  mode: "remote",
51
- server: {
53
+ remote: {
52
54
  url: "https://caplets.example.com/caplets",
53
55
  user: "caplets",
54
- },
55
- remote: {
56
56
  pollIntervalMs: 5_000,
57
57
  },
58
58
  },
@@ -61,4 +61,4 @@ export default {
61
61
  };
62
62
  ```
63
63
 
64
- Plugin config overrides environment variables. The explicit config shape is `{ mode, server: { url, user }, remote: { pollIntervalMs } }`. Prefer `CAPLETS_REMOTE_TOKEN` or `CAPLETS_REMOTE_PASSWORD` for self-hosted credentials unless your OpenCode setup provides secure secret storage.
64
+ Plugin config overrides environment variables. The explicit config shape is `{ mode, remote: { url, user, pollIntervalMs } }`. Prefer `CAPLETS_REMOTE_TOKEN` or `CAPLETS_REMOTE_PASSWORD` for self-hosted credentials unless your OpenCode setup provides secure secret storage.
package/dist/index.js CHANGED
@@ -29,7 +29,8 @@ function capletsOpenCodeArgs(operationNames = [...operations]) {
29
29
  function capletsOpenCodeRunArgs() {
30
30
  return {
31
31
  code: tool.schema.string(),
32
- timeoutMs: tool.schema.number().int().positive().optional()
32
+ timeoutMs: tool.schema.number().int().positive().optional(),
33
+ sessionId: tool.schema.string().optional()
33
34
  };
34
35
  }
35
36
  function capletsOpenCodeJsonSchemaArgs(schema) {
@@ -55,10 +56,10 @@ async function createCapletsOpenCodeHooks(service) {
55
56
  const registeredToolNames = new Set(capletTools.map((caplet) => caplet.toolName));
56
57
  return {
57
58
  tool: Object.fromEntries(capletTools.map((caplet) => [caplet.toolName, tool({
58
- description: caplet.description,
59
+ description: caplet.codeModeRun ? openCodeCodeModeDescription(caplet.description) : caplet.description,
59
60
  args: caplet.codeModeRun ? capletsOpenCodeRunArgs() : caplet.operationNames ? capletsOpenCodeArgs(caplet.operationNames) : capletsOpenCodeJsonSchemaArgs(caplet.inputSchema),
60
61
  async execute(args) {
61
- return compactOpenCodeResult(await service.execute(caplet.caplet, args));
62
+ return compactOpenCodeResult(await service.execute(caplet.caplet, caplet.codeModeRun ? normalizeCodeModeRunArgs(args) : args));
62
63
  }
63
64
  })])),
64
65
  "experimental.chat.system.transform": async (_input, output) => {
@@ -66,6 +67,23 @@ async function createCapletsOpenCodeHooks(service) {
66
67
  }
67
68
  };
68
69
  }
70
+ function openCodeCodeModeDescription(description) {
71
+ return [
72
+ description,
73
+ "",
74
+ "OpenCode argument shape: omit top-level `sessionId` to start a fresh reusable session. To reuse a live session, pass top-level `sessionId: meta.sessionId`."
75
+ ].join("\n");
76
+ }
77
+ function normalizeCodeModeRunArgs(args) {
78
+ if (!args || typeof args !== "object" || Array.isArray(args)) return args;
79
+ const record = args;
80
+ const { sessionId: _sessionId, ...rest } = record;
81
+ if (typeof record.sessionId === "string" && record.sessionId.trim() !== "") return {
82
+ ...rest,
83
+ sessionId: record.sessionId
84
+ };
85
+ return rest;
86
+ }
69
87
  function compactOpenCodeResult(result) {
70
88
  if (typeof result === "string") return result;
71
89
  if (!result || typeof result !== "object" || Array.isArray(result)) return String(result ?? "null");
@@ -92,7 +110,6 @@ function normalizeOpenCodeConfig(config) {
92
110
  if (!config) return {};
93
111
  return {
94
112
  ...config.mode ? { mode: config.mode } : {},
95
- ...config.server ? { server: config.server } : {},
96
113
  ...config.remote ? { remote: config.remote } : {}
97
114
  };
98
115
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caplets/opencode",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Native OpenCode plugin for Caplets.",
5
5
  "homepage": "https://github.com/spiritledsoftware/caplets#readme",
6
6
  "bugs": {
@@ -26,7 +26,7 @@
26
26
  "access": "public"
27
27
  },
28
28
  "dependencies": {
29
- "@caplets/core": "0.23.0"
29
+ "@caplets/core": "0.24.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@jitl/quickjs-wasmfile-release-sync": "^0.32.0",