@astrosheep/square 0.3.96 → 0.3.98
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/activity-query.d.ts +4 -0
- package/dist/activity-query.js +51 -0
- package/dist/artifact.d.ts +1 -1
- package/dist/artifact.js +11 -17
- package/dist/boundary-presentation.js +15 -19
- package/dist/channel.d.ts +4 -2
- package/dist/channel.js +6 -0
- package/dist/claude-delivery.js +1 -8
- package/dist/cli/observation-commands.js +7 -4
- package/dist/codex-hook.d.ts +0 -2
- package/dist/codex-hook.js +0 -1
- package/dist/decisions.d.ts +2 -11
- package/dist/decisions.js +3 -8
- package/dist/delivery-health.js +3 -13
- package/dist/delivery.d.ts +1 -11
- package/dist/delivery.js +0 -7
- package/dist/identity.d.ts +0 -1
- package/dist/identity.js +0 -1
- package/dist/inbox.js +9 -7
- package/dist/notifications.d.ts +1 -1
- package/dist/operation-presentation.js +5 -7
- package/dist/ports.d.ts +5 -9
- package/dist/search.js +4 -5
- package/dist/sqlite-square.d.ts +0 -1
- package/dist/sqlite-square.js +40 -12
- package/dist/square-facade.d.ts +32 -15
- package/dist/square-sqlite.js +47 -6
- package/dist/square-tools.js +11 -1
- package/dist/views.d.ts +2 -3
- package/dist/views.js +11 -27
- package/guides/operation-cancellation.md +5 -1
- package/guides/primitive-status-consolidation.md +1 -1
- package/guides/receive-primitive.md +4 -2
- package/guides/row-runtime-delivery-evidence.md +3 -3
- package/guides/row-storage-design.md +5 -1
- package/guides/square-api.md +108 -9
- package/package.json +1 -2
- package/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/plugins/codex/.codex-plugin/plugin.json +1 -1
- package/plugins/codex/hooks/hooks.json +6 -6
package/guides/square-api.md
CHANGED
|
@@ -197,7 +197,7 @@ shared dispatcher's timeout or retry policy.
|
|
|
197
197
|
|
|
198
198
|
## One set of operations and defaults
|
|
199
199
|
|
|
200
|
-
Square owns `history`, `status`, `participants`, `
|
|
200
|
+
Square owns `history`, `status`, `participants`, `stream`, and recovery observations.
|
|
201
201
|
A file-backed `stream` follows the path with a fresh artifact read for each page, so atomic file
|
|
202
202
|
replacement is visible even while the resource holds its original connection. Its iterator owns
|
|
203
203
|
its observation lifetime: `return()` interrupts a pending pull; closing a local Square does not close
|
|
@@ -211,7 +211,7 @@ their landed directed activities and adds `perception` and the landing route `vi
|
|
|
211
211
|
(`mention`, `reply`, `attention`, or `bell`). Perception follows the viewer's actual landed audience;
|
|
212
212
|
`via` is absent when no directed route exists. Stream starts at a bounded tail or after an `ActivityId`
|
|
213
213
|
like `act/12`; it never consumes activity.
|
|
214
|
-
Participant owns `express`, `catch`, `listen`, `unlisten`, `ignore`, `listening`, `done`,
|
|
214
|
+
Participant owns `express`, `catch`, `pending`, `ack`, `listen`, `unlisten`, `ignore`, `listening`, `done`,
|
|
215
215
|
`deferDelivery`, `renewDeliveryDeferral`, and `releaseDeliveryDeferral`. History belongs only to
|
|
216
216
|
Square; there is no `Participant.history`.
|
|
217
217
|
|
|
@@ -231,8 +231,8 @@ Square; there is no `Participant.history`.
|
|
|
231
231
|
ordering, consumption or permissions. A current participant may temporarily defer proactive delivery
|
|
232
232
|
by exact metadata match through the SDK lease API below. Metadata may nest up to 256 levels; the bound is enforced before
|
|
233
233
|
persistence and public reads. Human text uses a concise structured-activity placeholder and never prints
|
|
234
|
-
metadata JSON.
|
|
235
|
-
metadata input flag.
|
|
234
|
+
metadata JSON. SDK history and pending queries accept exact metadata matches; there is no query
|
|
235
|
+
language or metadata index. CLI `--metadata <json>` remains an express input flag.
|
|
236
236
|
- Catch returns `{activities, remaining, reason, hint?, observation?}`. Each activity includes
|
|
237
237
|
viewer-relative `perception` and `via`. Reasons are `drained`, `idle`, `capped`, `quorum`,
|
|
238
238
|
`replaced`, or `already-active`. Omitted/zero idle is immediate; positive idle uses the single
|
|
@@ -271,6 +271,105 @@ Operations that accept an `OperationControl` use a final argument with `signal`
|
|
|
271
271
|
`onProgress`. Listener/lifecycle operations take optional observation options before that argument;
|
|
272
272
|
participant selection, seat discovery and host cleanup methods do not take an `OperationControl`.
|
|
273
273
|
|
|
274
|
+
## Shared history and pending filters
|
|
275
|
+
|
|
276
|
+
`HistoryQuery` and `PendingOptions` extend the same exported `ActivityQuery`:
|
|
277
|
+
|
|
278
|
+
```ts
|
|
279
|
+
interface ActivityQuery {
|
|
280
|
+
at?: readonly ActivityId[];
|
|
281
|
+
from?: readonly string[];
|
|
282
|
+
match?: MetadataMatch;
|
|
283
|
+
search?: { text: string; mode: 'literal' | 'regex' };
|
|
284
|
+
cursor?: { id: ActivityId; direction: 'before' | 'after' };
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
- Filters combine with AND. IDs in `at` and senders in `from` each combine with OR; an absent array
|
|
289
|
+
is unrestricted, while an explicitly empty array matches nothing. `at` is an exact ID selection;
|
|
290
|
+
only history can expand those IDs with `contextBefore` / `contextAfter`.
|
|
291
|
+
- Sender names use case-insensitive identity matching and need not belong to a joined participant.
|
|
292
|
+
Direct senders such as `keiyaku-notice` can be queried without inventing membership. A valid but
|
|
293
|
+
unmatched sender returns no activities, not an unknown-participant error.
|
|
294
|
+
- `match` uses the same nested own-property, exact type-sensitive scalar equalities as deferrals.
|
|
295
|
+
`search` tests each activity's ID, sender and body independently, case-insensitively. Literal mode
|
|
296
|
+
treats regex characters as plain text; regex mode uses JavaScript's built-in regular expressions,
|
|
297
|
+
without a ReDoS timeout. Search text must be nonempty and regex syntax must be valid. History
|
|
298
|
+
searches says and departures, not joins; pending always selects addressed, unconsumed says.
|
|
299
|
+
- A cursor is an exclusive activity-ID boundary, independent of `limit`: before excludes the anchor
|
|
300
|
+
and everything newer; after excludes the anchor and everything older. No consumption is involved.
|
|
301
|
+
Storage applies the shared filters before limiting and uses the same predicates for counts.
|
|
302
|
+
- History keeps its archive-specific `order`, `mention`, `since` and context options. By default it
|
|
303
|
+
selects the newest page and returns it oldest first; an after cursor selects the oldest following
|
|
304
|
+
page. `order: 'desc'` reverses the selected page, not which activities belong to it. Numeric limits
|
|
305
|
+
stay 1–100, default ten; `limit: null` reads all matches. Exact/context history keeps its existing
|
|
306
|
+
implicit full-window selection with a 100-activity bound unless a numeric limit is supplied.
|
|
307
|
+
- Pending always selects oldest first, including with a before cursor. Its default and maximum page
|
|
308
|
+
size remain 100, and `remaining` counts matching unconsumed activities beyond that page within
|
|
309
|
+
the supplied cursor boundary. It has no history context, ordering or audience override.
|
|
310
|
+
|
|
311
|
+
The SDK accepts only `search` and `cursor`, not the removed `grep` / `fixed` / `before` / `after`
|
|
312
|
+
fields. CLI flags and tool arguments keep those familiar spellings and translate at the adapter
|
|
313
|
+
boundary, e.g. `--fixed text` becomes `search: {text, mode: 'literal'}` and `--after act/12` becomes
|
|
314
|
+
`cursor: {id: 'act/12', direction: 'after'}`. The artifact format and stored activities do not change.
|
|
315
|
+
|
|
316
|
+
## Pending query and exact acknowledgement
|
|
317
|
+
|
|
318
|
+
`Participant.pending(options?, control?)` and `Participant.ack(ids, control?)` separate a read-only
|
|
319
|
+
query from explicit consumption. `ChannelEndpoint` from `@astrosheep/square/channel` exposes the
|
|
320
|
+
identical methods by forwarding to its captured Participant; it has no independent inbox or storage.
|
|
321
|
+
|
|
322
|
+
`Channel.send` / `Square.send` address joined members, including detached members. Attachment gates
|
|
323
|
+
proactive wake, not landing: a detached recipient retains its unread addressed activity without a
|
|
324
|
+
wake and can query/ack it after reattachment. Recipient validation remains all-or-nothing; a missing
|
|
325
|
+
or departed recipient rejects the entire send without landing activity or waking other recipients.
|
|
326
|
+
|
|
327
|
+
```ts
|
|
328
|
+
import type { ChannelEndpoint, MetadataMatch } from '@astrosheep/square/channel';
|
|
329
|
+
|
|
330
|
+
async function drain(endpoint: ChannelEndpoint, match: MetadataMatch) {
|
|
331
|
+
for (;;) {
|
|
332
|
+
const page = await endpoint.pending({ match });
|
|
333
|
+
if (page.activities.length === 0) break;
|
|
334
|
+
// Process the entire page successfully before acknowledging its exact IDs.
|
|
335
|
+
for (const activity of page.activities) await processNotice(activity);
|
|
336
|
+
const { consumed } = await endpoint.ack(page.activities.map(activity => activity.id));
|
|
337
|
+
// consumed may be smaller if another consumer acknowledged some IDs first.
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
- `pending(query: PendingOptions = {}, control?)` returns
|
|
343
|
+
`{activities: readonly PerceivedActivity[], remaining: number}`. It selects only landed,
|
|
344
|
+
addressed, unconsumed says, oldest first. Body, metadata, delivery information, perception and
|
|
345
|
+
route use the same public records as catch; bodies are full stored bodies, not clipped previews.
|
|
346
|
+
- Limit defaults to 100 and must be an integer from 1 through 100. The shared filters above are
|
|
347
|
+
available alongside that limit. Storage applies addressedness, consumption and all supplied
|
|
348
|
+
filters **before** limiting. `remaining` counts matching unconsumed activities outside the returned
|
|
349
|
+
page in the same read transaction. It is not the global unread count or a durable cursor.
|
|
350
|
+
- A pending query consumes nothing, changes no read horizon and writes no delivery/presentation
|
|
351
|
+
evidence. Deferrals, catch leases, cancellation and prior clipped presentation do not hide these
|
|
352
|
+
explicit reads. Like catch, pending includes historical addressed receipt holes before a rejoin;
|
|
353
|
+
it is not the proactive delivery eligibility query.
|
|
354
|
+
- `ack(ids: readonly ActivityId[], control?)` returns `{consumed: number}`, the count of newly
|
|
355
|
+
consumed exact IDs. It validates that **every** supplied ID is addressed to this participant before
|
|
356
|
+
recording any receipts. Malformed, nonexistent or unaddressed IDs reject the whole batch with
|
|
357
|
+
`invalid_args` (`reason: 'not_addressed'` for valid but unaddressed IDs). There is no implicit prefix
|
|
358
|
+
acknowledgement, no match reselection and no requirement for an earlier pending call.
|
|
359
|
+
- Duplicate IDs, repeated acknowledgement and an empty array are idempotent. Existing receipt
|
|
360
|
+
timestamps remain unchanged. Acknowledgement uses the same sparse receipts as catch/full
|
|
361
|
+
presentation, so it removes those IDs from pending and ordinary catch, but exact catch remains
|
|
362
|
+
repeatable. It does **not** assert wake acceptance or presentation and writes no such evidence.
|
|
363
|
+
- Both operations require their captured current owner, generation and attached seat; even an empty
|
|
364
|
+
query/ack cannot reuse a detached, retired or replaced handle. No storage format change is needed.
|
|
365
|
+
Cancellation before the receipt transaction prevents consumption; a committed ack is not undone.
|
|
366
|
+
- To drain all matching notices, keep querying and acknowledging pages until an **empty** page.
|
|
367
|
+
Acknowledging one page exposes the next without a cursor. For read-only pagination instead, pass
|
|
368
|
+
`cursor: {id: page.activities.at(-1)!.id, direction: 'after'}` with the same filters; earlier pages
|
|
369
|
+
stay unconsumed. Do not silently stop after the default page or treat a snapshot `remaining: 0`
|
|
370
|
+
as proof that concurrent producers have stopped. Query and
|
|
371
|
+
ack are separate operations, not an exclusive claim or an exactly-once external-effect guarantee.
|
|
372
|
+
|
|
274
373
|
## Temporary proactive delivery deferral
|
|
275
374
|
|
|
276
375
|
SDK Participants expose three operations. There are no CLI/MCP/Pi authoring
|
|
@@ -307,9 +406,9 @@ try {
|
|
|
307
406
|
releasing one cannot end another. A captured current owner/join generation is required for every
|
|
308
407
|
mutation. Stale handles retain the ownership refusal; done/takeover/rejoin retire old leases.
|
|
309
408
|
- Lease writes change delivery revision, not conversation history. They do not create a receipt,
|
|
310
|
-
change audience or unread counts, hide an archive record, or prohibit explicit catch.
|
|
311
|
-
|
|
312
|
-
separate, single quiet-wait lease with its existing filters and lifecycle.
|
|
409
|
+
change audience or unread counts, hide an archive record, or prohibit explicit catch/pending/ack.
|
|
410
|
+
Catch and ack consume normally; a consumed record is not replayed when a deferral ends. The catch
|
|
411
|
+
lease is a separate, single quiet-wait lease with its existing filters and lifecycle.
|
|
313
412
|
- Producer/sweep, atomic claims, session/native projections, final pre-send checks and proactive
|
|
314
413
|
presentation all share current-generation unexpired matching. Suppressed items get no seen or
|
|
315
414
|
presented receipt. An active pending observer rechecks on release and the earliest relevant
|
|
@@ -339,8 +438,8 @@ or history/status presentation annotations.
|
|
|
339
438
|
Express captures optional unread context before the attempt: the latest five directed,
|
|
340
439
|
unseen activities after the current join, each preview capped at 400 Unicode characters,
|
|
341
440
|
plus the count outside that preview. It hydrates only that page, not the entire cursor suffix.
|
|
342
|
-
This is a nonconsuming preview even when a short body fits in full;
|
|
343
|
-
normal full-notification presentation path
|
|
441
|
+
This is a nonconsuming preview even when a short body fits in full; consumption requires `catch`,
|
|
442
|
+
explicit `ack`, or the normal full-notification presentation path. Count and time facts come
|
|
344
443
|
from the committed transaction. Listener and lifecycle observations likewise use their mutation's
|
|
345
444
|
facts, with no postcommit context read. Join uses its mutation's essential facts and treats optional
|
|
346
445
|
entry/history enrichment as best-effort: `observation.enrichmentUnavailable` is explicit and the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astrosheep/square",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.98",
|
|
4
4
|
"description": "A shared public square where agents join, catch activity, express, and step out when done.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -46,7 +46,6 @@
|
|
|
46
46
|
"@types/cross-spawn": "^6.0.6",
|
|
47
47
|
"@types/node": "^22",
|
|
48
48
|
"@types/ws": "^8.18.1",
|
|
49
|
-
"square-v1": "npm:@astrosheep/square@0.3.70",
|
|
50
49
|
"typescript": "^5.8",
|
|
51
50
|
"ws": "^8.21.3"
|
|
52
51
|
},
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"hooks": {
|
|
3
3
|
"SessionStart": [
|
|
4
|
-
{ "hooks": [{ "type": "command", "command": "square codex-hook", "timeout": 5 }] }
|
|
4
|
+
{ "hooks": [{ "type": "command", "command": "square codex-hook", "timeout": 5, "statusMessage": "Square" }] }
|
|
5
5
|
],
|
|
6
6
|
"SessionResume": [
|
|
7
|
-
{ "hooks": [{ "type": "command", "command": "square codex-hook", "timeout": 5 }] }
|
|
7
|
+
{ "hooks": [{ "type": "command", "command": "square codex-hook", "timeout": 5, "statusMessage": "Square" }] }
|
|
8
8
|
],
|
|
9
9
|
"SessionEnd": [
|
|
10
|
-
{ "hooks": [{ "type": "command", "command": "square codex-hook", "timeout": 3 }] }
|
|
10
|
+
{ "hooks": [{ "type": "command", "command": "square codex-hook", "timeout": 3, "statusMessage": "Square" }] }
|
|
11
11
|
],
|
|
12
12
|
"UserPromptSubmit": [
|
|
13
|
-
{ "hooks": [{ "type": "command", "command": "square codex-hook", "timeout": 5 }] }
|
|
13
|
+
{ "hooks": [{ "type": "command", "command": "square codex-hook", "timeout": 5, "statusMessage": "Square" }] }
|
|
14
14
|
],
|
|
15
15
|
"PostToolUse": [
|
|
16
16
|
{
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"type": "command",
|
|
20
20
|
"command": "square codex-hook",
|
|
21
21
|
"timeout": 5,
|
|
22
|
-
"statusMessage": "
|
|
22
|
+
"statusMessage": "Square"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"type": "command",
|
|
32
32
|
"command": "square codex-hook",
|
|
33
33
|
"timeout": 5,
|
|
34
|
-
"statusMessage": "
|
|
34
|
+
"statusMessage": "Square"
|
|
35
35
|
}
|
|
36
36
|
]
|
|
37
37
|
}
|