Merge current master into PR #106
This commit is contained in:
@@ -8,6 +8,6 @@ Zero-dependency primitives shared across the other groups. A package lands here
|
||||
| `paths/` | Shared filesystem path constants and helpers for harness user data |
|
||||
| `timeout/` | The timing/classification half of a timeout — `clampTimeout`/`deadline`/`timeoutOf`/`TimeoutReason` (pure functions, no harness deps); termination stays in each capability |
|
||||
|
||||
`dsh-brand` is the canonical case: it owns ONLY the `Branded<B>` helper, so a capability package can brand the ids it owns (`dsh-bash`'s `BashTaskId`/`OwnerToken`, `dsh-session`'s `SessionId`, …) by depending on `dsh-brand` alone, without pulling in an unrelated package just to reach `Branded`.
|
||||
`dsh-brand` is the canonical case: it owns ONLY the `Branded<B>` helper, so a capability package can brand the ids it owns (`dsh-tasks`'s `TaskId`, `dsh-session`'s `SessionId`, …) by depending on `dsh-brand` alone, without pulling in an unrelated package just to reach `Branded`.
|
||||
|
||||
`dsh-timeout` follows the same shape for the timeout family: `dsh-bash` and `dsh-web-fetch-local` each fuse a caller's cancellation with a deadline and later classify "timed out" vs "cancelled" by depending on `dsh-timeout` alone. It deliberately owns only the timing/classification half — the *termination* (SIGKILL a process group, tear down a fetch socket) stays in each capability, because no shared layer can own every capability's kill (see [the timeout-library RFC](../../docs/rfc/implemented/architecture/2026-07-06-timeout-deadline-library.md)).
|
||||
|
||||
@@ -17,10 +17,10 @@ export function SessionId(id: string): SessionId {
|
||||
}
|
||||
```
|
||||
|
||||
Construction goes through the per-id factory in the OWNING package (a plain cast inside — zero runtime cost). Comparison, logging, JSON serialization, and the wire format all behave exactly as for an ordinary string; the brand is erased at compile time.
|
||||
Construction goes through the per-id factory in the owning package. Comparison, logging, JSON serialization, and the wire format behave as for an ordinary string; the brand is erased at compile time.
|
||||
|
||||
## Policy: brand ids that cross package boundaries
|
||||
|
||||
A package brands the ids it OWNS — `CallId` in `dsh-llm` (tool-call correlation), `SessionId` in `dsh-session`, `AgentId` in `dsh-agent`, `BashTaskId`/`OwnerToken` in `dsh-bash`. Branding is for ids that cross package boundaries and could plausibly be confused; **not every string needs a brand.**
|
||||
A package brands the ids it owns — `CallId` in `dsh-llm`, `SessionId` in `dsh-session`, `AgentId` in `dsh-agent`, and `TaskId` in `dsh-tasks`. Brand cross-package ids that could plausibly be confused; not every string needs one.
|
||||
|
||||
This package owns ONLY the primitive — no concrete id, no runtime code beyond the (erased) type. Keeping the primitive dependency-free is the point: a capability package can brand its ids without depending on an unrelated package. `dsh-bash`, for example, brands `BashTaskId`/`OwnerToken` by depending on `dsh-brand` alone — it never pulls in `dsh-llm` (or `dsh-session`) just to reach `Branded`.
|
||||
This package owns only the primitive. Keeping it dependency-free lets `dsh-tasks`, for example, brand `TaskId` without importing an unrelated capability package merely to reach `Branded`.
|
||||
|
||||
@@ -1,9 +1,23 @@
|
||||
/**
|
||||
* Dependency-free nominal typing for cross-boundary identifiers. Structurally identical runtime
|
||||
* strings become non-interchangeable statically while retaining ordinary comparison, logging, and
|
||||
* serialization. Each owning package defines its concrete id and zero-cost factory; brand ids that
|
||||
* can plausibly be confused across packages, not arbitrary strings. This package exports only the
|
||||
* erased primitive so an owner need not depend on another capability package.
|
||||
* The `Branded<B>` nominal-typing primitive — a type-only utility (no runtime
|
||||
* code, no harness-package dependency) shared by every package that owns a
|
||||
* cross-boundary id.
|
||||
*
|
||||
* A brand makes structurally-identical strings non-interchangeable at the type
|
||||
* level: an `AgentId` cannot be passed where a `CallId` is expected, even
|
||||
* though both are plain strings at runtime. Construction goes through a per-id
|
||||
* factory in the OWNING package (a plain cast inside — zero runtime cost);
|
||||
* comparison, logging, and serialization all behave as ordinary strings.
|
||||
*
|
||||
* Policy: a package brands the ids it owns — `CallId` in dsh-llm (tool-call
|
||||
* correlation), `SessionId` in dsh-session, `AgentId` in dsh-agent, and
|
||||
* `TaskId` in dsh-tasks. Branding is for ids that cross package boundaries and
|
||||
* could plausibly be confused; not every string needs a brand.
|
||||
* This package owns ONLY the primitive — no concrete id, no runtime code beyond
|
||||
* the (erased) type — so the brand vocabulary stays dependency-free and a
|
||||
* package can brand its ids without depending on an unrelated capability
|
||||
* package.
|
||||
*
|
||||
* @module @deepseek-ai/dsh-brand
|
||||
*/
|
||||
|
||||
|
||||
Reference in New Issue
Block a user