@trevonistrevon/pi-loop 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -31,8 +31,8 @@ function textResult(msg) {
31
31
  return { content: [{ type: "text", text: msg }], details: undefined };
32
32
  }
33
33
  const SYSTEM_REMINDER_TEMPLATE = `<system-reminder>
34
- Scheduled loop "%propmpt%" fired. Trigger: %trigger_info%.
35
- [loop:%loop_id%]
34
+ Loop "%prompt%" fired. Execute this instruction now.
35
+ Trigger: %trigger_info%. Loop: %loop_id%.
36
36
  </system-reminder>`;
37
37
  export default function (pi) {
38
38
  const piLoopEnv = process.env.PI_LOOP;
@@ -148,10 +148,11 @@ export default function (pi) {
148
148
  if (persistedShown)
149
149
  return;
150
150
  persistedShown = true;
151
+ const sessionStartedAt = Date.now();
151
152
  const loops = store.list();
152
153
  if (loops.length > 0) {
153
154
  store.clearExpired();
154
- store.expireEventLoops();
155
+ store.expireEventLoops(sessionStartedAt);
155
156
  triggerSystem.start();
156
157
  widget.update();
157
158
  }
@@ -183,7 +184,7 @@ export default function (pi) {
183
184
  // ── System-reminder injection for loop fires ──
184
185
  let canInjectReminder = true;
185
186
  const pendingReminders = [];
186
- pi.on("loop:fire", (data) => {
187
+ pi.events.on("loop:fire", (data) => {
187
188
  const triggerInfo = typeof data.trigger === "string"
188
189
  ? data.trigger
189
190
  : data.trigger?.type === "cron"
package/dist/store.d.ts CHANGED
@@ -25,7 +25,7 @@ export declare class LoopStore {
25
25
  };
26
26
  delete(id: string): boolean;
27
27
  clearExpired(): number;
28
- expireEventLoops(): number;
28
+ expireEventLoops(sessionStartedAt: number): number;
29
29
  clearAll(): number;
30
30
  deleteFileIfEmpty(): boolean;
31
31
  }
package/dist/store.js CHANGED
@@ -176,15 +176,17 @@ export class LoopStore {
176
176
  return count;
177
177
  });
178
178
  }
179
- expireEventLoops() {
179
+ expireEventLoops(sessionStartedAt) {
180
180
  return this.withLock(() => {
181
181
  let count = 0;
182
182
  for (const [_id, entry] of this.loops) {
183
183
  if (entry.status !== "active")
184
184
  continue;
185
185
  if (entry.trigger.type === "event" || entry.trigger.type === "hybrid") {
186
- entry.status = "expired";
187
- count++;
186
+ if (entry.createdAt < sessionStartedAt) {
187
+ entry.status = "expired";
188
+ count++;
189
+ }
188
190
  }
189
191
  }
190
192
  return count;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trevonistrevon/pi-loop",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "A pi extension for cron/event-based agent re-wake loops and background process monitoring.",
5
5
  "author": "trevonistrevon",
6
6
  "license": "MIT",
package/src/index.ts CHANGED
@@ -36,8 +36,8 @@ function textResult(msg: string) {
36
36
  }
37
37
 
38
38
  const SYSTEM_REMINDER_TEMPLATE = `<system-reminder>
39
- Scheduled loop "%propmpt%" fired. Trigger: %trigger_info%.
40
- [loop:%loop_id%]
39
+ Loop "%prompt%" fired. Execute this instruction now.
40
+ Trigger: %trigger_info%. Loop: %loop_id%.
41
41
  </system-reminder>`;
42
42
 
43
43
  export default function (pi: ExtensionAPI) {
@@ -153,10 +153,11 @@ export default function (pi: ExtensionAPI) {
153
153
  function showPersistedLoops(_isResume = false) {
154
154
  if (persistedShown) return;
155
155
  persistedShown = true;
156
+ const sessionStartedAt = Date.now();
156
157
  const loops = store.list();
157
158
  if (loops.length > 0) {
158
159
  store.clearExpired();
159
- store.expireEventLoops();
160
+ store.expireEventLoops(sessionStartedAt);
160
161
  triggerSystem.start();
161
162
  widget.update();
162
163
  }
@@ -197,7 +198,7 @@ export default function (pi: ExtensionAPI) {
197
198
  let canInjectReminder = true;
198
199
  const pendingReminders: string[] = [];
199
200
 
200
- pi.on("loop:fire" as any, (data: any) => {
201
+ pi.events.on("loop:fire", (data: any) => {
201
202
  const triggerInfo = typeof data.trigger === "string"
202
203
  ? data.trigger
203
204
  : data.trigger?.type === "cron"
package/src/store.ts CHANGED
@@ -173,14 +173,16 @@ export class LoopStore {
173
173
  });
174
174
  }
175
175
 
176
- expireEventLoops(): number {
176
+ expireEventLoops(sessionStartedAt: number): number {
177
177
  return this.withLock(() => {
178
178
  let count = 0;
179
179
  for (const [_id, entry] of this.loops) {
180
180
  if (entry.status !== "active") continue;
181
181
  if (entry.trigger.type === "event" || entry.trigger.type === "hybrid") {
182
- entry.status = "expired";
183
- count++;
182
+ if (entry.createdAt < sessionStartedAt) {
183
+ entry.status = "expired";
184
+ count++;
185
+ }
184
186
  }
185
187
  }
186
188
  return count;