@deepseek-insight/dsi 0.6.9 → 0.6.11
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/.agents/skills/dsi-ov-setup/SKILL.md +134 -0
- package/.agents/skills/dsi-plugin-rack/rack.d.mts +35 -0
- package/.agents/skills/dsi-plugin-rack/rack.mjs +168 -26
- package/build/client/_app/immutable/assets/{2.BGqV97Jd.css → 2.BuaCdYrs.css} +1 -1
- package/build/client/_app/immutable/chunks/{UkmEG9Ws.js → BNTNz9oR.js} +1 -1
- package/build/client/_app/immutable/chunks/CiFavIif.js +1 -0
- package/build/client/_app/immutable/chunks/DN37js12.js +1 -0
- package/build/client/_app/immutable/chunks/KLsbJ_6V.js +2 -0
- package/build/client/_app/immutable/entry/{app.e7xoYywe.js → app.BNlAGT8a.js} +2 -2
- package/build/client/_app/immutable/entry/start.BQEoVg3q.js +1 -0
- package/build/client/_app/immutable/nodes/{1.E4wiL8sP.js → 1.CeFdv8vr.js} +1 -1
- package/build/client/_app/immutable/nodes/{2.BBV-AGuB.js → 2.Boib-Q5k.js} +195 -195
- package/build/client/_app/version.json +1 -1
- package/build/handler.js +4 -4
- package/build/index.js +4 -4
- package/build/server/chunks/chunks/{engine.js-CrdWRSwf.js → engine.js-1gYqtdBP.js} +17 -2
- package/build/server/chunks/chunks/{internal.js-BnJXHc1S.js → internal.js-XBbRSE8G.js} +2 -2
- package/build/server/chunks/chunks/{state.js-CAjHzrRZ.js → state.js-DgcRLBLq.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/plugins/apply/{_server.ts.js-CpO--Jwf.js → _server.ts.js-BNEUWbaf.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/plugins/reload/{_server.ts.js-BACFXWMj.js → _server.ts.js-Ct28d7_t.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/plugins/snapshot/{_server.ts.js-BJg0hLlC.js → _server.ts.js-DswGIO4S.js} +2 -2
- package/build/server/chunks/entries/pages/{_error.svelte.js-BXeIuPj-.js → _error.svelte.js-CRYTX4NJ.js} +3 -3
- package/build/server/chunks/entries/pages/{_page.svelte.js-CW-EdJ00.js → _page.svelte.js-jCShpNgz.js} +164 -14
- package/build/server/chunks/{handler-DimUSmTW.js → handler-CDSfkiHz.js} +3 -3
- package/build/server/chunks/{index.js-BQUp4Xgn.js → index.js-BOeQQ7jF.js} +2 -2
- package/build/server/chunks/{manifest.js-BWy6zgHL.js → manifest.js-CvDWy0oM.js} +7 -7
- package/build/server/chunks/nodes/1.js-1rT6o2jA.js +9 -0
- package/build/server/chunks/nodes/{2.js-CzgP_zp4.js → 2.js-CGXIkDa5.js} +4 -4
- package/package.json +1 -1
- package/skills/dsi-add-plugin/SKILL.md +53 -0
- package/skills/dsi-add-plugin/references/allowbuilds-template.md +55 -0
- package/skills/dsi-add-plugin/references/checklist.md +98 -0
- package/skills/dsi-add-plugin/references/verification.md +67 -0
- package/template/.dsi/prompts.sqlite +0 -0
- package/template/.dsi/resources/plugins-reff.md +4 -2
- package/build/client/_app/immutable/chunks/C1F3aCiz.js +0 -2
- package/build/client/_app/immutable/chunks/CmnxnK6v.js +0 -1
- package/build/client/_app/immutable/chunks/jugX_o5s.js +0 -1
- package/build/client/_app/immutable/entry/start.CnkkMjJa.js +0 -1
- package/build/server/chunks/nodes/1.js-DJ3dsgdq.js +0 -9
- package/template/dsh-app-dev-preset/README.md +0 -69
- package/template/dsh-app-dev-preset/cordis.patch.yml +0 -219
- package/template/dsh-app-dev-preset/package.json +0 -7
- package/template/dsh-research-preset/README.md +0 -57
- package/template/dsh-research-preset/cordis.patch.yml +0 -118
- package/template/dsh-research-preset/package.json +0 -7
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Install Checklist — five gates, in order
|
|
2
|
+
|
|
3
|
+
Run top to bottom. Every command was executed live on this surface
|
|
4
|
+
(2026-10-06); the failure each step prevents is named beside it.
|
|
5
|
+
|
|
6
|
+
## 0. Classify the source
|
|
7
|
+
|
|
8
|
+
| Source | Route | Gates that apply |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| Local directory (agent-preset, bundle patch only) | link dep + manual bundles append (§4a) | 5 only — no prepare, no pnpm gate |
|
|
11
|
+
| Git-hosted repo | `dsh plugin add github:owner/repo --profile web` | 2, 3, 4, 5 |
|
|
12
|
+
| npm package | `dsh plugin add <name> --profile web` | 5 (a bare name that 404s means it is git-only) |
|
|
13
|
+
|
|
14
|
+
An agent-preset is almost always a **local link**: its bundle patch inserts a
|
|
15
|
+
`preset-*` row, and pnpm cannot install a subdirectory of a repo anyway.
|
|
16
|
+
|
|
17
|
+
## 1. Pre-flight the content (agent-presets only)
|
|
18
|
+
|
|
19
|
+
Before installing, diff the preset's `cordis.patch.yml` against the SHIPPED
|
|
20
|
+
preset of the RUNNING runtime
|
|
21
|
+
(`~/.npm/_npx/*/node_modules/@deepseek-ai/dsh-web-app/presets/*.patch.yml`):
|
|
22
|
+
|
|
23
|
+
- No row mounts a plugin the shipped presets no longer mount
|
|
24
|
+
(2026-10-06: `dsh-workflow-worker-thread` → `dsh-workflow-ptc`).
|
|
25
|
+
- Every row consuming an isolate realm sits INSIDE the group declaring it
|
|
26
|
+
(the `compaction` group owns `command-compact` + `tool-result-pruner`).
|
|
27
|
+
- Every `name:` exists in the runtime's `@deepseek-ai/` packages.
|
|
28
|
+
|
|
29
|
+
## 2. Gate: allowBuilds (profile) — git-hosted only
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
grep -n 'allowBuilds' -A 10 ~/.dsh/profiles/web/pnpm-workspace.yaml
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- The install error prints the EXACT key to add (it embeds the tarball
|
|
36
|
+
commit sha). Add it verbatim, quoted (the URL contains `:`).
|
|
37
|
+
- Also add a wildcard bet:
|
|
38
|
+
`"pkg@https://codeload.github.com/owner/**": true`.
|
|
39
|
+
- See [allowbuilds-template.md](allowbuilds-template.md).
|
|
40
|
+
|
|
41
|
+
## 3. Gate: allowBuilds (package) — git-hosted only
|
|
42
|
+
|
|
43
|
+
The tarball's prepare runs its own `pnpm install`. Fix the PACKAGE's
|
|
44
|
+
`pnpm-workspace.yaml` in its source repo, commit, push, AND mirror — the
|
|
45
|
+
push moves the tarball sha, which RE-ARMS gate 2 (add the new sha key).
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
grep -n 'set this to true' <repo>/pnpm-workspace.yaml && echo 'PLACEHOLDER FOUND'
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Placeholder text where a boolean belongs is a live trap — both homes have
|
|
52
|
+
shipped one (esbuild in DSI, node-pty in the profile).
|
|
53
|
+
|
|
54
|
+
## 4. Install
|
|
55
|
+
|
|
56
|
+
### 4a. Local directory (agent-preset)
|
|
57
|
+
|
|
58
|
+
1. Add to the profile manifest:
|
|
59
|
+
- `dependencies`: `"@local/<name>": "link:<absolute path>"`
|
|
60
|
+
- `dsh.profile.bundles`: append `"@local/<name>"` — APPEND, never let an
|
|
61
|
+
installer rewrite the array.
|
|
62
|
+
2. `cd ~/.dsh/profiles/web && pnpm install`
|
|
63
|
+
3. Confirm the link resolved: `ls node_modules/@local/<name>`
|
|
64
|
+
|
|
65
|
+
### 4b. Git-hosted / npm
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
dsh plugin add github:owner/repo --profile web
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Then **re-open the manifest** and re-append every OTHER bundle that should
|
|
72
|
+
still be mounted (gate 5). Historical clobbers: `dsh-agent-teams`,
|
|
73
|
+
`dsh-agency-agents`, `@local/dsh-app-dev-preset` all vanished this way.
|
|
74
|
+
|
|
75
|
+
## 5. Gate: D4 manifest match — after every `dsh plugin add`
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
node <rack-engine> refresh --reload
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Every reff row must come back `installed` consistent with reality, with no
|
|
82
|
+
errors. If a row says "manifest does not record a dependency matching
|
|
83
|
+
<URL>": the reff URL is a browse page (`/tree/`) or its tail does not match
|
|
84
|
+
the recorded dep. Reff lines point at repository roots.
|
|
85
|
+
|
|
86
|
+
## 6. Restart, then verify the mount
|
|
87
|
+
|
|
88
|
+
A restart is REQUIRED — the running host mounts bundles at boot only.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# offline, no restart needed:
|
|
92
|
+
dsh --profile web --dump-config | grep -n 'preset-<id>'
|
|
93
|
+
# live, after restart (see verification.md for the cookie mint):
|
|
94
|
+
POST /api/agentPresets/list → every preset: broken absent
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Only the live RPC answers for the session that resumes. `--dump-config`
|
|
98
|
+
proves composition; the RPC proves mount health.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Verification — prove the mount, not the install
|
|
2
|
+
|
|
3
|
+
Two layers: OFFLINE composition (no restart needed) and LIVE RPC (needs the
|
|
4
|
+
restarted host). The offline dump proves the tree composes; only the live RPC
|
|
5
|
+
proves the preset mounts healthy — do both.
|
|
6
|
+
|
|
7
|
+
## 1. Offline composition dump (any time)
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
dsh --profile web --dump-config 2>&1 | grep -n 'preset-<id>\|id: <preset-id>'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- Found → the bundle patch composes into the tree.
|
|
14
|
+
- Absent → the bundle is not in `dsh.profile.bundles`, or its patch failed to
|
|
15
|
+
load — check the manifest's bundles array FIRST (the clobber), then the
|
|
16
|
+
patch file.
|
|
17
|
+
|
|
18
|
+
## 2. Mint a session cookie (live RPC auth)
|
|
19
|
+
|
|
20
|
+
The launch token is kept fresh in `~/.dsi/settings.yaml` key
|
|
21
|
+
`dsh.authToken` by `scripts/dsh-web-synced.sh` (it rewrites the file each
|
|
22
|
+
time the host re-announces its URL). Exchange token → cookie:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
TOK=$(grep -A2 '^dsh:' ~/.dsi/settings.yaml | grep authToken | sed 's/.*authToken: *//')
|
|
26
|
+
C=$(curl -s -i --max-time 5 "http://127.0.0.1:3080/?token=$TOK" -D - -o /dev/null \
|
|
27
|
+
| grep -i '^set-cookie' | head -1 | sed 's/^[Ss]et-[Cc]ookie: //' | cut -d';' -f1)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
A 401 here means a stale token (host restarted without the synced script)
|
|
31
|
+
— reopen the URL `dsh web` printed, or rerun the synced launcher.
|
|
32
|
+
|
|
33
|
+
## 3. Live preset health — agentPresets/list
|
|
34
|
+
|
|
35
|
+
Wire: POST `{base}/api/{method}` with a `client-request` envelope whose
|
|
36
|
+
payload wraps ONE plain-object `args` field (gateway rejects otherwise):
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
curl -s --max-time 20 -X POST \
|
|
40
|
+
-H "Cookie: $C" -H 'content-type: application/json' \
|
|
41
|
+
-d '{"type":"client-request","rpcId":"r1","method":"agentPresets/list","payload":{"args":{}}}' \
|
|
42
|
+
http://127.0.0.1:3080/api/agentPresets/list
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
PASS: `result.ok: true` and every preset lacks a `broken` key.
|
|
46
|
+
FAIL: the preset carries `broken: "<reason>"` — that string is the root
|
|
47
|
+
cause verbatim (registry sets it at mount,
|
|
48
|
+
`dsh-agent-preset-registry/lib/index.js:517-518`). The settings badge shows
|
|
49
|
+
only a generic label; the wire keeps the reason.
|
|
50
|
+
|
|
51
|
+
Known failures and their reasons:
|
|
52
|
+
|
|
53
|
+
| broken reason | fix |
|
|
54
|
+
|---|---|
|
|
55
|
+
| `<plugin>: never started` | the plugin row names a plugin this runtime no longer starts — diff against the shipped preset, swap the row |
|
|
56
|
+
| `Preset services require isolate realms: <realm>` | move the consuming row INSIDE the group that declares the realm |
|
|
57
|
+
| (badge-only, no reason) | composition never mounted the preset — check bundles array |
|
|
58
|
+
|
|
59
|
+
## 4. Rack reconciliation (panel truth)
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
node ~/.agents/skills/dsi-plugin-rack/rack.mjs refresh --reload
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Every reff row must agree with reality (installed flag + `pkg`), zero
|
|
66
|
+
`errors`. This rewrites the snapshot cache the plugin panel reads — the UI
|
|
67
|
+
heals on its next fetch, no restart.
|
|
Binary file
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
Plugins Resources:
|
|
2
2
|
1. [superpowers-dsh](https://github.com/LayneChai/superpowers-dsh) - [LayneChai](https://github.com/LayneChai)
|
|
3
|
-
2. [
|
|
4
|
-
3. [
|
|
3
|
+
2. [deepseek-insight](https://github.com/mitmplay/deepseek-insight/tree/main/plugins) - [Wharsojoj](https://github.com/mitmplay)
|
|
4
|
+
3. [dsh-agent-teams](https://github.com/NanmiCoder/dsh-agent-teams) - [NanmiCoder](https://github.com/NanmiCoder)
|
|
5
|
+
4. [sandbase-harness](https://github.com/sandbaseai/sandbase-harness) - [sandbaseai](https://github.com/sandbaseai)
|
|
6
|
+
5. [dsh-agency-agents](https://github.com/MichengAI/dsh-agency-agents) - [MichengAI](https://github.com/MichengAI)
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{G as e,J as t,K as n,ct as r,mt as i,q as a,r as o,t as s,ut as c}from"./C-58cZAk.js";var l=class{constructor(e,t){this.status=e,this.body=typeof t==`string`?{message:t}:t||{message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}},u=class{constructor(e,t){try{new Headers({location:t})}catch{throw Error(`Invalid redirect location ${JSON.stringify(t)}: this string contains characters that cannot be used in HTTP headers`)}this.status=e,this.location=t}},d=class extends Error{constructor(e,t,n){super(n),this.status=e,this.text=t}};new URL(`sveltekit-internal://`);function f(e,t){return e===`/`||t===`ignore`?e:t===`never`?e.endsWith(`/`)?e.slice(0,-1):e:t===`always`&&!e.endsWith(`/`)?e+`/`:e}function p(e){return e.split(`%25`).map(decodeURI).join(`%25`)}function m(e){for(let t in e)e[t]=decodeURIComponent(e[t]);return e}function h({href:e}){return e.split(`#`)[0]}function g(e,t,n,r=!1){let i=new URL(e);Object.defineProperty(i,"searchParams",{value:new Proxy(i.searchParams,{get(e,r){if(r===`get`||r===`getAll`||r===`has`)return(t,...i)=>(n(t),e[r](t,...i));t();let i=Reflect.get(e,r);return typeof i==`function`?i.bind(e):i}}),enumerable:!0,configurable:!0});let a=[`href`,`pathname`,`search`,`toString`,`toJSON`];r&&a.push(`hash`);for(let n of a)Object.defineProperty(i,n,{get(){return t(),e[n]},enumerable:!0,configurable:!0});return i}function _(){}function v(...e){let t=5381;for(let n of e)if(typeof n==`string`){let e=n.length;for(;e;)t=t*33^n.charCodeAt(--e)}else if(ArrayBuffer.isView(n)){let e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),r=e.length;for(;r;)t=t*33^e[--r]}else throw TypeError(`value must be a string or TypedArray`);return(t>>>0).toString(36)}new TextEncoder;function ee(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var y=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||`GET`)!==`GET`&&b.delete(ne(e)),y(e,t));var b=new Map;function x(e,t){let n=ne(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:e,...t}=JSON.parse(r.textContent);r.getAttribute(`data-b64`)!==null&&(e=ee(e));let i=r.getAttribute(`data-ttl`);return i&&b.set(n,{body:e,init:t,ttl:1e3*Number(i)}),Promise.resolve(new Response(e,t))}return window.fetch(e,t)}function te(e,t,n){if(b.size>0){let t=ne(e,n),r=b.get(t);if(r){if(performance.now()<r.ttl&&[`default`,`force-cache`,`only-if-cached`,void 0].includes(n?.cache))return new Response(r.body,r.init);b.delete(t)}}return window.fetch(t,n)}function ne(e,t){let n=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t?.headers||t?.body){let e=[];t.headers&&e.push([...new Headers(t.headers)].join(`,`)),t.body&&(typeof t.body==`string`||ArrayBuffer.isView(t.body))&&e.push(t.body),n+=`[data-hash="${v(...e)}"]`}return n}var re=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/,ie=/^\/\((?:[^)]+)\)$/;function ae(e){let t=[];return{pattern:e===`/`||ie.test(e)?/^\/$/:RegExp(`^${se(e).map(e=>{let n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(e);if(n)return t.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),`(?:/([^]*))?`;let r=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(e);if(r)return t.push({name:r[1],matcher:r[2],optional:!0,rest:!1,chained:!0}),`(?:/([^/]+))?`;if(!e)return;let i=e.split(/\[(.+?)\](?!\])/);return`/`+i.map((e,n)=>{if(n%2){if(e.startsWith(`x+`))return le(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith(`u+`))return le(String.fromCharCode(...e.slice(2).split(`-`).map(e=>parseInt(e,16))));let[,r,a,o,s]=re.exec(e);return t.push({name:o,matcher:s,optional:!!r,rest:!!a,chained:a?n===1&&i[0]===``:!1}),a?`([^]*?)`:r?`([^/]*)?`:`([^/]+?)`}return le(e)}).join(``)}).join(``)}/?$`),params:t}}function oe(e){return e!==``&&!/^\([^)]+\)$/.test(e)}function se(e){return e.slice(1).split(`/`).filter(oe)}function ce(e,t,n){let r={},i=e.slice(1),a=i.filter(e=>e!==void 0),o=0;for(let e=0;e<t.length;e+=1){let s=t[e],c=i[e-o];if(s.chained&&s.rest&&o&&(c=i.slice(e-o,e+1).filter(e=>e).join(`/`),o=0),c===void 0){if(s.rest)c=``;else continue}if(!s.matcher||n[s.matcher](c)){r[s.name]=c;let n=t[e+1],l=i[e+1];n&&!n.rest&&n.optional&&l&&s.chained&&(o=0),!n&&!l&&Object.keys(r).length===a.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return r}function le(e){return e.normalize().replace(/[[\]]/g,`\\$&`).replace(/%/g,`%25`).replace(/\//g,`%2[Ff]`).replace(/\?/g,`%3[Ff]`).replace(/#/g,`%23`).replace(/[.*+?^${}()|\\]/g,`\\$&`)}function ue({nodes:e,server_loads:t,dictionary:n,matchers:r}){let i=new Set(t);return Object.entries(n).map(([t,[n,i,s]])=>{let{pattern:c,params:l}=ae(t),u={id:t,exec:e=>{let t=c.exec(e);if(t)return ce(t,l,r)},errors:[1,...s||[]].map(t=>e[t]),layouts:[0,...i||[]].map(o),leaf:a(n)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function a(t){let n=t<0;return n&&(t=~t),[n,e[t]]}function o(t){return t===void 0?t:[i.has(t),e[t]]}}function de(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function fe(e,t,n=JSON.stringify){let r=n(t);try{sessionStorage[e]=r}catch{}}var S=globalThis.__sveltekit_13mzflk?.base??``,pe=globalThis.__sveltekit_13mzflk?.assets??S??``,me=`1791287547811`,he=`sveltekit:snapshot`,ge=`sveltekit:scroll`,_e=`sveltekit:states`,ve=`sveltekit:pageurl`,C=`sveltekit:history`,w=`sveltekit:navigation`,T={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},ye=location.origin;function be(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){let e=document.getElementsByTagName(`base`);t=e.length?e[0].href:document.URL}return new URL(e,t)}function E(){return{x:pageXOffset,y:pageYOffset}}function D(e,t){return e.getAttribute(`data-sveltekit-${t}`)}var xe={...T,"":T.hover};function Se(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Ce(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()===`A`&&e.hasAttribute(`href`))return e;e=Se(e)}}function we(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){let e=location.hash.split(`#`)[1]||`/`;r.hash=`#${e}${r.hash}`}}catch{}let i=e instanceof SVGAElement?e.target.baseVal:e.target,a=!r||!!i||ke(r,t,n)||(e.getAttribute(`rel`)||``).split(/\s+/).includes(`external`),o=r?.origin===ye&&e.hasAttribute(`download`);return{url:r,external:a,target:i,download:o}}function Te(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=D(s,`preload-code`)),i===null&&(i=D(s,`preload-data`)),t===null&&(t=D(s,`keepfocus`)),n===null&&(n=D(s,`noscroll`)),a===null&&(a=D(s,`reload`)),o===null&&(o=D(s,`replacestate`)),s=Se(s);function c(e){switch(e){case``:case`true`:return!0;case`off`:case`false`:return!1;default:return}}return{preload_code:xe[r??`off`],preload_data:xe[i??`off`],keepfocus:c(t),noscroll:c(n),reload:c(a),replace_state:c(o)}}function Ee(e){let t=i(e),n=!0;function r(){n=!0,t.update(e=>e)}function a(e){n=!1,t.set(e)}function o(e){let r;return t.subscribe(t=>{(r===void 0||n&&t!==r)&&e(r=t)})}return{notify:r,set:a,subscribe:o}}var De={v:_};function Oe(){let{set:e,subscribe:t}=i(!1),n;async function r(){clearTimeout(n);try{let t=await fetch(`${pe}/_app/version.json`,{headers:{pragma:`no-cache`,"cache-control":`no-cache`}});if(!t.ok)return!1;let r=(await t.json()).version!==me;return r&&(e(!0),De.v(),clearTimeout(n)),r}catch{return!1}}return{subscribe:t,check:r}}function ke(e,t,n){return e.origin!==ye||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Ae(e){}var je=2**32-1,Me=je-1,Ne=Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);function Pe(e){let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null||Object.getPrototypeOf(t)===null||Object.getOwnPropertyNames(t).sort().join(`\0`)===Ne}function Fe(e){return Object.prototype.toString.call(e).slice(8,-1)}function Ie(e){return Object.getOwnPropertySymbols(e).filter(t=>Object.getOwnPropertyDescriptor(e,t).enumerable)}function Le(e){return!(!Number.isInteger(e)||e<0||e>Me)}function Re(e){return!(!Number.isInteger(e)||e<0||e>je)}function ze(e){if(e.length===0||e.length>1&&e.charCodeAt(0)===48)return!1;for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<48||n>57)return!1}return Le(+e)}function Be(e){for(var t=e.length-1;t>=0&&!ze(e[t]);t--);return t+1}function Ve(e){let t=Object.keys(e);return t.length=Be(t),t}function He(e){return Uint8Array.fromBase64(e).buffer}function Ue(e){return Uint8Array.from(Buffer.from(e,`base64`)).buffer}function We(e){let t=atob(e),n=t.length,r=new Uint8Array(n);for(let e=0;e<n;e++)r[e]=t.charCodeAt(e);return r.buffer}var Ge=typeof Uint8Array.fromBase64==`function`,Ke=typeof process==`object`&&process.versions?.node!==void 0,qe=Ge?He:Ke?Ue:We;function Je(e,t){if(!t)return e;let n={};for(let r of Object.keys(e))n[r]=t[r]??e[r];return n}var Ye=Object.freeze({kind:`not-plain`}),Xe=Object.freeze({kind:`symbol-keys`});Object.freeze({identify:e=>e,typeOf:e=>e===null?`null`:typeof e,toPrimitive:e=>e,tagOf:e=>Fe(e),isThenable:e=>typeof e.then==`function`,toPromise:e=>Promise.resolve(e),unbox:e=>e.valueOf(),toISOString:e=>isNaN(e.getDate())?``:e.toISOString(),toStringValue:e=>e.toString(),regExpInfo:e=>({source:e.source,flags:e.flags}),valuesOf:e=>e,entriesOf:e=>e,viewInfo:e=>({buffer:e.buffer,byteOffset:e.byteOffset,byteLength:e.byteLength,length:e.length,bufferByteLength:e.buffer.byteLength}),toArrayBuffer:e=>e,lengthOf:e=>e.length,hasOwn:(e,t)=>Object.hasOwn(e,t),indicesOf:e=>Ve(e),shapeOf:e=>Pe(e)?Ie(e).length>0?Xe:{kind:Object.getPrototypeOf(e)===null?`null-proto`:`plain`,keys:Object.keys(e)}:Ye,get:(e,t)=>e[t]});var Ze=Object.freeze({fromPrimitive:e=>e,fromISOString:e=>new Date(e),fromStringValue:(e,t)=>e===`URL`?new URL(t):e===`URLSearchParams`?new URLSearchParams(t):Temporal[e.slice(9)].from(t),fromArrayBuffer:e=>e,fromRegExpInfo:(e,t)=>new RegExp(e,t),fromViewInfo:(e,t,n,r)=>{let i=globalThis[e];return n===void 0?new i(t):new i(t,n,r)},box:e=>Object(e),createArray:e=>Array(e),createSparseArray:e=>{let t=[];return t[Me]=void 0,delete t[Me],t.length=e,t},createObject:()=>({}),createNullPrototypeObject:()=>Object.create(null),createSet:()=>new Set,createMap:()=>new Map,set:(e,t,n)=>{e[t]=n},addValue:(e,t)=>{e.add(t)},addEntry:(e,t,n)=>{e.set(t,n)}});function Qe(e,t,n){let r=Je(Ze,n?.operations);if(typeof e==`number`)return s(e,!0);if(!Array.isArray(e)||e.length===0)throw Error(`Invalid input`);let i=e,a=Array(i.length),o=null;function s(e,n=!1){if(e===-1)return r.fromPrimitive(void 0);if(e===-3)return r.fromPrimitive(NaN);if(e===-4)return r.fromPrimitive(1/0);if(e===-5)return r.fromPrimitive(-1/0);if(e===-6)return r.fromPrimitive(-0);if(n||typeof e!=`number`)throw Error(`Invalid input`);if(e in a)return a[e];let c=i[e];if(!c||typeof c!=`object`)a[e]=r.fromPrimitive(c);else if(Array.isArray(c)){if(typeof c[0]==`string`){let n=c[0],l=t&&Object.hasOwn(t,n)?t[n]:void 0;if(l){let t=c[1];if(typeof t!=`number`&&(t=i.push(c[1])-1),Object.hasOwn(a,t))return a[e]=l(a[t]);if(o??=new Set,o.has(t))throw Error(`Invalid circular reference`);return o.add(t),a[e]=l(s(t)),o.delete(t),a[e]}switch(n){case`Date`:a[e]=r.fromISOString(c[1]);break;case`Set`:let t=r.createSet();a[e]=t;for(let e=1;e<c.length;e+=1)r.addValue(t,s(c[e]));break;case`Map`:let o=r.createMap();a[e]=o;for(let e=1;e<c.length;e+=2)r.addEntry(o,s(c[e]),s(c[e+1]));break;case`RegExp`:a[e]=r.fromRegExpInfo(c[1],c[2]);break;case`Object`:{let t=c[1];if(typeof i[t]==`object`&&i[t][0]!==`BigInt`)throw Error(`Invalid input`);a[e]=r.box(s(t));break}case`BigInt`:a[e]=r.fromPrimitive(BigInt(c[1]));break;case`null`:let l=r.createNullPrototypeObject();a[e]=l;for(let e=1;e<c.length;e+=2){if(c[e]===`__proto__`)throw Error("Cannot parse an object with a `__proto__` property");r.set(l,c[e],s(c[e+1]))}break;case`Int8Array`:case`Uint8Array`:case`Uint8ClampedArray`:case`Int16Array`:case`Uint16Array`:case`Float16Array`:case`Int32Array`:case`Uint32Array`:case`Float32Array`:case`Float64Array`:case`BigInt64Array`:case`BigUint64Array`:case`DataView`:{if(i[c[1]][0]!==`ArrayBuffer`)throw Error(`Invalid data`);let t=s(c[1]);a[e]=r.fromViewInfo(n,t,c[2],c[3]);break}case`ArrayBuffer`:{let t=c[1];if(typeof t!=`string`)throw Error(`Invalid ArrayBuffer encoding`);a[e]=r.fromArrayBuffer(qe(t));break}case`URL`:case`URLSearchParams`:case`Temporal.Duration`:case`Temporal.Instant`:case`Temporal.PlainDate`:case`Temporal.PlainTime`:case`Temporal.PlainDateTime`:case`Temporal.PlainMonthDay`:case`Temporal.PlainYearMonth`:case`Temporal.ZonedDateTime`:a[e]=r.fromStringValue(n,c[1]);break;default:throw Error(`Unknown type ${n}`)}}else if(c[0]===-7){let t=c[1];if(!Re(t))throw Error(`Invalid input`);let n=r.createSparseArray(t);a[e]=n;for(let e=2;e<c.length;e+=2){let i=c[e];if(!Le(i)||i>=t)throw Error(`Invalid input`);r.set(n,i,s(c[e+1]))}}else{let t=r.createArray(c.length);a[e]=t;for(let e=0;e<c.length;e+=1){let n=c[e];n!==-2&&r.set(t,e,s(n))}}}else{let t=r.createObject();a[e]=t;for(let e of Object.keys(c)){if(e===`__proto__`)throw Error("Cannot parse an object with a `__proto__` property");r.set(t,e,s(c[e]))}}return a[e]}return s(0)}var $e=new Set([`load`,`prerender`,`csr`,`ssr`,`trailingSlash`,`config`]);[...$e],[...new Set([...$e])];function et(e){return e.filter(e=>e!=null)}var tt=`x-sveltekit-invalidated`,nt=`x-sveltekit-trailing-slash`;function O(e,t){return e+`/`+t}function k(e){return e instanceof l||e instanceof d?e.status:500}function rt(e){return e instanceof d?e.text:`Internal Error`}var A,j,it,at=o.toString().includes(`$$`)||/function \w+\(\) \{\}/.test(o.toString()),ot=`a:`;at?(A={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(ot)},j={current:null},it={current:!1}):(A=new class{#e=c({});get data(){return e(this.#e)}set data(e){r(this.#e,e)}#t=c(null);get form(){return e(this.#t)}set form(e){r(this.#t,e)}#n=c(null);get error(){return e(this.#n)}set error(e){r(this.#n,e)}#r=c({});get params(){return e(this.#r)}set params(e){r(this.#r,e)}#i=c({id:null});get route(){return e(this.#i)}set route(e){r(this.#i,e)}#a=c({});get state(){return e(this.#a)}set state(e){r(this.#a,e)}#o=c(-1);get status(){return e(this.#o)}set status(e){r(this.#o,e)}#s=c(new URL(ot));get url(){return e(this.#s)}set url(e){r(this.#s,e)}},j=new class{#e=c(null);get current(){return e(this.#e)}set current(e){r(this.#e,e)}},it=new class{#e=c(!1);get current(){return e(this.#e)}set current(e){r(this.#e,e)}},De.v=()=>it.current=!0);function st(e){Object.assign(A,e)}var ct=`/__data.json`,lt=`.html__data.json`;function ut(e){return e.endsWith(`.html`)?e.replace(/\.html$/,lt):e.replace(/\/$/,``)+ct}var dt={spanContext(){return ft},setAttribute(){return this},setAttributes(){return this},addEvent(){return this},setStatus(){return this},updateName(){return this},end(){return this},isRecording(){return!1},recordException(){return this},addLink(){return this},addLinks(){return this}},ft={traceId:``,spanId:``,traceFlags:0};async function*pt(e,t){let n=!1,r=``,i=new TextDecoder;for(;;){let a=r.indexOf(t);for(;a!==-1;)yield r.slice(0,a),r=r.slice(a+t.length),a=r.indexOf(t);if(n){r&&(yield r);return}let o=await e.read();n=o.done,o.value&&(r+=i.decode(o.value,{stream:!0})),n&&(r+=i.decode())}}async function*mt(e){for await(let t of pt(e,`
|
|
2
|
-
`)){let e=t.trim();e&&(yield JSON.parse(e))}}var{onMount:ht,tick:gt}=s,_t=t??(e=>e()),vt=new Set([`icon`,`shortcut icon`,`apple-touch-icon`]),M=null,N=de(`sveltekit:scroll`)??{},P=de(`sveltekit:snapshot`)??{},F={url:Ee({}),page:Ee({}),navigating:i(null),updated:Oe()};function yt(e){N[e]=E()}function bt(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;P[n];)delete P[n],n+=1}function I(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(_)}async function xt(){if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistration(S||`/`);e&&await e.update()}}var St,Ct,L,R,wt,z,Tt={},Et={},B=[],V=[],H=null;function Dt(){H?.fork?.then(e=>e?.discard()),H=null,Q={element:void 0,href:void 0}}var Ot=new Map,kt=new Set,At=new Set,U=new Set,W={branch:[],error:null,url:null,nav:null},jt=!1,Mt=!1,Nt=!0,G=!1,K=!1,Pt=!1,Ft=!1,It,q,J,Y,X=new Set,Lt=new Map,Rt=new Map;async function zt(e,t,n){if(globalThis.__sveltekit_13mzflk.data){let{q:e={},p:t={},l:n={},f:r={}}=globalThis.__sveltekit_13mzflk.data;for(let t in e)Tt[t]=e[t];for(let e in n)Tt[e]=n[e];for(let e in r)Tt[e]=r[e];for(let e in t)Et[e]=t[e]}document.URL!==location.href&&(location.href=location.href),z=e,await e.hooks.init?.(),St=ue(e),R=document.documentElement,wt=t,Ct=e.nodes[0],L=e.nodes[1],Ct(),L(),q=history.state?.[C],J=history.state?.[w],q||(q=J=Date.now(),history.replaceState({...history.state,[C]:q,[w]:J},``));let r=N[q];function i(){r&&(history.scrollRestoration=`manual`,scrollTo(r.x,r.y))}n?(i(),await _n(wt,n)):(await Z({type:`enter`,url:be(z.hash?Tn(new URL(location.href)):location.href),replace_state:!0}),i()),gn()}function Bt(){B.length=0,Ft=!1}function Vt(e){V.some(e=>e?.snapshot)&&(P[e]=V.map(e=>e?.snapshot?.capture()))}function Ht(e){P[e]?.forEach((e,t)=>{V[t]?.snapshot?.restore(e)})}function Ut(){yt(q),fe(ge,N),Vt(J),fe(he,P)}async function Wt(e,t,n,r){let i,o;t.invalidateAll&&Dt(),await Z({type:`goto`,url:be(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{if(t.invalidateAll){Ft=!0,i=new Set;for(let[e,t]of Lt)for(let[n,r]of t)r.resource?.reset(),i.add(O(e,n));o=new Set;for(let[e,t]of Rt)for(let n of t.keys())o.add(O(e,n))}t.invalidate&&t.invalidate.forEach(mn)}}),t.invalidateAll&&a().then(a).then(()=>{for(let[e,t]of Lt)for(let[n,{resource:r}]of t)i?.has(O(e,n))&&r.start();for(let[e,t]of Rt)for(let[n,{resource:r}]of t)o?.has(O(e,n))&&r.reconnect()})}async function Gt(e){if(e.id!==H?.id){Dt();let t={};X.add(t),H={id:e.id,token:t,promise:tn({...e,preload:t}).then(e=>(X.delete(t),e.type===`loaded`&&e.state.error&&Dt(),e)),fork:null}}return H.promise}async function Kt(e){let t=(await on(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(e=>e[1]()))}async function qt(e,t,n){let r={params:W.params,route:{id:W.route?.id??null},url:new URL(location.href)};if(W={...e.state,nav:r},st(e.props.page),It=new z.root({target:t,props:{...e.props,stores:F,components:V},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),n){let e={from:null,to:{...r,scroll:N[q]??E()},willUnload:!1,type:`enter`,complete:Promise.resolve()};U.forEach(t=>t(e))}Ht(J),Mt=!0}async function Jt({url:e,params:t,branch:n,errors:r,status:i,error:a,route:o,form:s}){let c=`never`;if(S&&(e.pathname===S||e.pathname===S+`/`))c=`always`;else for(let e of n)e?.slash!==void 0&&(c=e.slash);e.pathname=f(e.pathname,c),e.search=e.search;let l={type:`loaded`,state:{url:e,params:t,branch:n,error:a,route:o},props:{constructors:et(n).map(e=>e.node.component),page:wn(A)}};s!==void 0&&(l.props.form=s);let u={},d=!A,p=0;for(let e=0;e<Math.max(n.length,W.branch.length);e+=1){let t=n[e],r=W.branch[e];t?.data!==r?.data&&(d=!0),t&&(u={...u,...t.data},d&&(l.props[`data_${p}`]=u),p+=1)}return(!W.url||e.href!==W.url.href||W.error!==a||s!==void 0&&s!==A.form||d)&&(l.props.page={error:a,params:t,route:{id:o?.id??null},state:{},status:i,url:new URL(e),form:s??null,data:d?u:A.data}),l}async function Yt({loader:e,parent:t,url:n,params:r,route:i,server_data_node:a}){let o=null,s=!0,c={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},l=await e();if(l.universal?.load){function e(...e){for(let t of e){let{href:e}=new URL(t,n);c.dependencies.add(e)}}let u={tracing:{enabled:!1,root:dt,current:dt},route:new Proxy(i,{get:(e,t)=>(s&&(c.route=!0),e[t])}),params:new Proxy(r,{get:(e,t)=>(s&&c.params.add(t),e[t])}),data:a?.data??null,url:g(n,()=>{s&&(c.url=!0)},e=>{s&&c.search_params.add(e)},z.hash),async fetch(t,r){t instanceof Request&&(r={body:t.method===`GET`||t.method===`HEAD`?void 0:await t.blob(),cache:t.cache,credentials:t.credentials,headers:[...t.headers].length>0?t?.headers:void 0,integrity:t.integrity,keepalive:t.keepalive,method:t.method,mode:t.mode,redirect:t.redirect,referrer:t.referrer,referrerPolicy:t.referrerPolicy,signal:t.signal,...r});let{resolved:i,promise:a}=Xt(t,r,n);return s&&e(i.href),a},setHeaders:_,depends:e,parent(){return s&&(c.parent=!0),t()},untrack(e){s=!1;try{return e()}finally{s=!0}}};o=await l.universal.load.call(null,u)??null}return{node:l,loader:e,server:a,universal:l.universal?.load?{type:`data`,data:o,uses:c}:null,data:o??a?.data??null,slash:l.universal?.trailingSlash??a?.slash}}function Xt(e,t,n){let r=e instanceof Request?e.url:e,i=new URL(r,n);return i.origin===n.origin&&(r=i.href.slice(n.origin.length)),{resolved:i,promise:Mt?te(r,i.href,t):x(r,t)}}function Zt(e,t,n,r,i,a){if(Ft)return!0;if(!i)return!1;if(i.parent&&e||i.route&&t||i.url&&n)return!0;for(let e of i.search_params)if(r.has(e))return!0;for(let e of i.params)if(a[e]!==W.params[e])return!0;for(let e of i.dependencies)if(B.some(t=>t(new URL(e))))return!0;return!1}function Qt(e,t){return e?.type===`data`?e:e?.type===`skip`?t??null:null}function $t(e,t){if(!e)return new Set(t.searchParams.keys());let n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(let r of n){let i=e.searchParams.getAll(r),a=t.searchParams.getAll(r);i.every(e=>a.includes(e))&&a.every(e=>i.includes(e))&&n.delete(r)}return n}function en({error:e,url:t,route:n,params:r}){return{type:`loaded`,state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:wn(A),constructors:[]}}}async function tn({id:e,invalidating:t,url:n,params:r,route:i,preload:a}){if(H?.id===e)return X.delete(H.token),H.promise;let{errors:o,layouts:s,leaf:c}=i,d=[...s,c];o.forEach(e=>e?.().catch(_)),d.forEach(e=>e?.[1]().catch(_));let f=null,p=W.url?e!==cn(W.url):!1,m=W.route?i.id!==W.route.id:!1,h=$t(W.url,n),g=!1;{let t=d.map((e,t)=>{let n=W.branch[t],i=!!e?.[0]&&(n?.loader!==e[1]||Zt(g,m,p,h,n.server?.uses,r));return i&&(g=!0),i});if(t.some(Boolean)){try{f=await vn(n,t)}catch(t){let o=await $(t,{url:n,params:r,route:{id:e}});return a&&X.has(a)?en({error:o,url:n,params:r,route:i}):rn({status:k(t),error:o,url:n,route:i})}if(f.type===`redirect`)return f}}let v=f?.nodes,ee=!1,y=d.map(async(e,t)=>{if(!e)return;let a=W.branch[t],o=v?.[t];if((!o||o.type===`skip`)&&e[1]===a?.loader&&!Zt(ee,m,p,h,a.universal?.uses,r))return a;if(ee=!0,o?.type===`error`)throw o;return Yt({loader:e[1],url:n,params:r,route:i,parent:async()=>{let e={};for(let n=0;n<t;n+=1)Object.assign(e,(await y[n])?.data);return e},server_data_node:Qt(o===void 0&&e[0]?{type:`skip`}:o??null,e[0]?a?.server:void 0)})});for(let e of y)e.catch(_);let b=[];for(let e=0;e<d.length;e+=1)if(d[e])try{b.push(await y[e])}catch(t){if(t instanceof u)return{type:`redirect`,location:t.location};if(a&&X.has(a))return en({error:await $(t,{params:r,url:n,route:{id:i.id}}),url:n,params:r,route:i});let s=k(t),c;if(v?.includes(t))s=t.status??s,c=t.error;else if(t instanceof l)c=t.body;else{if(await F.updated.check())return await xt(),await I(n);c=await $(t,{params:r,url:n,route:{id:i.id}})}let d=await nn(e,b,o);return d?Jt({url:n,params:r,branch:b.slice(0,d.idx).concat(d.node),errors:o,status:s,error:c,route:i}):await un(n,{id:i.id},c,s)}else b.push(void 0);return Jt({url:n,params:r,branch:b,errors:o,status:200,error:null,route:i,form:t?void 0:null})}async function nn(e,t,n){for(;e--;)if(n[e]){let r=e;for(;!t[r];)--r;try{return{idx:r+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function rn({status:e,error:t,url:n,route:r}){let i={},a=null;if(z.server_loads[0]===0)try{let e=await vn(n,[!0]);if(e.type!==`data`||e.nodes[0]&&e.nodes[0].type!==`data`)throw 0;a=e.nodes[0]??null}catch(e){if(!(e instanceof l&&e.status===404)&&(n.origin!==ye||n.pathname!==location.pathname||jt))return await I(n)}try{return Jt({url:n,params:i,branch:[await Yt({loader:Ct,url:n,params:i,route:r,parent:()=>Promise.resolve({}),server_data_node:Qt(a)}),{node:await L(),loader:L,universal:null,server:null,data:null}],status:e,error:t,errors:[],route:null})}catch(t){if(t instanceof u){await Wt(new URL(t.location,location.href),{},0);return}let a=await z.get_error_template(),o=await $(t,{url:n,params:i,route:r}),s=a({status:e,message:String(o?.message??``).replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}),c=new DOMParser().parseFromString(s,`text/html`);throw document.documentElement.replaceChild(document.adoptNode(c.head),document.head),document.documentElement.replaceChild(document.adoptNode(c.body),document.body),t}}async function an(e){let t=e.href;if(Ot.has(t))return Ot.get(t);let n;try{let r=(async()=>{let t=await z.hooks.reroute({url:new URL(e),fetch:async(t,n)=>Xt(t,n,e).promise})??e;if(typeof t==`string`){let n=new URL(e);z.hash?n.hash=t:n.pathname=t,t=n}return t})();Ot.set(t,r),n=await r}catch{Ot.delete(t);return}return n}async function on(e,t){if(e&&!ke(e,S,z.hash)){let n=await an(e);if(!n)return;let r=sn(n);for(let n of St){let i=n.exec(r);if(i)return{id:cn(e),invalidating:t,route:n,params:m(i),url:e}}}}function sn(e){return p(z.hash?e.hash.replace(/^#/,``).replace(/[?#].+/,``):e.pathname.slice(S.length))||`/`}function cn(e){return(z.hash?e.hash.replace(/^#/,``):e.pathname)+e.search}function ln({url:e,type:t,intent:n,delta:r,event:i,scroll:a}){let o=!1,s=Cn(W,n,e,t,a??null);r!==void 0&&(s.navigation.delta=r),i!==void 0&&(s.navigation.event=i);let c={...s.navigation,cancel:()=>{o=!0,s.reject(Error(`navigation cancelled`))}};return G||kt.forEach(e=>e(c)),o?null:s}async function Z({type:e,url:t,popped:r,keepfocus:i,noscroll:o,replace_state:s,state:c={},redirect_count:l=0,nav_token:u={},accept:f=_,block:p=_,event:m}){let h=Y;Y=u;let g=await on(t,!1),v=e===`enter`?Cn(W,g,t,e):ln({url:t,type:e,delta:r?.delta,intent:g,scroll:r?.scroll,event:m});if(!v){p(),Y===u&&(Y=h);return}let ee=q,y=J;f(),G=!0,Mt&&v.navigation.type!==`enter`&&F.navigating.set(j.current=v.navigation);let b=g&&await tn(g);if(!b){if(ke(t,S,z.hash))return await I(t,s);b=await un(t,{id:null},await $(new d(404,`Not Found`,`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,s)}if(t=g?.url||t,Y!==u){v.reject(Error(`navigation aborted`));return}if(!b)return;if(b.type===`redirect`){if(l<20){await Z({type:e,url:new URL(b.location,t),popped:r,keepfocus:i,noscroll:o,replace_state:s,state:c,redirect_count:l+1,nav_token:u}),v.fulfil(void 0);return}if(b=await rn({status:500,error:await $(Error(`Redirect loop`),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}}),!b)return}else if(b.props.page.status>=400&&await F.updated.check())return await xt(),await I(t,s);if(Bt(),yt(ee),Vt(y),b.props.page.url.pathname!==t.pathname&&(t.pathname=b.props.page.url.pathname),c=r?r.state:c,!r){let e=+!s,n={[C]:q+=e,[w]:J+=e,[_e]:c};(s?history.replaceState:history.pushState).call(history,n,``,t),s||bt(q,J)}let x=g&&H?.id===g.id?H.fork:null;H?.fork&&!x?Dt():(H=null,Q={element:void 0,href:void 0}),b.props.page.state=c;let te;if(Mt){let e=(await Promise.all(Array.from(At,e=>e(v.navigation)))).filter(e=>typeof e==`function`);if(e.length>0){function t(){e.forEach(e=>{U.delete(e)})}e.push(t),e.forEach(e=>{U.add(e)})}let r=v.navigation.to;W={...b.state,nav:{params:r.params,route:r.route,url:r.url}},b.props.page&&(b.props.page.url=t),!i&&document.activeElement instanceof HTMLElement&&document.activeElement!==document.body&&document.activeElement.blur();let a=x&&await x;a?te=a.commit():(M=null,It.$set(b.props),M&&Object.assign(b.props.page,M),st(b.props.page),te=n?.()),Pt=!0}else await qt(b,wt,!1);let{activeElement:ne}=document;if(await te,await a(),await a(),Y!==u){v.reject(Error(`navigation aborted`));return}b.props.page&&M&&Object.assign(b.props.page,M);let re=null;if(Nt){let e=r?r.scroll:o?E():null;e?scrollTo(e.x,e.y):(re=t.hash&&document.getElementById(En(t)))?re.scrollIntoView():scrollTo(0,0)}let ie=document.activeElement!==ne&&document.activeElement!==document.body;!i&&!ie&&Sn(t,!re),Nt=!0,G=!1,v.fulfil(void 0),v.navigation.to&&(v.navigation.to.scroll=E()),U.forEach(e=>e(v.navigation)),e===`popstate`&&Ht(J),F.navigating.set(j.current=null)}async function un(e,t,n,r,i){return e.origin===ye&&e.pathname===location.pathname&&!jt?await rn({status:r,error:n,url:e,route:t}):await I(e,i)}var Q={element:void 0,href:void 0};function dn(){let e,t;R.addEventListener(`mousemove`,t=>{let n=t.target;clearTimeout(e),e=setTimeout(()=>{i(n,T.hover)},20)});function n(e){e.defaultPrevented||i(e.composedPath()[0],T.tap)}R.addEventListener(`mousedown`,n),R.addEventListener(`touchstart`,n,{passive:!0});let r=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&(Kt(new URL(t.target.href)),r.unobserve(t.target))},{threshold:0});async function i(e,n){let r=Ce(e,R),i=r===Q.element&&r?.href===Q.href&&n>=t;if(!r||i)return;let{url:a,external:o,download:s}=we(r,S,z.hash);if(o||s)return;let c=Te(r),l=a&&cn(W.url)===cn(a);if(!(c.reload||l)){if(n<=c.preload_data){Q={element:r,href:r.href},t=T.tap;let e=await on(a,!1);if(!e)return;Gt(e)}else n<=c.preload_code&&(Q={element:r,href:r.href},t=n,Kt(a))}}function a(){r.disconnect();for(let e of R.querySelectorAll(`a`)){let{url:t,external:n,download:i}=we(e,S,z.hash);if(n||i)continue;let a=Te(e);a.reload||(a.preload_code===T.viewport&&r.observe(e),a.preload_code===T.eager&&Kt(t))}}U.add(a),a()}function $(e,t){if(e instanceof l)return e.body;let n=k(e),r=rt(e);return z.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function fn(e,t){ht(()=>(e.add(t),()=>{e.delete(t)}))}function pn(e){fn(U,e)}function mn(e){if(typeof e==`function`)B.push(e);else{let{href:t}=new URL(e,location.href);B.push(e=>e.href===t)}}function hn(e,t){let n={[C]:q,[w]:J,[ve]:A.url.href,[_e]:t};history.replaceState(n,``,be(e)),A.state=t,It.$set({page:_t(()=>wn(A))})}function gn(){history.scrollRestoration=`manual`,addEventListener(`beforeunload`,e=>{let t=!1;if(Ut(),!G){let e=Cn(W,void 0,null,`leave`),n={...e.navigation,cancel:()=>{t=!0,e.reject(Error(`navigation cancelled`))}};kt.forEach(e=>e(n))}t?(e.preventDefault(),e.returnValue=``):history.scrollRestoration=`auto`}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&Ut()}),navigator.connection?.saveData||dn(),R.addEventListener(`click`,async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;let n=Ce(t.composedPath()[0],R);if(!n)return;let{url:r,external:i,target:a,download:o}=we(n,S,z.hash);if(!r)return;if(a===`_parent`||a===`_top`){if(window.parent!==window)return}else if(a&&a!==`_self`)return;let s=Te(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&r.protocol!==`https:`&&r.protocol!==`http:`||o)return;let[c,l]=(z.hash?r.hash.replace(/^#/,``):r.href).split(`#`),u=c===h(location);if(i||s.reload&&(!u||!l)){ln({url:r,type:`link`,event:t})?G=!0:t.preventDefault();return}if(l!==void 0&&u){let[,i]=W.url.href.split(`#`);if(i===l){if(t.preventDefault(),l===``||l===`top`&&n.ownerDocument.getElementById(`top`)===null)scrollTo({top:0});else{let e=n.ownerDocument.getElementById(decodeURIComponent(l));e&&(e.scrollIntoView(),e.focus())}return}if(K=!0,yt(q),e(r),!s.replace_state)return;K=!1}t.preventDefault(),await new Promise(e=>{requestAnimationFrame(()=>{setTimeout(e,0)}),setTimeout(e,100)}),await Z({type:`link`,url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:t})}),R.addEventListener(`submit`,e=>{if(e.defaultPrevented)return;let t=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if((n?.formTarget||t.target)===`_blank`||(n?.formMethod||t.method)!==`get`)return;let r=new URL(n?.hasAttribute(`formaction`)&&n?.formAction||t.action);if(ke(r,S,!1))return;let i=e.target,a=Te(i);if(a.reload)return;e.preventDefault(),e.stopPropagation();let o=new FormData(i,n);r.search=new URLSearchParams(o).toString(),Z({type:`form`,url:r,keepfocus:a.keepfocus,noscroll:a.noscroll,replace_state:a.replace_state??r.href===location.href,event:e})}),addEventListener(`popstate`,async t=>{if(!xn){if(t.state?.[`sveltekit:history`]){let n=t.state[C];if(Y={},n===q)return;let r=N[n],i=t.state[`sveltekit:states`]??{},a=new URL(t.state[`sveltekit:pageurl`]??location.href),o=t.state[w],s=W.url?h(location)===h(W.url):!1;if(o===J&&(Pt||s)){i!==A.state&&(A.state=i),e(a),N[q]=E(),r&&scrollTo(r.x,r.y),q=n;return}let c=n-q;await Z({type:`popstate`,url:a,popped:{state:i,scroll:r,delta:c},accept:()=>{q=n,J=o},block:()=>{history.go(-c)},nav_token:Y,event:t})}else K||(e(new URL(location.href)),z.hash&&location.reload())}}),addEventListener(`hashchange`,()=>{K&&(K=!1,history.replaceState({...history.state,[C]:++q,[w]:J},``,location.href))});for(let e of document.querySelectorAll(`link`))vt.has(e.rel)&&(e.href=e.href);addEventListener(`pageshow`,e=>{e.persisted&&F.navigating.set(j.current=null)});function e(e){W.url=A.url=e,F.page.set(wn(A)),F.page.notify()}}async function _n(e,{status:t=200,error:n,node_ids:r,params:i,route:a,server_route:o,data:s,form:c}){jt=!0;let l=new URL(location.href),d;({params:i={},route:a={id:null}}=await on(l,!1)||{}),d=St.find(({id:e})=>e===a.id);let f,p=!0;try{let e=r.map(async(t,n)=>{let r=s[n];return r?.uses&&(r.uses=bn(r.uses)),Yt({loader:z.nodes[t],url:l,params:i,route:a,parent:async()=>{let t={};for(let r=0;r<n;r+=1)Object.assign(t,(await e[r]).data);return t},server_data_node:Qt(r)})}),o=await Promise.all(e);if(d){let e=d.layouts;for(let t=0;t<e.length;t++)e[t]||o.splice(t,0,void 0)}f=await Jt({url:l,params:i,branch:o,status:t,error:n,errors:d?.errors,form:c,route:d??null})}catch(t){if(t instanceof u)return await I(new URL(t.location,location.href));f=await rn({status:k(t),error:await $(t,{url:l,params:i,route:a}),url:l,route:a}),e.textContent=``,p=!1}f&&(f.props.page&&(f.props.page.state={}),await qt(f,e,p))}async function vn(e,t){let n=new URL(e);n.pathname=ut(e.pathname),e.pathname.endsWith(`/`)&&n.searchParams.append(nt,`1`),n.searchParams.append(tt,t.map(e=>e?`1`:`0`).join(``));let r=await(0,window.fetch)(n.href,{});if(!r.ok){let e;throw r.headers.get(`content-type`)?.includes(`application/json`)?e=await r.json():r.status===404?e=`Not Found`:r.status===500&&(e=`Internal Error`),new l(r.status,e)}return new Promise((e,t)=>{yn(e,r).catch(t)})}async function yn(e,t){let n=t.body.getReader(),r=new Map;function i(e){return Qe(e,{...z.decoders,Promise:e=>new Promise((t,n)=>{r.set(e,{fulfil:t,reject:n})})})}for await(let t of mt(n)){if(t.type===`redirect`)return e(t);if(t.type===`data`)t.nodes?.forEach(e=>{e?.type===`data`&&(e.uses=bn(e.uses),e.data=i(e.data))}),e(t);else if(t.type===`chunk`){let{id:e,data:n,error:a}=t,o=r.get(e);r.delete(e),a?o.reject(i(a)):o.fulfil(i(n))}}}function bn(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}var xn=!1;function Sn(e,t=!0){let n=document.querySelector(`[autofocus]`);if(n)n.focus();else{let n=En(e);if(n&&document.getElementById(n)){let{x:r,y:i}=E();setTimeout(()=>{let a=history.state;xn=!0,location.replace(new URL(`#${n}`,location.href)),history.replaceState(a,``,e),t&&scrollTo(r,i),xn=!1})}else{let e=document.body,t=e.getAttribute(`tabindex`);e.tabIndex=-1,e.focus({preventScroll:!0,focusVisible:!1}),t===null?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,t)}let r=getSelection();if(r&&r.type!==`None`){let e=[];for(let t=0;t<r.rangeCount;t+=1)e.push(r.getRangeAt(t));setTimeout(()=>{if(r.rangeCount===e.length){for(let t=0;t<r.rangeCount;t+=1){let n=e[t],i=r.getRangeAt(t);if(n.commonAncestorContainer!==i.commonAncestorContainer||n.startContainer!==i.startContainer||n.endContainer!==i.endContainer||n.startOffset!==i.startOffset||n.endOffset!==i.endOffset)return}r.removeAllRanges()}})}}}function Cn(e,t,n,r,i=null){let a,o,s=new Promise((e,t)=>{a=e,o=t});return s.catch(_),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:E()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:i},willUnload:!t,type:r,complete:s},fulfil:a,reject:o}}function wn(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Tn(e){let t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function En(e){let t;if(z.hash){let[,,n]=e.hash.split(`#`,3);t=n??``}else t=e.hash.slice(1);return decodeURIComponent(t)}export{A as a,j as i,hn as n,Ae as o,zt as r,pn as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{H as e}from"../nodes/2.BBV-AGuB.js";export{e as startPanelResize};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"../nodes/2.BBV-AGuB.js";export{e as stringify};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e,r as t}from"../chunks/C1F3aCiz.js";export{e as load_css,t as start};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
const index = 1;
|
|
2
|
-
let component_cache;
|
|
3
|
-
const component = async () => component_cache ??= (await import('../entries/pages/_error.svelte.js-BXeIuPj-.js')).default;
|
|
4
|
-
const imports = ["_app/immutable/nodes/1.E4wiL8sP.js","_app/immutable/chunks/C-58cZAk.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/UkmEG9Ws.js","_app/immutable/chunks/C1F3aCiz.js","_app/immutable/chunks/DlfWhx6l.js"];
|
|
5
|
-
const stylesheets = [];
|
|
6
|
-
const fonts = [];
|
|
7
|
-
|
|
8
|
-
export { component, fonts, imports, index, stylesheets };
|
|
9
|
-
//# sourceMappingURL=1.js-DJ3dsgdq.js.map
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
# dsh-app-dev-preset — agent-preset bundle template
|
|
2
|
-
|
|
3
|
-
A starting point for a **user agent-preset bundle** for DeepSeek Harness
|
|
4
|
-
(DSH). (An *agent preset* is a recipe for one kind of agent; in DSI it appears as
|
|
5
|
-
a button in the session filter row.) Copy it, rename the identity, register it on the host profile, restart.
|
|
6
|
-
Full mechanics: `dev/kb/agent-presets/2026-10-06 - The Preset Bundle — Author,
|
|
7
|
-
Register, Remove an Agent Preset.md`. Decision record: ADR-0015 (2026-10-06).
|
|
8
|
-
|
|
9
|
-
## Files
|
|
10
|
-
|
|
11
|
-
- `package.json` — bundle manifest; `dsh.bundle.patch` points the loader at
|
|
12
|
-
the patch file. Rename `name` to `@local/dsh-<my-id>-preset`.
|
|
13
|
-
- `cordis.patch.yml` — inserts the preset row (`id`, `name`, `description`,
|
|
14
|
-
`order`) plus the agent-plane plugin composition (persona, tools, skills,
|
|
15
|
-
goals, plan mode, subagents, workflows, web).
|
|
16
|
-
|
|
17
|
-
## 1. Copy the template
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
cp -R ~/agentic-ai/deepseek-insight/template/dsh-app-dev-preset ~/agentic-ai/<my-id>-preset
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Then in the copy:
|
|
24
|
-
|
|
25
|
-
1. `package.json`: set `"name": "@local/dsh-<my-id>-preset"`.
|
|
26
|
-
2. `cordis.patch.yml`: change the insert row —
|
|
27
|
-
- `id: preset-<my-id>` (entry id),
|
|
28
|
-
- `config.id: <my-id>` (the preset id DSI filters on),
|
|
29
|
-
- `config.name` / `config.description` (roster copy),
|
|
30
|
-
- `config.order` (roster sort; shipped `standard`-class presets sit low).
|
|
31
|
-
3. Trim or keep the `plugins:` list. **Realm rule:** any row consuming
|
|
32
|
-
`compaction` / `toolResultPruner` (or publishing a process-global
|
|
33
|
-
service) must sit inside the matching `cordis:group` with `isolate:` —
|
|
34
|
-
loose rows fail the mount audit (*The Preset That Waited*, 2026-09-12).
|
|
35
|
-
|
|
36
|
-
## 2. Register on the host
|
|
37
|
-
|
|
38
|
-
Edit `~/.dsh/profiles/web/package.json` and add the dependency plus its
|
|
39
|
-
`link:` specifier (mirroring how `@local/dsh-app-dev-preset` is wired):
|
|
40
|
-
|
|
41
|
-
```json
|
|
42
|
-
"dependencies": {
|
|
43
|
-
"@local/dsh-<my-id>-preset": "link:/Users/wharsojo/agentic-ai/<my-id>-preset"
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Then:
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
cd ~/.dsh/profiles/web && pnpm install
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Restart `dsh web` — the registry is populated at boot; there is no watcher.
|
|
54
|
-
|
|
55
|
-
## 3. Remove
|
|
56
|
-
|
|
57
|
-
1. Delete the `@local/dsh-<my-id>-preset` entries from
|
|
58
|
-
`~/.dsh/profiles/web/package.json`.
|
|
59
|
-
2. `cd ~/.dsh/profiles/web && pnpm install`.
|
|
60
|
-
3. Restart `dsh web`; delete the bundle directory if desired.
|
|
61
|
-
|
|
62
|
-
Do **not** bother with `~/.dsh/.agent-presets/<id>/` — that legacy directory
|
|
63
|
-
is not read by anything any more.
|
|
64
|
-
|
|
65
|
-
## The prompt part
|
|
66
|
-
|
|
67
|
-
The only prompt text in the bundle is the `persona` row's `config.prefix`
|
|
68
|
-
(`{{model}}` / `{{cwd}}` resolve per session). Everything else is plugin
|
|
69
|
-
composition — capability, not wording.
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
- insert:
|
|
2
|
-
- id: preset-app-dev
|
|
3
|
-
name: '@deepseek-ai/dsh-agent-preset'
|
|
4
|
-
config:
|
|
5
|
-
id: app-dev
|
|
6
|
-
name: App Dev
|
|
7
|
-
description: >-
|
|
8
|
-
Full application-development agent: bash, file edit/search, skills, plan mode, goals, subagents, workflows, and web lookup, with a build-and-verify persona.
|
|
9
|
-
order: 10
|
|
10
|
-
plugins:
|
|
11
|
-
# The `app-dev` agent preset: a full-capability application developer.
|
|
12
|
-
#
|
|
13
|
-
# Same tool stack as the shipped `standard` preset (bash/pwsh, filesystem edit
|
|
14
|
-
# and search, skills, goals, plan mode, subagents, workflows, web, todo, ask),
|
|
15
|
-
# with a persona specialized for building and shipping applications.
|
|
16
|
-
#
|
|
17
|
-
# AGENT-PLANE composition: mounted once per process under a standing scope;
|
|
18
|
-
# sessions naming it join by scope parentage. Host plane keeps the registries,
|
|
19
|
-
# sandbox, approval stack, persistence, and the model route. Service rows MUST
|
|
20
|
-
# sit inside a group carrying an `isolate` realm (entry-local private instance)
|
|
21
|
-
# or `dsh-agent-presets` rejects the mount.
|
|
22
|
-
|
|
23
|
-
# ── identity ────────────────────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
# This preset's persona, shadowing the deployment default for joined agents.
|
|
26
|
-
# `{{model}}` and `{{cwd}}` resolve from the agent's own route and workspace.
|
|
27
|
-
- id: persona
|
|
28
|
-
name: '@deepseek-ai/dsh-persona'
|
|
29
|
-
config:
|
|
30
|
-
prefix: >-
|
|
31
|
-
You are app-dev, an application development agent powered by the {{model}} model.
|
|
32
|
-
Your working directory is {{cwd}}.
|
|
33
|
-
|
|
34
|
-
You build, debug, and ship software end to end. Prefer existing patterns
|
|
35
|
-
and dependencies over new machinery; keep changes minimal and reviewed.
|
|
36
|
-
Verify work by running code, tests, and typechecks before claiming done.
|
|
37
|
-
When a task spans many steps, write a plan first, track it with todos,
|
|
38
|
-
and delegate isolated read-only investigation to subagents.
|
|
39
|
-
|
|
40
|
-
Prefer one program over consecutive programs. When the next planned
|
|
41
|
-
run_code needs no decision that depends on seeing the previous program's
|
|
42
|
-
uncondensed result, batch the steps into a single program and chain them
|
|
43
|
-
with variables. Split only when a stage's outcome must re-enter your
|
|
44
|
-
reasoning, or when the combined program would exceed the timeout (then
|
|
45
|
-
use a background job).
|
|
46
|
-
|
|
47
|
-
When a program enumerates files or targets, cover the full symmetric
|
|
48
|
-
set in that one program; use try/catch fallbacks for missing members
|
|
49
|
-
instead of follow-up probes.
|
|
50
|
-
|
|
51
|
-
- id: agent-instructions
|
|
52
|
-
name: '@deepseek-ai/dsh-agent-instructions'
|
|
53
|
-
config:
|
|
54
|
-
maxBytes: 65536
|
|
55
|
-
|
|
56
|
-
# ── shell ───────────────────────────────────────────────────────────────────
|
|
57
|
-
|
|
58
|
-
# One-shot shell tools; executors (bash-sandbox/pwsh-sandbox) stay host-plane.
|
|
59
|
-
- id: tool-bash
|
|
60
|
-
name: '@deepseek-ai/dsh-tool-bash'
|
|
61
|
-
disabled: !!js process.platform === 'win32'
|
|
62
|
-
|
|
63
|
-
- id: tool-pwsh
|
|
64
|
-
name: '@deepseek-ai/dsh-tool-pwsh'
|
|
65
|
-
disabled: !!js process.platform !== 'win32'
|
|
66
|
-
|
|
67
|
-
# ── filesystem ──────────────────────────────────────────────────────────────
|
|
68
|
-
|
|
69
|
-
# Both register into the host `tools` registry and provide nothing: no realm.
|
|
70
|
-
- id: tool-fs
|
|
71
|
-
name: '@deepseek-ai/dsh-tool-fs'
|
|
72
|
-
|
|
73
|
-
- id: tool-fs-search
|
|
74
|
-
name: '@deepseek-ai/dsh-tool-fs-search'
|
|
75
|
-
config:
|
|
76
|
-
sampleOverCapGlobResults: false
|
|
77
|
-
|
|
78
|
-
# ── background jobs ────────────────────────────────────────────────────────
|
|
79
|
-
|
|
80
|
-
# Model-facing controls only; the task registry stays on the host plane.
|
|
81
|
-
- id: tool-jobs
|
|
82
|
-
name: '@deepseek-ai/dsh-tool-jobs'
|
|
83
|
-
|
|
84
|
-
# ── skills ──────────────────────────────────────────────────────────────────
|
|
85
|
-
|
|
86
|
-
- id: skill-filesystem
|
|
87
|
-
name: '@deepseek-ai/dsh-skill-filesystem'
|
|
88
|
-
|
|
89
|
-
- id: tool-skill
|
|
90
|
-
name: '@deepseek-ai/dsh-tool-skill'
|
|
91
|
-
|
|
92
|
-
# ── goals ───────────────────────────────────────────────────────────────────
|
|
93
|
-
|
|
94
|
-
- id: tool-goal
|
|
95
|
-
name: '@deepseek-ai/dsh-tool-goal'
|
|
96
|
-
|
|
97
|
-
# ── plan mode ───────────────────────────────────────────────────────────────
|
|
98
|
-
|
|
99
|
-
# Plan state is per-agent by nature: entry-local realm is the correct lifetime.
|
|
100
|
-
- id: planning
|
|
101
|
-
name: cordis:group
|
|
102
|
-
group: true
|
|
103
|
-
isolate:
|
|
104
|
-
planMode: true
|
|
105
|
-
config:
|
|
106
|
-
- id: plan-mode
|
|
107
|
-
name: '@deepseek-ai/dsh-plan-mode'
|
|
108
|
-
config:
|
|
109
|
-
section: |
|
|
110
|
-
You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
|
|
111
|
-
|
|
112
|
-
Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
|
|
113
|
-
|
|
114
|
-
The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
|
|
115
|
-
|
|
116
|
-
Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
|
|
117
|
-
|
|
118
|
-
Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
|
|
119
|
-
|
|
120
|
-
When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed to implementation.
|
|
121
|
-
|
|
122
|
-
# ── compaction ──────────────────────────────────────────────────────────────
|
|
123
|
-
|
|
124
|
-
# compaction-basic reads toolResultPrune through ctx.get: same realm.
|
|
125
|
-
# command-compact and the pruner live INSIDE the group — 0.2.1.x rejects
|
|
126
|
-
# preset rows that consume an isolate realm from outside it.
|
|
127
|
-
- id: compaction
|
|
128
|
-
name: cordis:group
|
|
129
|
-
group: true
|
|
130
|
-
isolate:
|
|
131
|
-
compaction: true
|
|
132
|
-
toolResultPruner: true
|
|
133
|
-
config:
|
|
134
|
-
- id: compaction-basic
|
|
135
|
-
name: '@deepseek-ai/dsh-compaction-basic'
|
|
136
|
-
|
|
137
|
-
- id: command-compact
|
|
138
|
-
name: '@deepseek-ai/dsh-command-compact'
|
|
139
|
-
|
|
140
|
-
- id: tool-result-pruner
|
|
141
|
-
name: '@deepseek-ai/dsh-compaction-tool-result-pruner'
|
|
142
|
-
config:
|
|
143
|
-
thresholdChars: 8192
|
|
144
|
-
headChars: 4096
|
|
145
|
-
tailChars: 1024
|
|
146
|
-
|
|
147
|
-
# ── delegation and workflows ────────────────────────────────────────────────
|
|
148
|
-
|
|
149
|
-
# The subagents registry and spawn/fork backends stay host-plane; this preset
|
|
150
|
-
# contributes the delegation tools. Workflows share one entry-local realm.
|
|
151
|
-
- id: delegation
|
|
152
|
-
name: cordis:group
|
|
153
|
-
group: true
|
|
154
|
-
isolate:
|
|
155
|
-
workflowEngine: true
|
|
156
|
-
config:
|
|
157
|
-
- id: tool-subagent-control
|
|
158
|
-
name: '@deepseek-ai/dsh-tool-subagent-control'
|
|
159
|
-
|
|
160
|
-
- id: tool-subagent-list-agents
|
|
161
|
-
name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
|
|
162
|
-
|
|
163
|
-
- id: tool-subagent
|
|
164
|
-
name: '@deepseek-ai/dsh-tool-subagent'
|
|
165
|
-
config:
|
|
166
|
-
provider: spawn
|
|
167
|
-
toolName: subagent
|
|
168
|
-
backgroundMode: continuable
|
|
169
|
-
|
|
170
|
-
- id: tool-subagent-fork
|
|
171
|
-
name: '@deepseek-ai/dsh-tool-subagent'
|
|
172
|
-
config:
|
|
173
|
-
provider: fork
|
|
174
|
-
toolName: subagent_fork
|
|
175
|
-
backgroundMode: continuable
|
|
176
|
-
|
|
177
|
-
- id: workflow-ptc
|
|
178
|
-
name: '@deepseek-ai/dsh-workflow-ptc'
|
|
179
|
-
config:
|
|
180
|
-
provider: spawn
|
|
181
|
-
|
|
182
|
-
- id: tool-workflow
|
|
183
|
-
name: '@deepseek-ai/dsh-tool-workflow'
|
|
184
|
-
|
|
185
|
-
- id: tool-ralph
|
|
186
|
-
name: '@deepseek-ai/dsh-tool-ralph'
|
|
187
|
-
config:
|
|
188
|
-
subagentProvider: spawn
|
|
189
|
-
maxRounds: 64
|
|
190
|
-
|
|
191
|
-
# ── remaining model-facing rows ─────────────────────────────────────────────
|
|
192
|
-
|
|
193
|
-
- id: tool-ask-user
|
|
194
|
-
name: '@deepseek-ai/dsh-tool-ask-user'
|
|
195
|
-
|
|
196
|
-
- id: tool-todo
|
|
197
|
-
name: '@deepseek-ai/dsh-tool-todo'
|
|
198
|
-
config:
|
|
199
|
-
allowParallelInProgress: true
|
|
200
|
-
|
|
201
|
-
# The web service and its search provider stay in the host composition; only
|
|
202
|
-
# the model-facing tool is per-session. Docs lookup for developers.
|
|
203
|
-
- id: tool-web
|
|
204
|
-
name: '@deepseek-ai/dsh-tool-web'
|
|
205
|
-
config:
|
|
206
|
-
fetch: false
|
|
207
|
-
searchTimeoutMs: 60000
|
|
208
|
-
|
|
209
|
-
# ── presentation ────────────────────────────────────────────────────────────
|
|
210
|
-
|
|
211
|
-
# PTC mode for this agent alone — the run_code front door (one callable tool;
|
|
212
|
-
# every other tool reaches the model only as tools.name(...) sub-calls inside
|
|
213
|
-
# a program). The row waits for the host's codeRuntime rather than assuming
|
|
214
|
-
# it: a deployment that composes no TypeScript runtime fails this preset at
|
|
215
|
-
# mount, naming this id, instead of at the first request.
|
|
216
|
-
- id: tool-presentation
|
|
217
|
-
name: '@deepseek-ai/dsh-agent-tool-presentation'
|
|
218
|
-
config:
|
|
219
|
-
mode: ptc
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# dsh-research-preset — agent-preset bundle template (read-only research agent)
|
|
2
|
-
|
|
3
|
-
A **user agent-preset bundle** for DeepSeek Harness (DSH) in the current
|
|
4
|
-
(new-format) bundle shape: `package.json` + `cordis.patch.yml`. The legacy
|
|
5
|
-
`preset.yml` + `agent.cordis.yml` pair this folder once carried is retired —
|
|
6
|
-
nothing reads that format any more; see
|
|
7
|
-
`dev/kb/agent-presets/2026-10-06 - The Preset Bundle….md` for the full
|
|
8
|
-
story, and `../dsh-app-dev-preset/` for the sibling application-developer
|
|
9
|
-
template.
|
|
10
|
-
|
|
11
|
-
## What this preset is
|
|
12
|
-
|
|
13
|
-
**Research** — a deliberately tool-poor, read-only investigation agent:
|
|
14
|
-
web search, codebase search/read, skills, todos, goals, compaction for long
|
|
15
|
-
sessions. **No shell, no file editing, no plan mode, no subagents.** When a
|
|
16
|
-
task needs those, its persona says so and recommends the `app-dev` or
|
|
17
|
-
`main` agent.
|
|
18
|
-
|
|
19
|
-
## 1. Copy and rename
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
cp -R ~/agentic-ai/deepseek-insight/template/dsh-research-preset ~/agentic-ai/<my-id>-preset
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Then in the copy:
|
|
26
|
-
|
|
27
|
-
1. `package.json`: `"name": "@local/dsh-<my-id>-preset"`.
|
|
28
|
-
2. `cordis.patch.yml` insert row:
|
|
29
|
-
- `id: preset-<my-id>`, `config.id: <my-id>`,
|
|
30
|
-
- `config.name` / `config.description` (roster copy),
|
|
31
|
-
- `config.order` (research sits at 20; app-dev at 10),
|
|
32
|
-
- `config.plugins` — trim to the tools your agent should have. The
|
|
33
|
-
**realm rule**: rows consuming `compaction`/`toolResultPruner` (or
|
|
34
|
-
publishing process-global services) must stay inside the
|
|
35
|
-
`cordis:group` with the matching `isolate:`, or the mount audit
|
|
36
|
-
rejects the preset (*The Preset That Waited*, 2026-09-12).
|
|
37
|
-
|
|
38
|
-
The prompt lives in one place: the `persona` row's `config.prefix`
|
|
39
|
-
(`{{model}}` / `{{cwd}}` resolve per session). Roster metadata is never
|
|
40
|
-
prompt text.
|
|
41
|
-
|
|
42
|
-
## 2. Register
|
|
43
|
-
|
|
44
|
-
```json
|
|
45
|
-
"dependencies": {
|
|
46
|
-
"@local/dsh-<my-id>-preset": "link:/Users/wharsojo/agentic-ai/<my-id>-preset"
|
|
47
|
-
}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
in `~/.dsh/profiles/web/package.json`, then
|
|
51
|
-
`cd ~/.dsh/profiles/web && pnpm install` and **restart `dsh web`** (the
|
|
52
|
-
registry is populated at boot; there is no watcher).
|
|
53
|
-
|
|
54
|
-
## 3. Remove
|
|
55
|
-
|
|
56
|
-
Delete the dependency entries from the profile `package.json`,
|
|
57
|
-
`pnpm install`, restart the host. Folder deletion alone does nothing.
|