@pipod/cli 0.1.15 → 0.1.17

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.
@@ -0,0 +1,52 @@
1
+ # Pod-list pagination
2
+
3
+ `pipod ls` (also `pipod list`) reads every page before applying display filters or
4
+ rendering the oldest-activity-first tree. Quiet output contains each full pod ID
5
+ once. Project, template, account and machine-group scopes use the same page walk;
6
+ so do short-ref/name resolution and bulk archive/restore/GC selection.
7
+
8
+ ## API contract
9
+
10
+ `GET /v1/pods` returns `{ pods, nextCursor }`. A page contains at most `limit`
11
+ pods (default 100, maximum 200). `nextCursor: null` means the last page, including
12
+ an empty result. Otherwise pass that opaque string as `cursor` on the next request,
13
+ keeping the same filters. Do not derive it from `lastActivityAt` or `createdAt`:
14
+ the cursor retains PostgreSQL microseconds and the pod UUID tie-breaker. The
15
+ order is descending `(COALESCE(last_activity_at, created_at), id)`.
16
+
17
+ The cursor contains a boundary, not a row lookup, so deleting the boundary pod
18
+ does not invalidate it. It is not an authorization grant: every page still
19
+ applies the authenticated organization, owner and pod-token subtree restrictions.
20
+ Malformed cursors and requests combining `cursor` with `before` return 400.
21
+
22
+ `before` remains the legacy timestamp-only boundary. A new CLI falls back to it
23
+ only when the response omits `nextCursor`; old clients continue working with new
24
+ servers but cannot recover ties or microseconds using their old page walk. Both
25
+ sides must be upgraded for lossless pagination of an unchanged roster.
26
+
27
+ This is a live listing, not a database snapshot. Concurrent activity can move a
28
+ pod ahead of an already-read boundary. The CLI deduplicates IDs if it sees a pod
29
+ again and fails explicitly on a repeated cursor rather than reporting a silently
30
+ truncated roster. Rerun a listing after concurrent activity for a fresh view.
31
+
32
+ ## Manual acceptance (no unit tests)
33
+
34
+ Use an explicit disposable migrated database, never a production fixture insert.
35
+ Run the actual pod routes over loopback HTTP and the built CLI by absolute path:
36
+
37
+ - More than 400 pods with identical activity timestamps, including ties spanning
38
+ multiple pages; every matching ID appears exactly once.
39
+ - Several distinct PostgreSQL timestamps within one millisecond; no IDs disappear
40
+ at the page boundary. Include null activity with creation-time fallback.
41
+ - Empty, short, exact-multiple and final pages; authoritative `nextCursor` works
42
+ even with pages smaller than the CLI's requested maximum.
43
+ - Account, project, template, state, owner, gone-row and pod-token subtree filters
44
+ remain in force on subsequent pages. Archived pods filling an early page do not
45
+ hide active pods on later pages. Check quiet and rendered output.
46
+ - Delete the last pod of one page, then follow its cursor successfully.
47
+ - Malformed cursor and simultaneous `cursor`/`before` return 400.
48
+ - A legacy server omitting `nextCursor` is still traversed with `before`.
49
+ A server repeating a cursor fails without printing an incomplete quiet roster.
50
+
51
+ Live rollout acceptance uses read-only listings. It must not manufacture hundreds
52
+ of billable pods or change existing pods' timestamps to force a page boundary.
@@ -74,6 +74,12 @@ starts at once; the server also opens the gate on its own after a timeout, so a
74
74
  dies mid-seed never strands the pod. Configured projects keep their post-start copy and do not
75
75
  arm the gate.
76
76
 
77
+ A seed only ever fills an empty workdir. When init scripts (or the image) have already
78
+ populated it by the time provisioning finishes, as a template whose init clones its
79
+ repositories does, the server records the seed as `skipped` and starts Pi with the pod. The
80
+ client then sends nothing: no clone request, no archive. Older servers leave the gate armed,
81
+ and the client sends the seed for the routes to refuse.
82
+
77
83
  ## Older servers
78
84
 
79
85
  A server with a strict launch schema rejects the `workspaceSeed` flag; the client retries the
@@ -106,6 +112,7 @@ on the sandbox backend:
106
112
  8. **Nested pod launch** — from inside a pod, launch a child from a source-less directory;
107
113
  symlinks are skipped with a warning, files arrive.
108
114
  9. **Template/init-script collision** — `--template <one whose init script clones>`; expect
109
- `workspace already populated … leaving it in place`.
115
+ `workspace already populated … nothing sent`, no archive build or upload, and the
116
+ pod's `workspaceSeed` reported `skipped`.
110
117
  10. **`--no-seed`, `--dry-run`, `fork`, `--on`** — none create a transfer; `--dry-run` prints
111
118
  the decision and creates no pod.
@@ -1,4 +1,4 @@
1
- .TH "PIPOD\-CONFIG" "5" "October 2026" "0.1.15"
1
+ .TH "PIPOD\-CONFIG" "5" "October 2026" "0.1.17"
2
2
  .SH "NAME"
3
3
  \fBpipod-config\fR \- pi pod configuration files
4
4
  .SH SYNOPSIS
package/man/pipod.1 CHANGED
@@ -1,4 +1,4 @@
1
- .TH "PIPOD" "1" "October 2026" "0.1.15"
1
+ .TH "PIPOD" "1" "October 2026" "0.1.17"
2
2
  .SH "NAME"
3
3
  \fBpipod\fR \- run pi coding\-agent sessions in server\-managed pods
4
4
  .SH SYNOPSIS
@@ -277,7 +277,8 @@ or \.pi\-pod/env\. Private\-remote
277
277
  credentials are forwarded only after a prompt (\fB\-\-yes\fP approves it) and are never stored\.
278
278
  \fB\-\-dry\-run\fP prints the decision without prompting or creating a pod\. Forks, reused pods,
279
279
  \fB\-\-on\fP co\-location, and \fB\-\-no\-seed\fP never seed\. A project with a \.pi\-pod/config\.json gets its
280
- workspace from its init scripts instead\.
280
+ workspace from its init scripts instead\. When a template's init scripts have already
281
+ populated the workspace, nothing is sent\.
281
282
  .P
282
283
  Arguments after \fB\-\-\fP go to pi: prompt words start the session, and \fB\-\-model\fP, \fB\-\-thinking\fP,
283
284
  and \fB\-\-tui\-mode\fP apply to this launch\. Per\-launch Pi resources (\fB\-\-extension\fP, \fB\-\-skill\fP,
package/man/pipod.1.md CHANGED
@@ -266,7 +266,8 @@ or .pi-pod/env. Private-remote
266
266
  credentials are forwarded only after a prompt (`--yes` approves it) and are never stored.
267
267
  `--dry-run` prints the decision without prompting or creating a pod. Forks, reused pods,
268
268
  `--on` co-location, and `--no-seed` never seed. A project with a .pi-pod/config.json gets its
269
- workspace from its init scripts instead.
269
+ workspace from its init scripts instead. When a template's init scripts have already
270
+ populated the workspace, nothing is sent.
270
271
 
271
272
  Arguments after `--` go to pi: prompt words start the session, and `--model`, `--thinking`,
272
273
  and `--tui-mode` apply to this launch. Per-launch Pi resources (`--extension`, `--skill`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pipod/cli",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
4
4
  "description": "Run pi coding-agent sessions in server-managed pods",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",