@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.
Files changed (46) hide show
  1. package/.agents/skills/dsi-ov-setup/SKILL.md +134 -0
  2. package/.agents/skills/dsi-plugin-rack/rack.d.mts +35 -0
  3. package/.agents/skills/dsi-plugin-rack/rack.mjs +168 -26
  4. package/build/client/_app/immutable/assets/{2.BGqV97Jd.css → 2.BuaCdYrs.css} +1 -1
  5. package/build/client/_app/immutable/chunks/{UkmEG9Ws.js → BNTNz9oR.js} +1 -1
  6. package/build/client/_app/immutable/chunks/CiFavIif.js +1 -0
  7. package/build/client/_app/immutable/chunks/DN37js12.js +1 -0
  8. package/build/client/_app/immutable/chunks/KLsbJ_6V.js +2 -0
  9. package/build/client/_app/immutable/entry/{app.e7xoYywe.js → app.BNlAGT8a.js} +2 -2
  10. package/build/client/_app/immutable/entry/start.BQEoVg3q.js +1 -0
  11. package/build/client/_app/immutable/nodes/{1.E4wiL8sP.js → 1.CeFdv8vr.js} +1 -1
  12. package/build/client/_app/immutable/nodes/{2.BBV-AGuB.js → 2.Boib-Q5k.js} +195 -195
  13. package/build/client/_app/version.json +1 -1
  14. package/build/handler.js +4 -4
  15. package/build/index.js +4 -4
  16. package/build/server/chunks/chunks/{engine.js-CrdWRSwf.js → engine.js-1gYqtdBP.js} +17 -2
  17. package/build/server/chunks/chunks/{internal.js-BnJXHc1S.js → internal.js-XBbRSE8G.js} +2 -2
  18. package/build/server/chunks/chunks/{state.js-CAjHzrRZ.js → state.js-DgcRLBLq.js} +2 -2
  19. package/build/server/chunks/entries/endpoints/api/plugins/apply/{_server.ts.js-CpO--Jwf.js → _server.ts.js-BNEUWbaf.js} +2 -2
  20. package/build/server/chunks/entries/endpoints/api/plugins/reload/{_server.ts.js-BACFXWMj.js → _server.ts.js-Ct28d7_t.js} +2 -2
  21. package/build/server/chunks/entries/endpoints/api/plugins/snapshot/{_server.ts.js-BJg0hLlC.js → _server.ts.js-DswGIO4S.js} +2 -2
  22. package/build/server/chunks/entries/pages/{_error.svelte.js-BXeIuPj-.js → _error.svelte.js-CRYTX4NJ.js} +3 -3
  23. package/build/server/chunks/entries/pages/{_page.svelte.js-CW-EdJ00.js → _page.svelte.js-jCShpNgz.js} +164 -14
  24. package/build/server/chunks/{handler-DimUSmTW.js → handler-CDSfkiHz.js} +3 -3
  25. package/build/server/chunks/{index.js-BQUp4Xgn.js → index.js-BOeQQ7jF.js} +2 -2
  26. package/build/server/chunks/{manifest.js-BWy6zgHL.js → manifest.js-CvDWy0oM.js} +7 -7
  27. package/build/server/chunks/nodes/1.js-1rT6o2jA.js +9 -0
  28. package/build/server/chunks/nodes/{2.js-CzgP_zp4.js → 2.js-CGXIkDa5.js} +4 -4
  29. package/package.json +1 -1
  30. package/skills/dsi-add-plugin/SKILL.md +53 -0
  31. package/skills/dsi-add-plugin/references/allowbuilds-template.md +55 -0
  32. package/skills/dsi-add-plugin/references/checklist.md +98 -0
  33. package/skills/dsi-add-plugin/references/verification.md +67 -0
  34. package/template/.dsi/prompts.sqlite +0 -0
  35. package/template/.dsi/resources/plugins-reff.md +4 -2
  36. package/build/client/_app/immutable/chunks/C1F3aCiz.js +0 -2
  37. package/build/client/_app/immutable/chunks/CmnxnK6v.js +0 -1
  38. package/build/client/_app/immutable/chunks/jugX_o5s.js +0 -1
  39. package/build/client/_app/immutable/entry/start.CnkkMjJa.js +0 -1
  40. package/build/server/chunks/nodes/1.js-DJ3dsgdq.js +0 -9
  41. package/template/dsh-app-dev-preset/README.md +0 -69
  42. package/template/dsh-app-dev-preset/cordis.patch.yml +0 -219
  43. package/template/dsh-app-dev-preset/package.json +0 -7
  44. package/template/dsh-research-preset/README.md +0 -57
  45. package/template/dsh-research-preset/cordis.patch.yml +0 -118
  46. 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. [dsh-agent-teams(*)](https://github.com/NanmiCoder/dsh-agent-teams) - [NanmiCoder](https://github.com/NanmiCoder)
4
- 3. [sandbase-harness](https://github.com/sandbaseai/sandbase-harness) - [sandbaseai](https://github.com/sandbaseai)
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,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}),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,7 +0,0 @@
1
- {
2
- "name": "@local/dsh-app-dev-preset",
3
- "version": "1.0.0",
4
- "private": true,
5
- "type": "module",
6
- "dsh": { "bundle": { "patch": "./cordis.patch.yml" } }
7
- }
@@ -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.