@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 +2 -2
- package/package.json +2 -1
- package/scripts/patch-pi-ai.mjs +115 -0
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 = { "
|
|
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 = { "
|
|
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.
|
|
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)`)
|