pi-harness-runtime 1.1.229 → 1.1.231

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 (114) hide show
  1. package/package.json +1 -1
  2. package/packages/a2a-adapter/package.json +1 -1
  3. package/packages/agent-policy/package.json +1 -1
  4. package/packages/architecture-generator/package.json +1 -1
  5. package/packages/auth/package.json +1 -1
  6. package/packages/autonomous-refactor/package.json +1 -1
  7. package/packages/autonomous-runtime/package.json +1 -1
  8. package/packages/cache-strategy/package.json +1 -1
  9. package/packages/capability-registry/package.json +1 -1
  10. package/packages/checkpoint/package.json +1 -1
  11. package/packages/cli-plugin-sdk/package.json +1 -1
  12. package/packages/clipboard/package.json +1 -1
  13. package/packages/clipboard-plugin/package.json +1 -1
  14. package/packages/code-generation/package.json +1 -1
  15. package/packages/code-review/package.json +1 -1
  16. package/packages/codex-adapter/package.json +1 -1
  17. package/packages/codex-watcher/package.json +1 -1
  18. package/packages/config-capture/package.json +1 -1
  19. package/packages/context-compiler/package.json +1 -1
  20. package/packages/context-discovery/package.json +1 -1
  21. package/packages/context-manager/package.json +1 -1
  22. package/packages/cookie-sanitizer/package.json +1 -1
  23. package/packages/cost-optimizer/package.json +1 -1
  24. package/packages/dependency-analyzer/package.json +1 -1
  25. package/packages/django-plugin/package.json +1 -1
  26. package/packages/doc-generator/package.json +1 -1
  27. package/packages/e2e-tester/package.json +1 -1
  28. package/packages/evaluation-engine/package.json +1 -1
  29. package/packages/evaluation-runner/package.json +1 -1
  30. package/packages/event-bus/package.json +1 -1
  31. package/packages/event-store/package.json +1 -1
  32. package/packages/experience-replay/package.json +1 -1
  33. package/packages/feedback-collector/package.json +1 -1
  34. package/packages/file-copy-helper/package.json +1 -1
  35. package/packages/framework-detector/package.json +1 -1
  36. package/packages/framework-plugin-sdk/package.json +1 -1
  37. package/packages/frappe-plugin/package.json +1 -1
  38. package/packages/generic-web-plugin/package.json +1 -1
  39. package/packages/health-monitor/package.json +1 -1
  40. package/packages/intent-analyzer/package.json +1 -1
  41. package/packages/jev-judge/dist/continuation-controller.d.ts.map +1 -1
  42. package/packages/jev-judge/dist/continuation-controller.js +19 -4
  43. package/packages/jev-judge/dist/continuation-controller.js.map +1 -1
  44. package/packages/jev-judge/dist/todo-provider.d.ts +4 -1
  45. package/packages/jev-judge/dist/todo-provider.d.ts.map +1 -1
  46. package/packages/jev-judge/dist/todo-provider.js +114 -5
  47. package/packages/jev-judge/dist/todo-provider.js.map +1 -1
  48. package/packages/jev-judge/dist/typesafe-provider.d.ts +1 -0
  49. package/packages/jev-judge/dist/typesafe-provider.d.ts.map +1 -1
  50. package/packages/jev-judge/dist/typesafe-provider.js +15 -13
  51. package/packages/jev-judge/dist/typesafe-provider.js.map +1 -1
  52. package/packages/jev-judge/package.json +1 -1
  53. package/packages/jev-judge/src/continuation-controller.ts +20 -4
  54. package/packages/jev-judge/src/todo-provider.ts +140 -5
  55. package/packages/jev-judge/src/typesafe-provider.ts +32 -23
  56. package/packages/knowledge-graph/package.json +1 -1
  57. package/packages/knowledge-retrieval/package.json +1 -1
  58. package/packages/laravel-plugin/package.json +1 -1
  59. package/packages/learning-engine/package.json +1 -1
  60. package/packages/mcp-adapter/package.json +1 -1
  61. package/packages/memory-engine/package.json +1 -1
  62. package/packages/milestone-manager/package.json +1 -1
  63. package/packages/model-registry/package.json +1 -1
  64. package/packages/nextjs-plugin/package.json +1 -1
  65. package/packages/notification/package.json +1 -1
  66. package/packages/observability/package.json +1 -1
  67. package/packages/okf-indexer/package.json +1 -1
  68. package/packages/paperclip-integration/package.json +1 -1
  69. package/packages/performance-optimizer/package.json +1 -1
  70. package/packages/privilege-broker/package.json +1 -1
  71. package/packages/project-analyzer/package.json +1 -1
  72. package/packages/project-bootstrap/package.json +1 -1
  73. package/packages/projection-engine/package.json +1 -1
  74. package/packages/prompt-compiler/package.json +1 -1
  75. package/packages/prompt-versioning/package.json +1 -1
  76. package/packages/provider-adapter-sdk/package.json +1 -1
  77. package/packages/provider-router/package.json +1 -1
  78. package/packages/provider-selector/package.json +1 -1
  79. package/packages/providers/package.json +1 -1
  80. package/packages/qdrant-skills/package.json +1 -1
  81. package/packages/quota-manager/package.json +1 -1
  82. package/packages/rate-limiter/package.json +1 -1
  83. package/packages/react-vite-plugin/package.json +1 -1
  84. package/packages/release-manager/package.json +1 -1
  85. package/packages/requirement-compiler/package.json +1 -1
  86. package/packages/runtime/package.json +1 -1
  87. package/packages/scheduler/package.json +1 -1
  88. package/packages/scheduler-adapter/package.json +1 -1
  89. package/packages/session/package.json +1 -1
  90. package/packages/session-api/package.json +1 -1
  91. package/packages/session-export/package.json +1 -1
  92. package/packages/shared-context/package.json +1 -1
  93. package/packages/skill-mcp-client/package.json +1 -1
  94. package/packages/skill-registry/package.json +1 -1
  95. package/packages/skills/package.json +1 -1
  96. package/packages/sprint-planner/package.json +1 -1
  97. package/packages/subscription-engine/package.json +1 -1
  98. package/packages/task-compiler/package.json +1 -1
  99. package/packages/telegram/package.json +1 -1
  100. package/packages/tencentdb-memory/package.json +1 -1
  101. package/packages/tencentdb-sync/package.json +1 -1
  102. package/packages/test-data-generator/package.json +1 -1
  103. package/packages/test-generator/package.json +1 -1
  104. package/packages/todo-bd-sync/package.json +1 -1
  105. package/packages/token-estimation/package.json +1 -1
  106. package/packages/token-optimizer/package.json +1 -1
  107. package/packages/trajectory/package.json +1 -1
  108. package/packages/tui/package.json +1 -1
  109. package/packages/types/package.json +1 -1
  110. package/packages/webmcp-tester/package.json +1 -1
  111. package/packages/workflow-events/package.json +1 -1
  112. package/packages/workspace-scanner/package.json +1 -1
  113. package/packages/worktree/package.json +1 -1
  114. package/packages/write-review/package.json +1 -1
@@ -75,14 +75,120 @@ export class MockTodoProvider {
75
75
  }
76
76
  }
77
77
  /**
78
- * Create a todo provider based on available tools
78
+ * Create a todo provider that reads from rpiv-todo state via session branch
79
79
  */
80
80
  export function createTodoProvider(pi) {
81
- // Check if Pi exposes a todo API
82
- // For now, Pi does not expose a todo extension API
83
- // Return a provider that reports unavailability
81
+ if (pi && "sessionManager" in pi) {
82
+ return new PiTodoProvider(pi);
83
+ }
84
84
  return new PiUnavailableTodoProvider();
85
85
  }
86
+ /**
87
+ * Provider that reads rpiv-todo state from session branch
88
+ * Replicates rpiv-todo's replayFromBranch logic to access todo state
89
+ */
90
+ class PiTodoProvider {
91
+ pi;
92
+ _revision = 0;
93
+ constructor(pi) {
94
+ this.pi = pi;
95
+ }
96
+ async availability() {
97
+ if (!this.pi.sessionManager) {
98
+ return {
99
+ available: false,
100
+ error: "Session manager not available",
101
+ provider: "pi-todo",
102
+ };
103
+ }
104
+ return { available: true, provider: "pi-todo" };
105
+ }
106
+ /**
107
+ * Check if a value is a TaskDetails shape (defensive validation)
108
+ */
109
+ isTaskDetails(value) {
110
+ if (!value || typeof value !== "object")
111
+ return false;
112
+ const v = value;
113
+ return Array.isArray(v.tasks) && typeof v.nextId === "number";
114
+ }
115
+ /**
116
+ * Get todo state from session branch (replicates rpiv-todo's replayFromBranch)
117
+ */
118
+ getTodoState() {
119
+ let fromEntries;
120
+ let fromToolResults;
121
+ try {
122
+ for (const entry of this.pi.sessionManager.getBranch()) {
123
+ const e = entry;
124
+ // Priority 1: rpiv-todo-state custom entries
125
+ if (e.type === "custom") {
126
+ if (e.customType === "rpiv-todo-state" && this.isTaskDetails(e.data)) {
127
+ fromEntries = { tasks: e.data.tasks.map(t => ({ ...t })), nextId: e.data.nextId };
128
+ }
129
+ continue;
130
+ }
131
+ // Priority 2: toolResult entries with toolName === "todo"
132
+ if (e.type !== "message")
133
+ continue;
134
+ const msg = e.message;
135
+ if (msg?.role !== "toolResult" || msg.toolName !== "todo")
136
+ continue;
137
+ if (!this.isTaskDetails(msg.details))
138
+ continue;
139
+ fromToolResults = { tasks: msg.details.tasks.map(t => ({ ...t })), nextId: msg.details.nextId };
140
+ }
141
+ }
142
+ catch (err) {
143
+ // Fall through to EMPTY_STATE on error
144
+ }
145
+ // Prefer custom entries (more authoritative), fall back to tool results
146
+ return fromEntries ?? fromToolResults ?? { tasks: [], nextId: 1 };
147
+ }
148
+ async getSnapshot() {
149
+ this._revision++;
150
+ const state = this.getTodoState();
151
+ return {
152
+ items: state.tasks,
153
+ sessionId: this.pi.sessionManager.getSessionId() ?? "unknown",
154
+ revision: this._revision,
155
+ createdAt: new Date(),
156
+ };
157
+ }
158
+ async getByStatus(status) {
159
+ const { items } = await this.getSnapshot();
160
+ return items.filter((item) => item.status === status);
161
+ }
162
+ async getInProgress() {
163
+ return this.getByStatus("in_progress");
164
+ }
165
+ async getPending() {
166
+ return this.getByStatus("pending");
167
+ }
168
+ async getCompleted() {
169
+ return this.getByStatus("completed");
170
+ }
171
+ async getReady() {
172
+ const pending = await this.getPending();
173
+ const all = (await this.getSnapshot()).items;
174
+ return pending.filter((item) => {
175
+ if (!item.blockedBy?.length)
176
+ return true;
177
+ const blockedIds = new Set(item.blockedBy);
178
+ return !all.some((i) => blockedIds.has(i.id) && i.status !== "completed");
179
+ });
180
+ }
181
+ async getBlocked() {
182
+ const pending = await this.getPending();
183
+ const all = (await this.getSnapshot()).items;
184
+ return pending.filter((item) => {
185
+ if (!item.blockedBy?.length)
186
+ return false;
187
+ const blockedIds = new Set(item.blockedBy);
188
+ return all.some((i) => blockedIds.has(i.id) && i.status !== "completed");
189
+ });
190
+ }
191
+ }
86
192
  /**
87
193
  * Provider that reports Pi todo extension is not available
88
194
  */
@@ -90,7 +196,7 @@ class PiUnavailableTodoProvider {
90
196
  async availability() {
91
197
  return {
92
198
  available: false,
93
- error: "Pi does not expose a todo extension API. Todo state is not available.",
199
+ error: "Pi session manager not available. Todo state is not accessible.",
94
200
  provider: "pi-todo",
95
201
  };
96
202
  }
@@ -116,4 +222,7 @@ class PiUnavailableTodoProvider {
116
222
  return [];
117
223
  }
118
224
  }
225
+ /**
226
+ * Provider that reports Pi todo extension is not available
227
+ */
119
228
  //# sourceMappingURL=todo-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"todo-provider.js","sourceRoot":"","sources":["../src/todo-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"todo-provider.js","sourceRoot":"","sources":["../src/todo-provider.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ import type { JevQuestions, JevEvaluationResult } from "./types.js";
13
13
  */
14
14
  export interface TypeSafeConfig {
15
15
  apiKey: string;
16
+ model?: string;
16
17
  baseUrl?: string;
17
18
  timeoutMs?: number;
18
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"typesafe-provider.d.ts","sourceRoot":"","sources":["../src/typesafe-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAEV,YAAY,EAGZ,mBAAmB,EAIpB,MAAM,YAAY,CAAC;AA2CpB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA2B;IAEzC,YAAY,MAAM,EAAE,cAAc,EAKjC;IAED;;OAEG;IACG,QAAQ,CAAC,CAAC,SAAS,MAAM,EAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CA4EjC;IAED;;OAEG;IACG,IAAI,CACR,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;KAAE,CAAC,CAWlE;IAED;;OAEG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,EAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,EAAE,GACX,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAW5C;IAED;;OAEG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,SAAI,EACP,GAAG,SAAM,GACR,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAWhD;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;IA0DrB;;OAEG;IACH,OAAO,CAAC,aAAa;CAOtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,UAAU,GAAG,YAAY,CAgB3B"}
1
+ {"version":3,"file":"typesafe-provider.d.ts","sourceRoot":"","sources":["../src/typesafe-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAEV,YAAY,EAGZ,mBAAmB,EAIpB,MAAM,YAAY,CAAC;AAkDpB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAWD;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA2B;IAEzC,YAAY,MAAM,EAAE,cAAc,EAKjC;IAED;;OAEG;IACG,QAAQ,CAAC,CAAC,SAAS,MAAM,EAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CA2EjC;IAED;;OAEG;IACG,IAAI,CACR,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;KAAE,CAAC,CAWlE;IAED;;OAEG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,EAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,EAAE,GACX,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAW5C;IAED;;OAEG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,SAAI,EACP,GAAG,SAAM,GACR,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAWhD;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;IA2DrB;;OAEG;IACH,OAAO,CAAC,aAAa;CAOtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,UAAU,GAAG,YAAY,CAgB3B"}
@@ -11,6 +11,7 @@
11
11
  * Default configuration
12
12
  */
13
13
  const DEFAULT_CONFIG = {
14
+ model: "jev-latest",
14
15
  baseUrl: "https://api.typesafe.ai",
15
16
  timeoutMs: 30000,
16
17
  };
@@ -35,25 +36,24 @@ export class TypeSafeJudge {
35
36
  const startTime = Date.now();
36
37
  // Convert state to string if object
37
38
  const stateStr = typeof state === "string" ? state : JSON.stringify(state);
38
- // Build TypeSafe question format
39
- const questionsArray = Object.entries(questions).map(([id, q]) => {
39
+ // Build TypeSafe question format as a map (not array)
40
+ const questionsMap = {};
41
+ for (const [id, q] of Object.entries(questions)) {
40
42
  const questionObj = q;
41
- const question = {
42
- id,
43
+ questionsMap[id] = {
43
44
  type: questionObj.type,
44
45
  instructions: questionObj.instructions,
45
46
  };
46
47
  if (questionObj.type === "choice") {
47
- question.options = questionObj.options;
48
+ questionsMap[id].options = questionObj.options;
48
49
  // For choice questions, criteria defines ordered preference levels
49
- question.criteria = questionObj.options;
50
+ questionsMap[id].criteria = questionObj.options;
50
51
  }
51
52
  else if (questionObj.type === "score") {
52
- question.min = questionObj.min ?? 0;
53
- question.max = questionObj.max ?? 100;
53
+ questionsMap[id].min = questionObj.min ?? 0;
54
+ questionsMap[id].max = questionObj.max ?? 100;
54
55
  }
55
- return question;
56
- });
56
+ }
57
57
  // Call TypeSafe API directly
58
58
  const response = await fetch(`${this.config.baseUrl}/v1/systemone`, {
59
59
  method: "POST",
@@ -62,7 +62,8 @@ export class TypeSafeJudge {
62
62
  Authorization: `Bearer ${this.config.apiKey}`,
63
63
  },
64
64
  body: JSON.stringify({
65
- questions: questionsArray,
65
+ model: this.config.model,
66
+ questions: questionsMap,
66
67
  state: stateStr,
67
68
  }),
68
69
  signal: AbortSignal.timeout(this.config.timeoutMs),
@@ -142,11 +143,12 @@ export class TypeSafeJudge {
142
143
  let probability;
143
144
  switch (answer.type) {
144
145
  case "noul":
146
+ // FIX: Use answer.noul (not probability) per TypeSafe API spec
145
147
  response = {
146
148
  type: "noul",
147
- noul: answer.probability ?? 0.5,
149
+ noul: answer.noul ?? 0.5,
148
150
  };
149
- probability = answer.probability ?? 0.5;
151
+ probability = answer.noul ?? 0.5;
150
152
  break;
151
153
  case "choice":
152
154
  response = {
@@ -1 +1 @@
1
- {"version":3,"file":"typesafe-provider.js","sourceRoot":"","sources":["../src/typesafe-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typesafe-provider.js","sourceRoot":"","sources":["../src/typesafe-provider.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/jev-judge",
3
- "version": "1.1.229",
3
+ "version": "1.1.231",
4
4
  "description": "Jev Judge - Structured decision model for agent routing, E2E testing, and automated decisions",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -67,7 +67,7 @@ export interface ContinuationResult {
67
67
  export class TodoContinuationController {
68
68
  private pi: ExtensionAPI;
69
69
  private config: Required<ContinuationConfig>;
70
- private todoProvider = createTodoProvider();
70
+ private todoProvider: ReturnType<typeof createTodoProvider>;
71
71
 
72
72
  private state: ContinuationState = {
73
73
  sessionId: "",
@@ -85,6 +85,7 @@ export class TodoContinuationController {
85
85
 
86
86
  constructor(pi: ExtensionAPI, config?: ContinuationConfig) {
87
87
  this.pi = pi;
88
+ this.todoProvider = createTodoProvider(pi);
88
89
  this.config = {
89
90
  jevFallbackMinWaitMs: 5 * 60 * 1000, // 5 minutes
90
91
  routineThreshold: 0.7,
@@ -215,15 +216,22 @@ export class TodoContinuationController {
215
216
 
216
217
  this.state.steerAttempts++;
217
218
  this.state.continuationQueued = true;
219
+
218
220
  // Build continuation message
219
221
  const message = item.description
220
222
  ? `Continue task: ${item.subject}\n\n${item.description}`
221
223
  : `Continue task: ${item.subject}`;
222
224
 
223
225
  this.state.lastSteerMessage = message;
224
- debugLog("TodoContinuation", "Continuing:", item.subject);
225
- // Note: Pi does not expose sendUserMessage API.
226
- // The Telegram notification system will prompt user for ambiguous cases.
226
+ debugLog("TodoContinuation", "Sending continuation:", item.subject);
227
+
228
+ // Send continuation message via Pi API
229
+ try {
230
+ await (this.pi as ExtensionAPI & { sendUserMessage: (content: string, opts?: { deliverAs?: string }) => Promise<void> }).sendUserMessage(message, { deliverAs: "steer" });
231
+ } catch (err) {
232
+ debugLog("TodoContinuation", "Failed to send continuation:", String(err));
233
+ this.state.continuationQueued = false;
234
+ }
227
235
  }
228
236
 
229
237
  /**
@@ -248,6 +256,14 @@ export class TodoContinuationController {
248
256
  this.state.lastSteerMessage = message;
249
257
  this.state.todoRevision = snapshot.revision;
250
258
  debugLog("TodoContinuation", "Steering to continue item", itemId);
259
+
260
+ // Send continuation message via Pi API
261
+ try {
262
+ await (this.pi as ExtensionAPI & { sendUserMessage: (content: string, opts?: { deliverAs?: string }) => Promise<void> }).sendUserMessage(message, { deliverAs: "steer" });
263
+ } catch (err) {
264
+ debugLog("TodoContinuation", "Failed to send steer:", String(err));
265
+ this.state.continuationQueued = false;
266
+ }
251
267
  }
252
268
 
253
269
  /**
@@ -176,15 +176,145 @@ export class MockTodoProvider implements TodoProvider {
176
176
  }
177
177
 
178
178
  /**
179
- * Create a todo provider based on available tools
179
+ * Extended ExtensionAPI type with sessionManager (not in base type but available at runtime)
180
+ */
181
+ interface PiExtensionAPI extends ExtensionAPI {
182
+ sessionManager: {
183
+ getSessionId(): string;
184
+ getBranch(): Iterable<unknown>;
185
+ };
186
+ }
187
+
188
+ /**
189
+ * Create a todo provider that reads from rpiv-todo state via session branch
180
190
  */
181
191
  export function createTodoProvider(pi?: ExtensionAPI): TodoProvider {
182
- // Check if Pi exposes a todo API
183
- // For now, Pi does not expose a todo extension API
184
- // Return a provider that reports unavailability
192
+ if (pi && "sessionManager" in pi) {
193
+ return new PiTodoProvider(pi as PiExtensionAPI);
194
+ }
185
195
  return new PiUnavailableTodoProvider();
186
196
  }
187
197
 
198
+ /**
199
+ * Provider that reads rpiv-todo state from session branch
200
+ * Replicates rpiv-todo's replayFromBranch logic to access todo state
201
+ */
202
+ class PiTodoProvider implements TodoProvider {
203
+ private pi: PiExtensionAPI;
204
+ private _revision = 0;
205
+
206
+ constructor(pi: PiExtensionAPI) {
207
+ this.pi = pi;
208
+ }
209
+
210
+ async availability(): Promise<TodoAvailability> {
211
+ if (!this.pi.sessionManager) {
212
+ return {
213
+ available: false,
214
+ error: "Session manager not available",
215
+ provider: "pi-todo",
216
+ };
217
+ }
218
+ return { available: true, provider: "pi-todo" };
219
+ }
220
+
221
+ /**
222
+ * Check if a value is a TaskDetails shape (defensive validation)
223
+ */
224
+ private isTaskDetails(value: unknown): value is { tasks: TodoItem[]; nextId: number } {
225
+ if (!value || typeof value !== "object") return false;
226
+ const v = value as Record<string, unknown>;
227
+ return Array.isArray(v.tasks) && typeof v.nextId === "number";
228
+ }
229
+
230
+ /**
231
+ * Get todo state from session branch (replicates rpiv-todo's replayFromBranch)
232
+ */
233
+ private getTodoState(): { tasks: TodoItem[]; nextId: number } {
234
+ let fromEntries: { tasks: TodoItem[]; nextId: number } | undefined;
235
+ let fromToolResults: { tasks: TodoItem[]; nextId: number } | undefined;
236
+
237
+ try {
238
+ for (const entry of this.pi.sessionManager.getBranch()) {
239
+ const e = entry as {
240
+ type?: string;
241
+ customType?: string;
242
+ data?: unknown;
243
+ message?: { role?: string; toolName?: string; details?: unknown };
244
+ };
245
+
246
+ // Priority 1: rpiv-todo-state custom entries
247
+ if (e.type === "custom") {
248
+ if (e.customType === "rpiv-todo-state" && this.isTaskDetails(e.data)) {
249
+ fromEntries = { tasks: (e.data as { tasks: TodoItem[] }).tasks.map(t => ({ ...t })), nextId: (e.data as { nextId: number }).nextId };
250
+ }
251
+ continue;
252
+ }
253
+
254
+ // Priority 2: toolResult entries with toolName === "todo"
255
+ if (e.type !== "message") continue;
256
+ const msg = e.message;
257
+ if (msg?.role !== "toolResult" || msg.toolName !== "todo") continue;
258
+ if (!this.isTaskDetails(msg.details)) continue;
259
+ fromToolResults = { tasks: (msg.details as { tasks: TodoItem[] }).tasks.map(t => ({ ...t })), nextId: (msg.details as { nextId: number }).nextId };
260
+ }
261
+ } catch (err) {
262
+ // Fall through to EMPTY_STATE on error
263
+ }
264
+
265
+ // Prefer custom entries (more authoritative), fall back to tool results
266
+ return fromEntries ?? fromToolResults ?? { tasks: [], nextId: 1 };
267
+ }
268
+
269
+ async getSnapshot(): Promise<TodoSnapshot> {
270
+ this._revision++;
271
+ const state = this.getTodoState();
272
+ return {
273
+ items: state.tasks,
274
+ sessionId: this.pi.sessionManager.getSessionId() ?? "unknown",
275
+ revision: this._revision,
276
+ createdAt: new Date(),
277
+ };
278
+ }
279
+
280
+ async getByStatus(status: TodoStatus): Promise<TodoItem[]> {
281
+ const { items } = await this.getSnapshot();
282
+ return items.filter((item) => item.status === status);
283
+ }
284
+
285
+ async getInProgress(): Promise<TodoItem[]> {
286
+ return this.getByStatus("in_progress");
287
+ }
288
+
289
+ async getPending(): Promise<TodoItem[]> {
290
+ return this.getByStatus("pending");
291
+ }
292
+
293
+ async getCompleted(): Promise<TodoItem[]> {
294
+ return this.getByStatus("completed");
295
+ }
296
+
297
+ async getReady(): Promise<TodoItem[]> {
298
+ const pending = await this.getPending();
299
+ const all = (await this.getSnapshot()).items;
300
+ return pending.filter((item) => {
301
+ if (!item.blockedBy?.length) return true;
302
+ const blockedIds = new Set(item.blockedBy);
303
+ return !all.some((i) => blockedIds.has(i.id) && i.status !== "completed");
304
+ });
305
+ }
306
+
307
+ async getBlocked(): Promise<TodoItem[]> {
308
+ const pending = await this.getPending();
309
+ const all = (await this.getSnapshot()).items;
310
+ return pending.filter((item) => {
311
+ if (!item.blockedBy?.length) return false;
312
+ const blockedIds = new Set(item.blockedBy);
313
+ return all.some((i) => blockedIds.has(i.id) && i.status !== "completed");
314
+ });
315
+ }
316
+ }
317
+
188
318
  /**
189
319
  * Provider that reports Pi todo extension is not available
190
320
  */
@@ -192,7 +322,7 @@ class PiUnavailableTodoProvider implements TodoProvider {
192
322
  async availability(): Promise<TodoAvailability> {
193
323
  return {
194
324
  available: false,
195
- error: "Pi does not expose a todo extension API. Todo state is not available.",
325
+ error: "Pi session manager not available. Todo state is not accessible.",
196
326
  provider: "pi-todo",
197
327
  };
198
328
  }
@@ -225,3 +355,8 @@ class PiUnavailableTodoProvider implements TodoProvider {
225
355
  return [];
226
356
  }
227
357
  }
358
+
359
+ /**
360
+ * Provider that reports Pi todo extension is not available
361
+ */
362
+
@@ -23,15 +23,18 @@ import type {
23
23
  * TypeSafe API request format
24
24
  */
25
25
  interface TypeSafeRequest {
26
- questions: TypeSafeQuestion[];
27
- state: string;
26
+ /** The model that handles the request. Required. */
27
+ model: string;
28
+ /** The content to evaluate. */
29
+ state: string | object | unknown[];
30
+ /** A map of typed questions. Keys are question IDs. */
31
+ questions: Record<string, TypeSafeQuestion>;
28
32
  }
29
33
 
30
34
  /**
31
- * TypeSafe question format
35
+ * TypeSafe question format (per API spec, id not needed in question object - it's the map key)
32
36
  */
33
37
  interface TypeSafeQuestion {
34
- id: string;
35
38
  type: "noul" | "choice" | "score";
36
39
  instructions: string;
37
40
  options?: string[]; // For choice type
@@ -54,10 +57,14 @@ interface TypeSafeResponse {
54
57
  */
55
58
  interface TypeSafeAnswer {
56
59
  type: "noul" | "choice" | "score";
57
- probability?: number; // For noul type (0-1)
58
- choice?: string; // For choice type
59
- score?: number; // For score type
60
- confidence?: number; // 0-1 for all types
60
+ /** For noul type: probability of yes (0-1). */
61
+ noul?: number;
62
+ /** For choice type: the selected option. */
63
+ choice?: string;
64
+ /** For score type: the probability-weighted score. */
65
+ score?: number;
66
+ /** For choice/score: confidence 0-1. */
67
+ confidence?: number;
61
68
  }
62
69
 
63
70
  /**
@@ -65,14 +72,16 @@ interface TypeSafeAnswer {
65
72
  */
66
73
  export interface TypeSafeConfig {
67
74
  apiKey: string;
75
+ model?: string; // Defaults to jev-latest
68
76
  baseUrl?: string; // Defaults to https://api.typesafe.ai
69
- timeoutMs?: number; // Defaults to 30000
77
+ timeoutMs?: number; // Defaults to 30000
70
78
  }
71
79
 
72
80
  /**
73
81
  * Default configuration
74
82
  */
75
83
  const DEFAULT_CONFIG = {
84
+ model: "jev-latest",
76
85
  baseUrl: "https://api.typesafe.ai",
77
86
  timeoutMs: 30000,
78
87
  };
@@ -105,26 +114,24 @@ export class TypeSafeJudge {
105
114
  // Convert state to string if object
106
115
  const stateStr = typeof state === "string" ? state : JSON.stringify(state);
107
116
 
108
- // Build TypeSafe question format
109
- const questionsArray = Object.entries(questions).map(([id, q]) => {
117
+ // Build TypeSafe question format as a map (not array)
118
+ const questionsMap: Record<string, TypeSafeQuestion> = {};
119
+ for (const [id, q] of Object.entries(questions)) {
110
120
  const questionObj = q as JevQuestion;
111
- const question: TypeSafeQuestion = {
112
- id,
121
+ questionsMap[id] = {
113
122
  type: questionObj.type,
114
123
  instructions: questionObj.instructions,
115
124
  };
116
125
 
117
126
  if (questionObj.type === "choice") {
118
- question.options = questionObj.options;
127
+ questionsMap[id].options = questionObj.options;
119
128
  // For choice questions, criteria defines ordered preference levels
120
- question.criteria = questionObj.options;
129
+ questionsMap[id].criteria = questionObj.options;
121
130
  } else if (questionObj.type === "score") {
122
- question.min = questionObj.min ?? 0;
123
- question.max = questionObj.max ?? 100;
131
+ questionsMap[id].min = questionObj.min ?? 0;
132
+ questionsMap[id].max = questionObj.max ?? 100;
124
133
  }
125
-
126
- return question;
127
- });
134
+ }
128
135
 
129
136
  // Call TypeSafe API directly
130
137
  const response = await fetch(`${this.config.baseUrl}/v1/systemone`, {
@@ -134,7 +141,8 @@ export class TypeSafeJudge {
134
141
  Authorization: `Bearer ${this.config.apiKey}`,
135
142
  },
136
143
  body: JSON.stringify({
137
- questions: questionsArray,
144
+ model: this.config.model,
145
+ questions: questionsMap,
138
146
  state: stateStr,
139
147
  } satisfies TypeSafeRequest),
140
148
  signal: AbortSignal.timeout(this.config.timeoutMs),
@@ -250,11 +258,12 @@ export class TypeSafeJudge {
250
258
 
251
259
  switch (answer.type) {
252
260
  case "noul":
261
+ // FIX: Use answer.noul (not probability) per TypeSafe API spec
253
262
  response = {
254
263
  type: "noul",
255
- noul: answer.probability ?? 0.5,
264
+ noul: answer.noul ?? 0.5,
256
265
  };
257
- probability = answer.probability ?? 0.5;
266
+ probability = answer.noul ?? 0.5;
258
267
  break;
259
268
 
260
269
  case "choice":
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/knowledge-graph",
3
- "version": "1.1.229",
3
+ "version": "1.1.231",
4
4
  "description": "Knowledge Graph extraction and provenance linking for SKILL.md files",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/knowledge-retrieval",
3
- "version": "1.1.229",
3
+ "version": "1.1.231",
4
4
  "description": "Knowledge retrieval via TencentDB-Agent-Memory MCP (RFC-0105)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/laravel-plugin",
3
- "version": "1.1.229",
3
+ "version": "1.1.231",
4
4
  "description": "Laravel framework analysis — artisan commands, Eloquent models, Blade",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",