@dan-ai-studio/dshopencodego 0.1.18 → 0.1.19

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/lib/client.js CHANGED
@@ -462,7 +462,7 @@ if (!document.querySelector("style[data-plugin-css=" + JSON.stringify(id) + "]")
462
462
  style.textContent = ".d7lz0W_root{color:var(--dsw-alias-label-primary);flex-direction:column;gap:1.25rem;display:flex}.d7lz0W_title{margin:0;font-size:1.05rem}.d7lz0W_hint{color:var(--dsw-alias-label-secondary);margin:0;font-size:.8rem}.d7lz0W_warn{color:var(--dsw-alias-state-warn-primary);margin:0;font-size:.8rem}.d7lz0W_ok{color:var(--dsw-alias-state-success-primary);font-size:.8rem}.d7lz0W_block{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:.6rem;flex-direction:column;gap:.5rem;padding:.85rem;display:flex}.d7lz0W_row{flex-wrap:wrap;align-items:center;gap:.5rem;display:flex}.d7lz0W_row>strong{margin-right:auto}.d7lz0W_input{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);min-width:10rem;color:var(--dsw-alias-label-primary);font:inherit;border-radius:.35rem;flex:14rem;padding:.35rem .5rem;font-size:.85rem}.d7lz0W_button{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:.35rem;padding:.35rem .7rem;font-size:.8rem}.d7lz0W_button:disabled{color:var(--dsw-alias-state-idle-primary);cursor:default}.d7lz0W_number{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:5rem;color:var(--dsw-alias-label-primary);font:inherit;border-radius:.35rem;padding:.25rem .4rem;font-size:.8rem}.d7lz0W_select{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:100%;color:var(--dsw-alias-label-primary);font:inherit;border-radius:.35rem;padding:.25rem .4rem;font-size:.8rem}.d7lz0W_list{flex-direction:column;display:flex}.d7lz0W_item{border-top:1px solid var(--dsw-alias-border-l1);align-items:flex-start;gap:.5rem;padding:.45rem .15rem;display:flex}.d7lz0W_item input[type=checkbox]{accent-color:var(--dsw-alias-brand-primary);margin-top:.15rem}.d7lz0W_itemBody{flex-direction:column;gap:.15rem;min-width:0;display:flex}.d7lz0W_itemMain{flex-wrap:wrap;align-items:baseline;gap:.6rem;display:flex}.d7lz0W_itemMeta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:.75rem;font-size:.75rem;display:flex}.d7lz0W_itemModalities{color:var(--dsw-alias-label-secondary);font-size:.75rem}.d7lz0W_name{color:var(--dsw-alias-label-primary)}.d7lz0W_mono{color:var(--dsw-alias-label-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.d7lz0W_badge{color:var(--dsw-alias-brand-primary)}";
463
463
  document.head.appendChild(style);
464
464
  }
465
- var section_default = { "ok": "d7lz0W_ok", "itemModalities": "d7lz0W_itemModalities", "number": "d7lz0W_number", "hint": "d7lz0W_hint", "item": "d7lz0W_item", "block": "d7lz0W_block", "name": "d7lz0W_name", "warn": "d7lz0W_warn", "itemMain": "d7lz0W_itemMain", "badge": "d7lz0W_badge", "button": "d7lz0W_button", "input": "d7lz0W_input", "row": "d7lz0W_row", "select": "d7lz0W_select", "title": "d7lz0W_title", "list": "d7lz0W_list", "root": "d7lz0W_root", "itemMeta": "d7lz0W_itemMeta", "itemBody": "d7lz0W_itemBody", "mono": "d7lz0W_mono" };
465
+ var section_default = { "row": "d7lz0W_row", "itemModalities": "d7lz0W_itemModalities", "input": "d7lz0W_input", "button": "d7lz0W_button", "list": "d7lz0W_list", "root": "d7lz0W_root", "item": "d7lz0W_item", "title": "d7lz0W_title", "itemMeta": "d7lz0W_itemMeta", "itemBody": "d7lz0W_itemBody", "itemMain": "d7lz0W_itemMain", "badge": "d7lz0W_badge", "ok": "d7lz0W_ok", "number": "d7lz0W_number", "name": "d7lz0W_name", "mono": "d7lz0W_mono", "select": "d7lz0W_select", "hint": "d7lz0W_hint", "block": "d7lz0W_block", "warn": "d7lz0W_warn" };
466
466
 
467
467
  // src/client/Section.tsx
468
468
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -963,7 +963,7 @@ if (!document.querySelector("style[data-plugin-css=" + JSON.stringify(id2) + "]"
963
963
  style.textContent = ".mMNkkW_root{align-items:center;display:inline-flex;position:relative}.mMNkkW_trigger{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;white-space:nowrap;border-radius:999px;padding:.35rem .6rem;font-size:.8rem;line-height:1}.mMNkkW_trigger:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2)}.mMNkkW_panel{z-index:20;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-overlay);width:18rem;color:var(--dsw-alias-label-primary);border-radius:.6rem;flex-direction:column;gap:.6rem;padding:.75rem .85rem;display:flex;position:absolute;bottom:calc(100% + .5rem);right:0;box-shadow:0 8px 24px #0000002e}.mMNkkW_window{flex-direction:column;gap:.25rem;display:flex}.mMNkkW_row{justify-content:space-between;gap:.5rem;font-size:.85rem;display:flex}.mMNkkW_hint{color:var(--dsw-alias-label-secondary);margin:0;font-size:.75rem}.mMNkkW_progress{width:100%;height:.35rem;accent-color:var(--dsw-alias-brand-primary)}.mMNkkW_limited{color:var(--dsw-alias-state-warn-primary);font-size:.75rem}.mMNkkW_warning{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary);border-radius:.4rem;padding:.4rem .5rem;font-size:.75rem}.mMNkkW_retry{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:.35rem;align-self:flex-start;padding:.25rem .5rem;font-size:.75rem}.mMNkkW_local{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;gap:.2rem;padding-top:.5rem;display:flex}";
964
964
  document.head.appendChild(style);
965
965
  }
966
- var pill_default = { "hint": "mMNkkW_hint", "warning": "mMNkkW_warning", "trigger": "mMNkkW_trigger", "row": "mMNkkW_row", "retry": "mMNkkW_retry", "root": "mMNkkW_root", "panel": "mMNkkW_panel", "local": "mMNkkW_local", "window": "mMNkkW_window", "limited": "mMNkkW_limited", "progress": "mMNkkW_progress" };
966
+ var pill_default = { "local": "mMNkkW_local", "row": "mMNkkW_row", "retry": "mMNkkW_retry", "panel": "mMNkkW_panel", "warning": "mMNkkW_warning", "window": "mMNkkW_window", "hint": "mMNkkW_hint", "root": "mMNkkW_root", "progress": "mMNkkW_progress", "limited": "mMNkkW_limited", "trigger": "mMNkkW_trigger" };
967
967
 
968
968
  // src/client/UsagePill.tsx
969
969
  var import_jsx_runtime2 = require("react/jsx-runtime");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dan-ai-studio/dshopencodego",
3
- "version": "0.1.18",
3
+ "version": "0.1.19",
4
4
  "description": "OpenCode Go provider for DeepSeek Harness: live gateway catalog, per-conversation session header, usage",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -31,6 +31,7 @@
31
31
  },
32
32
  "files": [
33
33
  "lib",
34
+ "scripts/patch-pi-ai.mjs",
34
35
  "cordis.patch.yml",
35
36
  "README.md",
36
37
  "README.en.md",
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Port of DSH's `patches/@earendil-works__pi-ai@0.87.1.patch` for npm installs.
3
+ *
4
+ * Upstream re-parses the whole accumulated tool-call argument JSON on every
5
+ * stream delta (`O(n^2)` on multi-megabyte arguments and stalls the event
6
+ * loop). DSH removes those per-delta parses via pnpm `patchedDependencies`;
7
+ * this package is npm-installed, so the same removals are applied here,
8
+ * idempotently, to the installed copy.
9
+ *
10
+ * Only the per-delta occurrences are removed — each is anchored on its
11
+ * distinctive preceding accumulation line, exactly matching the upstream
12
+ * hunks. The final parses (toolcall_end / done handlers, which strip the
13
+ * scratch buffers so replay carries parsed arguments) are kept.
14
+ *
15
+ * The adapter only reads delta strings plus the finalized arguments (see
16
+ * `src/conversion/stream.ts`), so dropping the intermediate `arguments`
17
+ * assignments changes no wire behaviour — until `toolcall_end` the partials
18
+ * stay `{}`, exactly like the patched DSH runtime.
19
+ *
20
+ * Best-effort: a missing tree or a newer pi-ai that already dropped the lines
21
+ * only warns; it never fails the install.
22
+ */
23
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs'
24
+ import { dirname, resolve } from 'node:path'
25
+ import { createRequire } from 'node:module'
26
+ import { fileURLToPath } from 'node:url'
27
+
28
+ const require = createRequire(import.meta.url)
29
+
30
+ /** Locate the installed pi-ai root without crossing its `exports` map. */
31
+ function findPiRoot() {
32
+ try {
33
+ const main = require.resolve('@earendil-works/pi-ai')
34
+ if (basenameIsDist(dirname(main))) return dirname(dirname(main))
35
+ } catch {
36
+ // Fall through to the layout probe below.
37
+ }
38
+ const probe = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'node_modules', '@earendil-works', 'pi-ai')
39
+ return existsSync(`${probe}/package.json`) ? probe : undefined
40
+ }
41
+
42
+ /** True when `dir` is the package's `dist` directory. */
43
+ function basenameIsDist(dir) {
44
+ return dir.endsWith('/dist') || dir.endsWith('\\dist')
45
+ }
46
+
47
+ /**
48
+ * One hunk: `before` (kept) immediately followed by `removed`.
49
+ * Whitespace between them is flexible; nothing else is touched.
50
+ */
51
+ const HUNKS = [
52
+ ['dist/api/anthropic-messages.js',
53
+ 'block.partialJson += event.delta.partial_json;',
54
+ 'block.arguments = parseStreamingJson(block.partialJson);'],
55
+ ['dist/api/bedrock-converse-stream.js',
56
+ 'block.partialJson = (block.partialJson || "") + (delta.toolUse.input || "");',
57
+ 'block.arguments = parseStreamingJson(block.partialJson);'],
58
+ ['dist/api/mistral-conversations.js',
59
+ 'block.partialArgs = (block.partialArgs || "") + argsDelta;',
60
+ 'block.arguments = parseStreamingJson(block.partialArgs);'],
61
+ ['dist/api/openai-completions.js',
62
+ 'block.partialArgs = (block.partialArgs ?? "") + toolCall.function.arguments;',
63
+ 'block.arguments = parseStreamingJson(block.partialArgs);'],
64
+ ['dist/api/openai-responses-shared.js',
65
+ 'slot.block.partialJson += event.delta;',
66
+ 'slot.block.arguments = parseStreamingJson(slot.block.partialJson);'],
67
+ ]
68
+
69
+ const escapeRegExp = text => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
70
+
71
+ const piRoot = findPiRoot()
72
+ if (piRoot === undefined) {
73
+ console.warn('[dshopencodego] patch-pi-ai: pi-ai not installed, skipping')
74
+ process.exit(0)
75
+ }
76
+
77
+ let version = 'unknown'
78
+ try {
79
+ version = JSON.parse(readFileSync(`${piRoot}/package.json`, 'utf8')).version ?? 'unknown'
80
+ } catch (error) {
81
+ console.warn(`[dshopencodego] patch-pi-ai: cannot read pi-ai version, skipping (${String(error)})`)
82
+ process.exit(0)
83
+ }
84
+ if (version !== '0.87.1') {
85
+ console.warn(`[dshopencodego] patch-pi-ai: pi-ai ${version} is not 0.87.1, skipping (re-check upstream pi#9265)`)
86
+ process.exit(0)
87
+ }
88
+
89
+ let patched = 0
90
+ let files = 0
91
+ for (const [rel, before, removed] of HUNKS) {
92
+ const path = `${piRoot}/${rel}`
93
+ if (!existsSync(path)) continue
94
+ files += 1
95
+ const pattern = new RegExp(`(${escapeRegExp(before)}\\n)(\\s*${escapeRegExp(removed)}\\n)`)
96
+ const text = readFileSync(path, 'utf8')
97
+ if (!pattern.test(text)) continue
98
+ writeFileSync(path, text.replace(pattern, '$1'))
99
+ patched += 1
100
+ }
101
+
102
+ // pi-messages.js spans the delta assignment over two lines.
103
+ {
104
+ const path = `${piRoot}/dist/api/pi-messages.js`
105
+ if (existsSync(path)) {
106
+ files += 1
107
+ const pattern = /partial\.content\[event\.contentIndex\]\.arguments =\s*\n?\s*parseStreamingJson\(json\);\n/
108
+ const text = readFileSync(path, 'utf8')
109
+ if (pattern.test(text)) {
110
+ writeFileSync(path, text.replace(pattern, ''))
111
+ patched += 1
112
+ }
113
+ }
114
+ }
115
+ console.log(`[dshopencodego] patch-pi-ai: ${patched} hunks applied across ${files} files (idempotent)`)