neoctl-web 0.1.11 → 0.1.13

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/dist/index.html CHANGED
@@ -19,8 +19,8 @@
19
19
  })()
20
20
  </script>
21
21
  <title>neo runtime</title>
22
- <script type="module" crossorigin src="/assets/index-DZgO3hdD.js"></script>
23
- <link rel="stylesheet" crossorigin href="/assets/index-BbUoWpPT.css">
22
+ <script type="module" crossorigin src="/assets/index-BnJuxSfa.js"></script>
23
+ <link rel="stylesheet" crossorigin href="/assets/index-9hY14np_.css">
24
24
  </head>
25
25
  <body>
26
26
  <div id="app"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neoctl-web",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "Neo browser workspace with an embedded agent runtime.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -32,7 +32,7 @@
32
32
  "@tanstack/vue-virtual": "^3.13.36",
33
33
  "highlight.js": "^11.11.1",
34
34
  "marked": "^18.0.3",
35
- "neoctl": "^0.2.37",
35
+ "neoctl": "^0.2.39",
36
36
  "streaming-markdown": "^0.2.15",
37
37
  "vue": "^3.5.13"
38
38
  },
@@ -6,6 +6,7 @@ export function createPlugin() {
6
6
  tools: [createExposeDownloadsTool({ registry })],
7
7
  promptSections: [{
8
8
  name: 'Web Downloads',
9
+ requiresTools: ['expose_downloads'],
9
10
  cacheStable: true,
10
11
  content: 'When you create, modify, export, package, or identify local files that the web user should receive, call expose_downloads with the relevant absolute paths before the final response. For every link in your response, copy the returned downloads[].markdown value verbatim. This is the neoctl.resource-link.v1 protocol: never construct a link, alter the reference URI, or add/remove a sandbox: prefix. The tool also returns expiresAt as an ISO timestamp.',
11
12
  }],
package/server.mjs CHANGED
@@ -86,6 +86,7 @@ const workspaceRuntime = createWorkspaceRuntimeManager({
86
86
  ...runtimeOptions,
87
87
  ...pluginHost.runtimePlugins(runtimeOptions.sessionId),
88
88
  globalToolOverrides: toolSettings.globalOverrides(),
89
+ resolveGlobalToolOverrides: () => toolSettings.globalOverrides(),
89
90
  sessionToolOverrides: toolSettings.sessionOverrides(runtimeOptions.sessionId),
90
91
  persistGlobalToolOverrides: (overrides) => toolSettings.setGlobalOverrides(overrides),
91
92
  persistSessionToolOverrides: (sessionId, overrides) => toolSettings.setSessionOverrides(sessionId, overrides),
package/tool-settings.mjs CHANGED
@@ -9,10 +9,14 @@ export async function createWebToolSettings(storageFile) {
9
9
  return structuredClone(state);
10
10
  }
11
11
 
12
- async function update(next) {
13
- state = next;
14
- writeQueue = writeQueue.catch(() => undefined).then(() => writeState(storageFile, state));
15
- await writeQueue;
12
+ async function update(transform) {
13
+ const mutation = writeQueue.catch(() => undefined).then(async () => {
14
+ const next = transform(state);
15
+ await writeState(storageFile, next);
16
+ state = next;
17
+ });
18
+ writeQueue = mutation;
19
+ await mutation;
16
20
  }
17
21
 
18
22
  return {
@@ -25,16 +29,19 @@ export async function createWebToolSettings(storageFile) {
25
29
  return value && typeof value === 'object' ? { ...value } : {};
26
30
  },
27
31
  async setGlobalOverrides(overrides) {
28
- await update({ ...state, global: normalizeOverrides(overrides) });
32
+ const global = normalizeOverrides(overrides);
33
+ await update(current => ({ ...current, global }));
29
34
  },
30
35
  async setSessionOverrides(sessionId, overrides) {
31
36
  const id = String(sessionId || '').trim();
32
37
  if (!id) throw new Error('session id is required');
33
- const sessions = { ...state.sessions };
34
38
  const normalized = normalizeOverrides(overrides);
35
- if (Object.keys(normalized).length) sessions[id] = normalized;
36
- else delete sessions[id];
37
- await update({ ...state, sessions });
39
+ await update(current => {
40
+ const sessions = { ...current.sessions };
41
+ if (Object.keys(normalized).length) sessions[id] = normalized;
42
+ else delete sessions[id];
43
+ return { ...current, sessions };
44
+ });
38
45
  },
39
46
  };
40
47
  }