@hyperdreamer/pi-webui 1.10.7 → 1.11.0-beta.10

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 (92) hide show
  1. package/README.md +17 -2
  2. package/dist/cli.js +265 -32
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client/assets/{CodeViewer-BIb2Wx8W.js → CodeViewer-CAf_j27u.js} +1 -1
  5. package/dist/client/assets/{UnifiedDiffViewer-DpWiGlQo.js → UnifiedDiffViewer-wBjEJWa1.js} +1 -1
  6. package/dist/client/assets/{index-DX583DEv.js → index-5EtDb9nj.js} +1197 -476
  7. package/dist/client/index.html +1 -1
  8. package/dist/config.js +52 -11
  9. package/dist/config.js.map +1 -1
  10. package/dist/pi-webui-plugins/workspace-memory/pi-webui-plugin.js +3 -2
  11. package/dist/pi-webui-plugins/workspace-tasks/pi-webui-plugin.js +1 -0
  12. package/dist/plugin-api.d.ts +30 -0
  13. package/dist/server/app.js +6 -1
  14. package/dist/server/app.js.map +1 -1
  15. package/dist/server/realtime/sessionEventHub.js +40 -5
  16. package/dist/server/realtime/sessionEventHub.js.map +1 -1
  17. package/dist/server/realtime/sessionStatusCoalescer.js +137 -0
  18. package/dist/server/realtime/sessionStatusCoalescer.js.map +1 -0
  19. package/dist/server/sessiond/sessionProxyRoutes.js +2 -0
  20. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  21. package/dist/server/sessiond.js +57 -5
  22. package/dist/server/sessiond.js.map +1 -1
  23. package/dist/server/sessions/modelPolicyCapability.js +88 -0
  24. package/dist/server/sessions/modelPolicyCapability.js.map +1 -0
  25. package/dist/server/sessions/modelPolicyTool.js +31 -0
  26. package/dist/server/sessions/modelPolicyTool.js.map +1 -0
  27. package/dist/server/sessions/modelTierRegistry.js +14 -0
  28. package/dist/server/sessions/modelTierRegistry.js.map +1 -1
  29. package/dist/server/sessions/modelTierSettingsRoutes.js +36 -0
  30. package/dist/server/sessions/modelTierSettingsRoutes.js.map +1 -0
  31. package/dist/server/sessions/modelTierSettingsService.js +100 -0
  32. package/dist/server/sessions/modelTierSettingsService.js.map +1 -0
  33. package/dist/server/sessions/piSessionService.js +1643 -433
  34. package/dist/server/sessions/piSessionService.js.map +1 -1
  35. package/dist/server/sessions/sessionDefaultsRoutes.js +39 -0
  36. package/dist/server/sessions/sessionDefaultsRoutes.js.map +1 -1
  37. package/dist/server/sessions/sessionDefaultsService.js +36 -6
  38. package/dist/server/sessions/sessionDefaultsService.js.map +1 -1
  39. package/dist/server/sessions/sessionMetadataStore.js +107 -13
  40. package/dist/server/sessions/sessionMetadataStore.js.map +1 -1
  41. package/dist/server/sessions/sessionModelPolicy.js +118 -0
  42. package/dist/server/sessions/sessionModelPolicy.js.map +1 -0
  43. package/dist/server/sessions/sessionReorder.js +117 -0
  44. package/dist/server/sessions/sessionReorder.js.map +1 -0
  45. package/dist/server/sessions/sessionRouteFastifyOptions.js +8 -0
  46. package/dist/server/sessions/sessionRouteFastifyOptions.js.map +1 -0
  47. package/dist/server/sessions/sessionRoutes.js +208 -3
  48. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  49. package/dist/server/sessions/starterModelPolicyPreferenceStore.js +164 -0
  50. package/dist/server/sessions/starterModelPolicyPreferenceStore.js.map +1 -0
  51. package/dist/server/sessions/utilityModelExtension.js +199 -0
  52. package/dist/server/sessions/utilityModelExtension.js.map +1 -0
  53. package/dist/server/sessions/utilityModelResolver.js +77 -0
  54. package/dist/server/sessions/utilityModelResolver.js.map +1 -0
  55. package/dist/server/sessions/utilityModelSettingsRoutes.js +62 -0
  56. package/dist/server/sessions/utilityModelSettingsRoutes.js.map +1 -0
  57. package/dist/server/sessions/utilityModelSettingsService.js +101 -0
  58. package/dist/server/sessions/utilityModelSettingsService.js.map +1 -0
  59. package/dist/server/skills/optionalSkillInstall.js +69 -0
  60. package/dist/server/skills/optionalSkillInstall.js.map +1 -0
  61. package/dist/server/skills/optionalSkillInstaller.js +148 -0
  62. package/dist/server/skills/optionalSkillInstaller.js.map +1 -0
  63. package/dist/shared/apiTypes.d.ts +129 -3
  64. package/dist/shared/apiTypes.js +10 -0
  65. package/dist/shared/apiTypes.js.map +1 -1
  66. package/dist/shared/capabilities.js +15 -0
  67. package/dist/shared/capabilities.js.map +1 -1
  68. package/dist/shared/federatedRoutes.js +7 -0
  69. package/dist/shared/federatedRoutes.js.map +1 -1
  70. package/docs/assets/pi-webui-desktop.png +0 -0
  71. package/docs/config.md +61 -3
  72. package/docs/plugins.md +93 -16
  73. package/optional-skills/deterministic-subagent-driven-development/SKILL.md +224 -0
  74. package/optional-skills/deterministic-subagent-driven-development/pi-webui-skill.json +28 -0
  75. package/optional-skills/deterministic-subagent-driven-development/prompts/final-reviewer.md +132 -0
  76. package/optional-skills/deterministic-subagent-driven-development/prompts/implementer.md +101 -0
  77. package/optional-skills/deterministic-subagent-driven-development/prompts/re-reviewer.md +60 -0
  78. package/optional-skills/deterministic-subagent-driven-development/prompts/task-reviewer.md +80 -0
  79. package/optional-skills/deterministic-subagent-driven-development/references/capability-contract.md +174 -0
  80. package/optional-skills/deterministic-subagent-driven-development/references/plan-contract.md +268 -0
  81. package/optional-skills/deterministic-subagent-driven-development/references/state-machine.md +177 -0
  82. package/optional-skills/deterministic-subagent-driven-development/scripts/lib/manifest.mjs +258 -0
  83. package/optional-skills/deterministic-subagent-driven-development/scripts/lib/plan-policy.mjs +350 -0
  84. package/optional-skills/deterministic-subagent-driven-development/scripts/lib/prompt-renderer.mjs +290 -0
  85. package/optional-skills/deterministic-subagent-driven-development/scripts/lib/state-machine.mjs +1264 -0
  86. package/optional-skills/deterministic-subagent-driven-development/scripts/lib/state-store.mjs +532 -0
  87. package/optional-skills/deterministic-subagent-driven-development/scripts/sdd-state +3 -0
  88. package/optional-skills/deterministic-subagent-driven-development/scripts/sdd-state.mjs +349 -0
  89. package/optional-skills/deterministic-writing-plans/SKILL.md +232 -0
  90. package/optional-skills/deterministic-writing-plans/references/grammar.md +84 -0
  91. package/optional-skills/deterministic-writing-plans/templates/plan-skeleton.md +143 -0
  92. package/package.json +13 -9
@@ -0,0 +1,143 @@
1
+ # Example Feature Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use the deterministic
4
+ > deterministic-subagent-driven-development controller to implement this plan task-by-task.
5
+ > Steps use checkbox (`- [ ]`) syntax for tracking.
6
+
7
+ **Goal:** One sentence describing what this builds.
8
+
9
+ **Architecture:** Two or three sentences about the approach.
10
+
11
+ **Tech Stack:** The key technologies and libraries.
12
+
13
+ ## Global Constraints
14
+
15
+ - Node 22.19 is the version floor; do not use APIs newer than that.
16
+ - No new runtime dependencies.
17
+ - Every task's requirements implicitly include this section.
18
+
19
+ ## Task 1: Parser module
20
+
21
+ **Implementer tier:** Standard
22
+
23
+ **Files:**
24
+
25
+ - Create: `src/parse/tokens.ts`
26
+ - Test: `src/parse/tokens.test.ts`
27
+
28
+ **Interfaces:**
29
+
30
+ - Consumes: nothing; this is the first task.
31
+ - Produces: `tokenize(input: string): Token[]`, where
32
+ `Token = { kind: "word" | "space"; text: string }`.
33
+
34
+ - [ ] **Step 1: Write the failing test**
35
+
36
+ ```ts
37
+ import { describe, expect, it } from "vitest";
38
+ import { tokenize } from "./tokens";
39
+
40
+ describe("tokenize", () => {
41
+ it("splits a word from trailing space", () => {
42
+ expect(tokenize("hi ")).toEqual([
43
+ { kind: "word", text: "hi" },
44
+ { kind: "space", text: " " },
45
+ ]);
46
+ });
47
+ });
48
+ ```
49
+
50
+ - [ ] **Step 2: Run the test and confirm it fails**
51
+
52
+ Run: `npm test -- --run src/parse/tokens.test.ts`
53
+ Expected: FAIL, `Cannot find module './tokens'`.
54
+
55
+ - [ ] **Step 3: Write the minimal implementation**
56
+
57
+ ```ts
58
+ export type Token = { kind: "word" | "space"; text: string };
59
+
60
+ export function tokenize(input: string): Token[] {
61
+ return [...input.matchAll(/\s+|\S+/gu)].map((m) => ({
62
+ kind: /^\s/u.test(m[0]) ? "space" : "word",
63
+ text: m[0],
64
+ }));
65
+ }
66
+ ```
67
+
68
+ - [ ] **Step 4: Run the test and confirm it passes**
69
+
70
+ Run: `npm test -- --run src/parse/tokens.test.ts`
71
+ Expected: PASS, 1 test.
72
+
73
+ - [ ] **Step 5: Commit**
74
+
75
+ ```bash
76
+ git add src/parse/tokens.ts src/parse/tokens.test.ts
77
+ git commit -m "feat(parse): tokenize words and spaces"
78
+ ```
79
+
80
+ ## Task 2: Wire the parser into the CLI
81
+
82
+ **Implementer tier:** Advanced
83
+
84
+ **Files:**
85
+
86
+ - Create: `src/cli/run.ts`
87
+ - Modify: `src/cli/index.ts:1-20`
88
+ - Test: `src/cli/run.test.ts`
89
+
90
+ **Interfaces:**
91
+
92
+ - Consumes: `tokenize(input: string): Token[]` from Task 1, with
93
+ `Token = { kind: "word" | "space"; text: string }`.
94
+ - Produces: `runCli(argv: string[]): Promise<number>`, resolving to the
95
+ process exit code.
96
+
97
+ - [ ] **Step 1: Write the failing test**
98
+
99
+ ```ts
100
+ import { describe, expect, it } from "vitest";
101
+ import { runCli } from "./run";
102
+
103
+ describe("runCli", () => {
104
+ it("returns 0 and counts words", async () => {
105
+ expect(await runCli(["hello world"])).toBe(0);
106
+ });
107
+
108
+ it("returns 2 when no argument is given", async () => {
109
+ expect(await runCli([])).toBe(2);
110
+ });
111
+ });
112
+ ```
113
+
114
+ - [ ] **Step 2: Run the test and confirm it fails**
115
+
116
+ Run: `npm test -- --run src/cli/run.test.ts`
117
+ Expected: FAIL, `Cannot find module './run'`.
118
+
119
+ - [ ] **Step 3: Write the minimal implementation**
120
+
121
+ ```ts
122
+ import { tokenize } from "../parse/tokens";
123
+
124
+ export async function runCli(argv: string[]): Promise<number> {
125
+ const [input] = argv;
126
+ if (input === undefined) return 2;
127
+ const words = tokenize(input).filter((t) => t.kind === "word");
128
+ process.stdout.write(`${String(words.length)}\n`);
129
+ return 0;
130
+ }
131
+ ```
132
+
133
+ - [ ] **Step 4: Run the test and confirm it passes**
134
+
135
+ Run: `npm test -- --run src/cli/run.test.ts`
136
+ Expected: PASS, 2 tests.
137
+
138
+ - [ ] **Step 5: Commit**
139
+
140
+ ```bash
141
+ git add src/cli/run.ts src/cli/index.ts src/cli/run.test.ts
142
+ git commit -m "feat(cli): count words from the first argument"
143
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperdreamer/pi-webui",
3
- "version": "1.10.7",
3
+ "version": "1.11.0-beta.10",
4
4
  "description": "Web UI for persistent Pi Coding Agent sessions in real workspaces.",
5
5
  "license": "MIT",
6
6
  "author": "Federico Jaramillo Martinez and HyperDreamer",
@@ -16,11 +16,14 @@
16
16
  "README.md",
17
17
  "LICENSE",
18
18
  "extensions",
19
+ "optional-skills",
19
20
  "docs/plugins.md",
20
21
  "docs/config.md",
21
22
  "docs/assets",
22
23
  "plugin-api.d.ts",
23
- "plugin-api/unstable.d.ts"
24
+ "plugin-api/unstable.d.ts",
25
+ "!optional-skills/**/evals",
26
+ "!optional-skills/**/tests"
24
27
  ],
25
28
  "scripts": {
26
29
  "dev": "bash -c 'trap \"kill 0\" EXIT; npm run dev:sessiond & npm run dev:web & npm run dev:client & wait'",
@@ -36,7 +39,7 @@
36
39
  "typecheck": "tsc --noEmit",
37
40
  "typecheck:cached": "tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/pi-webui/typecheck.tsbuildinfo",
38
41
  "knip": "knip",
39
- "lint": "eslint \"src/**/*.ts\" \"extensions/**/*.ts\" \"pi-webui-plugins/**/*.ts\" vite.config.ts vitest.config.ts",
42
+ "lint": "eslint --no-error-on-unmatched-pattern \"src/**/*.ts\" \"extensions/**/*.ts\" \"pi-webui-plugins/**/*.ts\" \"optional-skills/**/*.mjs\" vite.config.ts vitest.config.ts",
40
43
  "test": "vitest run --config vitest.config.ts",
41
44
  "verify": "npm run typecheck && npm run lint && npm run knip && npm test",
42
45
  "verify:staged": "node scripts/verify-staged.mjs",
@@ -81,14 +84,15 @@
81
84
  },
82
85
  "devDependencies": {
83
86
  "@changesets/cli": "^2.31.0",
84
- "@earendil-works/pi-agent-core": "^0.82.1",
85
- "@earendil-works/pi-ai": "^0.82.1",
86
- "@earendil-works/pi-coding-agent": "^0.82.1",
87
+ "@earendil-works/pi-agent-core": "^0.83.0",
88
+ "@earendil-works/pi-ai": "^0.83.0",
89
+ "@earendil-works/pi-coding-agent": "^0.83.0",
87
90
  "@eslint/js": "^10.0.1",
88
91
  "@types/node": "^24.13.3",
89
92
  "@types/ws": "^8.18.1",
90
93
  "eslint": "^10.6.0",
91
94
  "globals": "^17.7.0",
95
+ "jsdom": "^27.4.0",
92
96
  "knip": "^6.25.0",
93
97
  "tsx": "^4.23.0",
94
98
  "typescript": "^6.0.3",
@@ -112,9 +116,9 @@
112
116
  "homepage": "https://pi-webui.dev/",
113
117
  "packageManager": "npm@11.11.0",
114
118
  "peerDependencies": {
115
- "@earendil-works/pi-agent-core": ">=0.82.1 <0.83",
116
- "@earendil-works/pi-ai": ">=0.82.1 <0.83",
117
- "@earendil-works/pi-coding-agent": ">=0.82.1 <0.83"
119
+ "@earendil-works/pi-agent-core": ">=0.83.0 <0.84",
120
+ "@earendil-works/pi-ai": ">=0.83.0 <0.84",
121
+ "@earendil-works/pi-coding-agent": ">=0.83.0 <0.84"
118
122
  },
119
123
  "keywords": [
120
124
  "pi-package",