@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.
- package/dist/cli.js +28 -6
- package/dist/cli.js.map +1 -1
- package/docs/pod-list-pagination.md +52 -0
- package/docs/workspace-seeding.md +8 -1
- package/man/pipod-config.5 +1 -1
- package/man/pipod.1 +3 -2
- package/man/pipod.1.md +2 -1
- package/package.json +1 -1
|
@@ -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 …
|
|
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.
|
package/man/pipod-config.5
CHANGED
package/man/pipod.1
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.TH "PIPOD" "1" "October 2026" "0.1.
|
|
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`,
|