@chipschat/protocol 0.0.0-stage → 1.0.1
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/LICENSE +201 -0
- package/README.md +56 -2
- package/dist/generated/types.d.ts +4052 -0
- package/dist/generated/types.d.ts.map +1 -0
- package/dist/generated/types.js +7 -0
- package/dist/generated/types.js.map +1 -0
- package/dist/src/address.d.ts +106 -0
- package/dist/src/address.d.ts.map +1 -0
- package/dist/src/address.js +141 -0
- package/dist/src/address.js.map +1 -0
- package/dist/src/agent-context-windows.d.ts +235 -0
- package/dist/src/agent-context-windows.d.ts.map +1 -0
- package/dist/src/agent-context-windows.js +213 -0
- package/dist/src/agent-context-windows.js.map +1 -0
- package/dist/src/agent-heartbeats.d.ts +106 -0
- package/dist/src/agent-heartbeats.d.ts.map +1 -0
- package/dist/src/agent-heartbeats.js +111 -0
- package/dist/src/agent-heartbeats.js.map +1 -0
- package/dist/src/agent-models.d.ts +158 -0
- package/dist/src/agent-models.d.ts.map +1 -0
- package/dist/src/agent-models.js +171 -0
- package/dist/src/agent-models.js.map +1 -0
- package/dist/src/agent-place.d.ts +76 -0
- package/dist/src/agent-place.d.ts.map +1 -0
- package/dist/src/agent-place.js +80 -0
- package/dist/src/agent-place.js.map +1 -0
- package/dist/src/agents.d.ts +24 -0
- package/dist/src/agents.d.ts.map +1 -0
- package/dist/src/agents.js +58 -0
- package/dist/src/agents.js.map +1 -0
- package/dist/src/capabilities.d.ts +121 -0
- package/dist/src/capabilities.d.ts.map +1 -0
- package/dist/src/capabilities.js +120 -0
- package/dist/src/capabilities.js.map +1 -0
- package/dist/src/checklist.d.ts +19 -0
- package/dist/src/checklist.d.ts.map +1 -0
- package/dist/src/checklist.js +22 -0
- package/dist/src/checklist.js.map +1 -0
- package/dist/src/commands.d.ts +50 -0
- package/dist/src/commands.d.ts.map +1 -0
- package/dist/src/commands.js +274 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/connectors.d.ts +90 -0
- package/dist/src/connectors.d.ts.map +1 -0
- package/dist/src/connectors.js +119 -0
- package/dist/src/connectors.js.map +1 -0
- package/dist/src/context-files.d.ts +304 -0
- package/dist/src/context-files.d.ts.map +1 -0
- package/dist/src/context-files.js +247 -0
- package/dist/src/context-files.js.map +1 -0
- package/dist/src/context.d.ts +369 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +526 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/direct-asks.d.ts +36 -0
- package/dist/src/direct-asks.d.ts.map +1 -0
- package/dist/src/direct-asks.js +43 -0
- package/dist/src/direct-asks.js.map +1 -0
- package/dist/src/envelope.d.ts +70 -0
- package/dist/src/envelope.d.ts.map +1 -0
- package/dist/src/envelope.js +46 -0
- package/dist/src/envelope.js.map +1 -0
- package/dist/src/events/catalogue.d.ts +50 -0
- package/dist/src/events/catalogue.d.ts.map +1 -0
- package/dist/src/events/catalogue.js +70 -0
- package/dist/src/events/catalogue.js.map +1 -0
- package/dist/src/events/chips-to-harness.d.ts +37 -0
- package/dist/src/events/chips-to-harness.d.ts.map +1 -0
- package/dist/src/events/chips-to-harness.js +511 -0
- package/dist/src/events/chips-to-harness.js.map +1 -0
- package/dist/src/events/harness-to-chips.d.ts +38 -0
- package/dist/src/events/harness-to-chips.d.ts.map +1 -0
- package/dist/src/events/harness-to-chips.js +593 -0
- package/dist/src/events/harness-to-chips.js.map +1 -0
- package/dist/src/events/index.d.ts +6 -0
- package/dist/src/events/index.d.ts.map +1 -0
- package/dist/src/events/index.js +5 -0
- package/dist/src/events/index.js.map +1 -0
- package/dist/src/events/workspace.d.ts +222 -0
- package/dist/src/events/workspace.d.ts.map +1 -0
- package/dist/src/events/workspace.js +1039 -0
- package/dist/src/events/workspace.js.map +1 -0
- package/dist/src/exchange.d.ts +262 -0
- package/dist/src/exchange.d.ts.map +1 -0
- package/dist/src/exchange.js +413 -0
- package/dist/src/exchange.js.map +1 -0
- package/dist/src/first-names.d.ts +29 -0
- package/dist/src/first-names.d.ts.map +1 -0
- package/dist/src/first-names.js +80 -0
- package/dist/src/first-names.js.map +1 -0
- package/dist/src/frames.d.ts +526 -0
- package/dist/src/frames.d.ts.map +1 -0
- package/dist/src/frames.js +346 -0
- package/dist/src/frames.js.map +1 -0
- package/dist/src/harness-jobs.d.ts +313 -0
- package/dist/src/harness-jobs.d.ts.map +1 -0
- package/dist/src/harness-jobs.js +210 -0
- package/dist/src/harness-jobs.js.map +1 -0
- package/dist/src/ids/index.d.ts +3 -0
- package/dist/src/ids/index.d.ts.map +1 -0
- package/dist/src/ids/index.js +2 -0
- package/dist/src/ids/index.js.map +1 -0
- package/dist/src/ids/ulid.d.ts +96 -0
- package/dist/src/ids/ulid.d.ts.map +1 -0
- package/dist/src/ids/ulid.js +212 -0
- package/dist/src/ids/ulid.js.map +1 -0
- package/dist/src/index.d.ts +81 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +47 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/invite-link.d.ts +64 -0
- package/dist/src/invite-link.d.ts.map +1 -0
- package/dist/src/invite-link.js +99 -0
- package/dist/src/invite-link.js.map +1 -0
- package/dist/src/join.d.ts +188 -0
- package/dist/src/join.d.ts.map +1 -0
- package/dist/src/join.js +190 -0
- package/dist/src/join.js.map +1 -0
- package/dist/src/limits.d.ts +50 -0
- package/dist/src/limits.d.ts.map +1 -0
- package/dist/src/limits.js +106 -0
- package/dist/src/limits.js.map +1 -0
- package/dist/src/matters.d.ts +22 -0
- package/dist/src/matters.d.ts.map +1 -0
- package/dist/src/matters.js +26 -0
- package/dist/src/matters.js.map +1 -0
- package/dist/src/mentions.d.ts +63 -0
- package/dist/src/mentions.d.ts.map +1 -0
- package/dist/src/mentions.js +129 -0
- package/dist/src/mentions.js.map +1 -0
- package/dist/src/names.d.ts +58 -0
- package/dist/src/names.d.ts.map +1 -0
- package/dist/src/names.js +192 -0
- package/dist/src/names.js.map +1 -0
- package/dist/src/no-reply.d.ts +17 -0
- package/dist/src/no-reply.d.ts.map +1 -0
- package/dist/src/no-reply.js +48 -0
- package/dist/src/no-reply.js.map +1 -0
- package/dist/src/notifications.d.ts +81 -0
- package/dist/src/notifications.d.ts.map +1 -0
- package/dist/src/notifications.js +65 -0
- package/dist/src/notifications.js.map +1 -0
- package/dist/src/pages.d.ts +32 -0
- package/dist/src/pages.d.ts.map +1 -0
- package/dist/src/pages.js +32 -0
- package/dist/src/pages.js.map +1 -0
- package/dist/src/pairing.d.ts +99 -0
- package/dist/src/pairing.d.ts.map +1 -0
- package/dist/src/pairing.js +163 -0
- package/dist/src/pairing.js.map +1 -0
- package/dist/src/primitives.d.ts +267 -0
- package/dist/src/primitives.d.ts.map +1 -0
- package/dist/src/primitives.js +279 -0
- package/dist/src/primitives.js.map +1 -0
- package/dist/src/project.d.ts +335 -0
- package/dist/src/project.d.ts.map +1 -0
- package/dist/src/project.js +499 -0
- package/dist/src/project.js.map +1 -0
- package/dist/src/ranges.d.ts +31 -0
- package/dist/src/ranges.d.ts.map +1 -0
- package/dist/src/ranges.js +51 -0
- package/dist/src/ranges.js.map +1 -0
- package/dist/src/relay.d.ts +177 -0
- package/dist/src/relay.d.ts.map +1 -0
- package/dist/src/relay.js +147 -0
- package/dist/src/relay.js.map +1 -0
- package/dist/src/room-files.d.ts +146 -0
- package/dist/src/room-files.d.ts.map +1 -0
- package/dist/src/room-files.js +135 -0
- package/dist/src/room-files.js.map +1 -0
- package/dist/src/room-note.d.ts +213 -0
- package/dist/src/room-note.d.ts.map +1 -0
- package/dist/src/room-note.js +457 -0
- package/dist/src/room-note.js.map +1 -0
- package/dist/src/space-icons.d.ts +68 -0
- package/dist/src/space-icons.d.ts.map +1 -0
- package/dist/src/space-icons.js +142 -0
- package/dist/src/space-icons.js.map +1 -0
- package/dist/src/spend.d.ts +57 -0
- package/dist/src/spend.d.ts.map +1 -0
- package/dist/src/spend.js +94 -0
- package/dist/src/spend.js.map +1 -0
- package/dist/src/visibility.d.ts +170 -0
- package/dist/src/visibility.d.ts.map +1 -0
- package/dist/src/visibility.js +218 -0
- package/dist/src/visibility.js.map +1 -0
- package/fixtures/agent.asked.json +15 -0
- package/fixtures/agent.attached.json +15 -0
- package/fixtures/agent.deleted.json +16 -0
- package/fixtures/agent.fork.json +14 -0
- package/fixtures/agent.lock_set.json +13 -0
- package/fixtures/agent.registered.json +17 -0
- package/fixtures/agent.released.json +16 -0
- package/fixtures/agent.updated.json +14 -0
- package/fixtures/approval.executed.json +16 -0
- package/fixtures/approval.request.json +45 -0
- package/fixtures/approval.resolved.json +20 -0
- package/fixtures/approval.routed.json +20 -0
- package/fixtures/artifact.create.json +18 -0
- package/fixtures/attachment.fetched.json +15 -0
- package/fixtures/attachment.limits_set.json +15 -0
- package/fixtures/budget.warning.json +20 -0
- package/fixtures/checkpoint.json +16 -0
- package/fixtures/context.compacted.json +16 -0
- package/fixtures/context.usage.json +17 -0
- package/fixtures/exchange.limits_set.json +15 -0
- package/fixtures/exchange.set.json +13 -0
- package/fixtures/feedback.json +21 -0
- package/fixtures/frames/ack.json +6 -0
- package/fixtures/frames/context.edit.json +11 -0
- package/fixtures/frames/context_window.change.json +9 -0
- package/fixtures/frames/context_window.compact.json +8 -0
- package/fixtures/frames/error.json +6 -0
- package/fixtures/frames/event.json +20 -0
- package/fixtures/frames/events.json +39 -0
- package/fixtures/frames/folder.open.json +6 -0
- package/fixtures/frames/folder.open.page.json +7 -0
- package/fixtures/frames/folder.run.json +8 -0
- package/fixtures/frames/folder.run_state.json +12 -0
- package/fixtures/frames/heartbeat.change.json +10 -0
- package/fixtures/frames/hello.json +18 -0
- package/fixtures/frames/job.change.json +9 -0
- package/fixtures/frames/join.json +19 -0
- package/fixtures/frames/model.change.json +10 -0
- package/fixtures/frames/ping.json +4 -0
- package/fixtures/frames/pong.json +4 -0
- package/fixtures/frames/presence.json +12 -0
- package/fixtures/frames/receipt.json +5 -0
- package/fixtures/frames/restart.json +5 -0
- package/fixtures/frames/subscribe.json +6 -0
- package/fixtures/handoff.json +20 -0
- package/fixtures/harness.removed.json +15 -0
- package/fixtures/harness.transferred.json +15 -0
- package/fixtures/hello.json +61 -0
- package/fixtures/join.allowed.json +20 -0
- package/fixtures/join.denied.json +17 -0
- package/fixtures/lane.updated.json +17 -0
- package/fixtures/membership.added.json +16 -0
- package/fixtures/membership.removed.json +14 -0
- package/fixtures/membership.replaced.json +15 -0
- package/fixtures/message.deleted.json +15 -0
- package/fixtures/message.edited.json +15 -0
- package/fixtures/message.handed.json +14 -0
- package/fixtures/message.heard.json +14 -0
- package/fixtures/message.held.json +14 -0
- package/fixtures/message.hidden.json +14 -0
- package/fixtures/message.new.json +96 -0
- package/fixtures/message.overheard.json +22 -0
- package/fixtures/message.pinned.json +14 -0
- package/fixtures/message.post.json +14 -0
- package/fixtures/message.shown.json +14 -0
- package/fixtures/message.unpinned.json +14 -0
- package/fixtures/person.face_set.json +17 -0
- package/fixtures/person.joined.json +16 -0
- package/fixtures/person.removed.json +16 -0
- package/fixtures/person.renamed.json +14 -0
- package/fixtures/policy.updated.json +30 -0
- package/fixtures/project.changed.json +21 -0
- package/fixtures/question.answered.json +23 -0
- package/fixtures/question.ask.json +37 -0
- package/fixtures/receipt.json +15 -0
- package/fixtures/relay.set.json +12 -0
- package/fixtures/role.changed.json +15 -0
- package/fixtures/run.cancel.json +15 -0
- package/fixtures/run.completed.json +20 -0
- package/fixtures/run.failed.json +20 -0
- package/fixtures/run.pause.json +15 -0
- package/fixtures/run.plan.json +24 -0
- package/fixtures/run.requested.json +34 -0
- package/fixtures/run.resume.json +15 -0
- package/fixtures/run.started.json +33 -0
- package/fixtures/run.status.json +17 -0
- package/fixtures/run.steer.json +21 -0
- package/fixtures/session.ended.json +15 -0
- package/fixtures/session.renamed.json +15 -0
- package/fixtures/session.started.json +17 -0
- package/fixtures/space.claimed.json +15 -0
- package/fixtures/space.created.json +14 -0
- package/fixtures/space.erased.json +13 -0
- package/fixtures/space.lead_set.json +13 -0
- package/fixtures/space.lock_set.json +13 -0
- package/fixtures/space.spend_ceiling_set.json +13 -0
- package/fixtures/space.updated.json +14 -0
- package/fixtures/step.log.json +26 -0
- package/fixtures/task.json +22 -0
- package/fixtures/turn.passed.json +14 -0
- package/fixtures/usage.json +21 -0
- package/fixtures/workspace.renamed.json +13 -0
- package/generated/agent-connect.json +13966 -0
- package/generated/schema/agent.asked.json +114 -0
- package/generated/schema/agent.attached.json +465 -0
- package/generated/schema/agent.deleted.json +127 -0
- package/generated/schema/agent.fork.json +107 -0
- package/generated/schema/agent.lock_set.json +105 -0
- package/generated/schema/agent.registered.json +130 -0
- package/generated/schema/agent.released.json +129 -0
- package/generated/schema/agent.updated.json +151 -0
- package/generated/schema/approval.executed.json +125 -0
- package/generated/schema/approval.request.json +279 -0
- package/generated/schema/approval.resolved.json +162 -0
- package/generated/schema/approval.routed.json +185 -0
- package/generated/schema/artifact.create.json +206 -0
- package/generated/schema/attachment.fetched.json +114 -0
- package/generated/schema/attachment.limits_set.json +136 -0
- package/generated/schema/budget.warning.json +152 -0
- package/generated/schema/checkpoint.json +111 -0
- package/generated/schema/context.compacted.json +124 -0
- package/generated/schema/context.usage.json +120 -0
- package/generated/schema/exchange.limits_set.json +127 -0
- package/generated/schema/exchange.set.json +144 -0
- package/generated/schema/feedback.json +173 -0
- package/generated/schema/handoff.json +122 -0
- package/generated/schema/harness.removed.json +122 -0
- package/generated/schema/harness.transferred.json +117 -0
- package/generated/schema/hello.json +509 -0
- package/generated/schema/join.allowed.json +176 -0
- package/generated/schema/join.denied.json +150 -0
- package/generated/schema/lane.updated.json +223 -0
- package/generated/schema/membership.added.json +153 -0
- package/generated/schema/membership.removed.json +126 -0
- package/generated/schema/membership.replaced.json +106 -0
- package/generated/schema/message.deleted.json +105 -0
- package/generated/schema/message.edited.json +107 -0
- package/generated/schema/message.handed.json +111 -0
- package/generated/schema/message.heard.json +100 -0
- package/generated/schema/message.held.json +181 -0
- package/generated/schema/message.hidden.json +100 -0
- package/generated/schema/message.new.json +1369 -0
- package/generated/schema/message.overheard.json +701 -0
- package/generated/schema/message.pinned.json +100 -0
- package/generated/schema/message.post.json +290 -0
- package/generated/schema/message.shown.json +100 -0
- package/generated/schema/message.unpinned.json +100 -0
- package/generated/schema/person.face_set.json +134 -0
- package/generated/schema/person.joined.json +128 -0
- package/generated/schema/person.removed.json +133 -0
- package/generated/schema/person.renamed.json +114 -0
- package/generated/schema/policy.updated.json +277 -0
- package/generated/schema/project.changed.json +199 -0
- package/generated/schema/question.answered.json +154 -0
- package/generated/schema/question.ask.json +194 -0
- package/generated/schema/receipt.json +109 -0
- package/generated/schema/relay.set.json +99 -0
- package/generated/schema/role.changed.json +116 -0
- package/generated/schema/run.cancel.json +106 -0
- package/generated/schema/run.completed.json +139 -0
- package/generated/schema/run.failed.json +135 -0
- package/generated/schema/run.pause.json +106 -0
- package/generated/schema/run.plan.json +128 -0
- package/generated/schema/run.requested.json +309 -0
- package/generated/schema/run.resume.json +106 -0
- package/generated/schema/run.started.json +142 -0
- package/generated/schema/run.status.json +120 -0
- package/generated/schema/run.steer.json +163 -0
- package/generated/schema/session.ended.json +106 -0
- package/generated/schema/session.renamed.json +108 -0
- package/generated/schema/session.started.json +116 -0
- package/generated/schema/space.claimed.json +107 -0
- package/generated/schema/space.created.json +148 -0
- package/generated/schema/space.erased.json +129 -0
- package/generated/schema/space.lead_set.json +108 -0
- package/generated/schema/space.lock_set.json +99 -0
- package/generated/schema/space.spend_ceiling_set.json +102 -0
- package/generated/schema/space.updated.json +112 -0
- package/generated/schema/step.log.json +187 -0
- package/generated/schema/task.json +268 -0
- package/generated/schema/turn.passed.json +99 -0
- package/generated/schema/usage.json +155 -0
- package/generated/schema/workspace.renamed.json +107 -0
- package/generated/types.ts +4178 -0
- package/package.json +38 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-jobs.d.ts","sourceRoot":"","sources":["../../src/harness-jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A harness's own jobs (ADR 0252): what it runs by itself, outside any space, on a schedule of its
|
|
3
|
+
* own. OpenClaw's are its Main agent's Heartbeat, Dreaming and a Skill review for each agent.
|
|
4
|
+
*
|
|
5
|
+
* Nothing about a job is Chips'. A harness that declares `jobs` sends a copy of all of them
|
|
6
|
+
* (`PUT /v1/harnesses/:id/jobs`), whole, and posts each run it finishes (`POST …/jobs/runs`),
|
|
7
|
+
* which Chips keeps for `JOB_RUNS_KEPT_DAYS`. A person's change goes down the harness's socket as
|
|
8
|
+
* a `job.change` frame, and is done when the harness sends its copy again, answering it.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { id, isoTimestamp } from "./primitives.js";
|
|
12
|
+
/** The most jobs a harness's copy lists. */
|
|
13
|
+
export const HARNESS_JOBS_MAX = 24;
|
|
14
|
+
/** The most intervals a job offers a person. */
|
|
15
|
+
export const JOB_CHOICES_MAX = 12;
|
|
16
|
+
/** The longest interval, in minutes: a year. */
|
|
17
|
+
export const JOB_EVERY_MAX = 525_600;
|
|
18
|
+
/** The most runs one post carries. */
|
|
19
|
+
export const JOB_RUNS_POST_MAX = 200;
|
|
20
|
+
/** The most runs one read gives. */
|
|
21
|
+
export const JOB_RUNS_READ_MAX = 500;
|
|
22
|
+
/** How long Chips keeps a run, in days: a harness that keeps a week can still be read for two. */
|
|
23
|
+
export const JOB_RUNS_KEPT_DAYS = 90;
|
|
24
|
+
/**
|
|
25
|
+
* How long a change waits for its harness's answer, as a heartbeat's does (ADR 0143). After it the
|
|
26
|
+
* change reads as missed; an answer after it still counts, and a new change may be asked.
|
|
27
|
+
*/
|
|
28
|
+
export const JOB_CHANGE_WAIT_MS = 60_000;
|
|
29
|
+
/** What a job does, for the mark its row wears. */
|
|
30
|
+
export const JOB_KINDS = ["heartbeat", "memory", "skills", "other"];
|
|
31
|
+
export const jobKind = z.enum(JOB_KINDS);
|
|
32
|
+
/** How a run ended. */
|
|
33
|
+
export const JOB_RUN_OUTCOMES = ["done", "failed", "stopped"];
|
|
34
|
+
export const jobRunOutcome = z.enum(JOB_RUN_OUTCOMES);
|
|
35
|
+
export const jobId = z
|
|
36
|
+
.string()
|
|
37
|
+
.regex(/^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$/, "expected a job id")
|
|
38
|
+
.describe("The harness's own id for a job: stable, up to 80 letters, digits, `.`, `_`, `:` or `-`.");
|
|
39
|
+
const minutes = z.int().min(1).max(JOB_EVERY_MAX);
|
|
40
|
+
const ascending = (choices) => choices.every((each, at) => at === 0 || each > (choices[at - 1] ?? 0));
|
|
41
|
+
const jobFields = {
|
|
42
|
+
job_id: jobId,
|
|
43
|
+
name: z.string().min(1).max(40).describe('What the harness calls it: "Dreaming".'),
|
|
44
|
+
about: z.string().min(1).max(240).describe("What it does, in a sentence, for its page."),
|
|
45
|
+
kind: jobKind.describe("What it does, for its mark: `other` for anything else."),
|
|
46
|
+
every: minutes
|
|
47
|
+
.optional()
|
|
48
|
+
.describe("How often it runs, in minutes. Chips says it in words, with `next_at` for the time of day."),
|
|
49
|
+
when: z
|
|
50
|
+
.string()
|
|
51
|
+
.min(1)
|
|
52
|
+
.max(60)
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("How often, in the harness's words, for a schedule that is not an interval."),
|
|
55
|
+
next_at: isoTimestamp.optional().describe("When it runs next, while it is on."),
|
|
56
|
+
for_agents: z
|
|
57
|
+
.array(id("agent"))
|
|
58
|
+
.max(200)
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("The harness's agents it runs for, if it runs for some rather than the harness."),
|
|
61
|
+
on: z.boolean().describe("Whether it runs now."),
|
|
62
|
+
editable: z.boolean().describe("Whether a person may switch it from Chips."),
|
|
63
|
+
why_read_only: z
|
|
64
|
+
.string()
|
|
65
|
+
.min(1)
|
|
66
|
+
.max(120)
|
|
67
|
+
.optional()
|
|
68
|
+
.describe("Why not, in the harness's words, only when it is not `editable`."),
|
|
69
|
+
choices: z
|
|
70
|
+
.array(minutes)
|
|
71
|
+
.min(1)
|
|
72
|
+
.max(JOB_CHOICES_MAX)
|
|
73
|
+
.refine(ascending, { message: "The intervals go up, each named once." })
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("The intervals a person may pick, in minutes, shortest first, `every` among them."),
|
|
76
|
+
};
|
|
77
|
+
export const harnessJob = z
|
|
78
|
+
.object(jobFields)
|
|
79
|
+
.refine((job) => job.every !== undefined || job.when !== undefined, {
|
|
80
|
+
path: ["every"],
|
|
81
|
+
message: "Say how often it runs: `every` in minutes, or `when` in words.",
|
|
82
|
+
})
|
|
83
|
+
.refine((job) => job.choices === undefined || job.choices.includes(job.every ?? -1), {
|
|
84
|
+
path: ["choices"],
|
|
85
|
+
message: "`every` is one of `choices`.",
|
|
86
|
+
})
|
|
87
|
+
.refine((job) => job.why_read_only === undefined || !job.editable, {
|
|
88
|
+
path: ["why_read_only"],
|
|
89
|
+
message: "Say why only for a job that can't be switched.",
|
|
90
|
+
});
|
|
91
|
+
const uniqueJobs = (jobs) => new Set(jobs.map((job) => job.job_id)).size === jobs.length;
|
|
92
|
+
export const harnessJobsPut = z
|
|
93
|
+
.object({
|
|
94
|
+
jobs: z
|
|
95
|
+
.array(harnessJob)
|
|
96
|
+
.max(HARNESS_JOBS_MAX)
|
|
97
|
+
.refine(uniqueJobs, { message: "Each job is named once." })
|
|
98
|
+
.describe("Every job the harness runs on its own, whole: one left out is gone, runs and all."),
|
|
99
|
+
answers: id("change")
|
|
100
|
+
.optional()
|
|
101
|
+
.describe("The change this copy answers: made, and these are the jobs as they are now."),
|
|
102
|
+
refuses: z
|
|
103
|
+
.object({
|
|
104
|
+
change_id: id("change"),
|
|
105
|
+
message: z.string().min(1).max(300).optional().describe("Why not, for the person."),
|
|
106
|
+
})
|
|
107
|
+
.optional()
|
|
108
|
+
.describe("A change not made. The copy beside it is the jobs as they are now."),
|
|
109
|
+
})
|
|
110
|
+
.describe("`PUT /v1/harnesses/:id/jobs`: a harness's copy of the jobs it runs on its own.");
|
|
111
|
+
export const jobRun = z
|
|
112
|
+
.object({
|
|
113
|
+
job_id: jobId,
|
|
114
|
+
run_id: z.string().min(1).max(160).describe("The harness's own id for the run."),
|
|
115
|
+
started_at: isoTimestamp,
|
|
116
|
+
ended_at: isoTimestamp,
|
|
117
|
+
outcome: jobRunOutcome.describe("`done`, `failed`, or `stopped` when something else ended it, such as a restart."),
|
|
118
|
+
quiet: z
|
|
119
|
+
.boolean()
|
|
120
|
+
.optional()
|
|
121
|
+
.describe("It did its work and had nothing to say: a heartbeat with nothing for anyone."),
|
|
122
|
+
waited: z.boolean().optional().describe("It waited for an approval that nobody gave."),
|
|
123
|
+
error: z
|
|
124
|
+
.string()
|
|
125
|
+
.min(1)
|
|
126
|
+
.max(200)
|
|
127
|
+
.optional()
|
|
128
|
+
.describe("What went wrong, in the harness's words, for a run that failed or was stopped."),
|
|
129
|
+
agent_id: id("agent").optional().describe("The agent it ran for, when it runs for some."),
|
|
130
|
+
cost_usd: z
|
|
131
|
+
.number()
|
|
132
|
+
.min(0)
|
|
133
|
+
.max(10_000)
|
|
134
|
+
.optional()
|
|
135
|
+
.describe("What it cost, as the harness priced it: absent when the harness doesn't know."),
|
|
136
|
+
tokens: z.int().min(0).optional().describe("Its tokens, in and out."),
|
|
137
|
+
model: z.string().min(1).max(80).optional().describe("The model it ran on, in its words."),
|
|
138
|
+
})
|
|
139
|
+
.refine((run) => Date.parse(run.ended_at) >= Date.parse(run.started_at), {
|
|
140
|
+
path: ["ended_at"],
|
|
141
|
+
message: "A run ends after it starts.",
|
|
142
|
+
})
|
|
143
|
+
.describe("One run of a job, once it ended.");
|
|
144
|
+
export const jobRunsPost = z
|
|
145
|
+
.object({ runs: z.array(jobRun).min(1).max(JOB_RUNS_POST_MAX) })
|
|
146
|
+
.describe("`POST /v1/harnesses/:id/jobs/runs`: runs the harness finished. A run posted again says what it says over what was posted before, and what it leaves out stays: so a run may be posted once more with its cost, and never loses one.");
|
|
147
|
+
export const jobChangeAsk = z
|
|
148
|
+
.object({
|
|
149
|
+
on: z.boolean(),
|
|
150
|
+
every: minutes.optional().describe("One of the job's choices; its own when left out."),
|
|
151
|
+
})
|
|
152
|
+
.describe("`POST /v1/harnesses/:id/jobs/:job/changes`: on or off, and how often.");
|
|
153
|
+
export const JOB_CHANGE_STATES = ["waiting", "saved", "failed", "missed"];
|
|
154
|
+
export const jobChangeState = z.enum(JOB_CHANGE_STATES);
|
|
155
|
+
export const jobChangeView = z
|
|
156
|
+
.object({
|
|
157
|
+
change_id: id("change"),
|
|
158
|
+
state: jobChangeState.describe("`missed` once `JOB_CHANGE_WAIT_MS` has passed with no answer; read, never stored."),
|
|
159
|
+
on: z.boolean(),
|
|
160
|
+
every: minutes.optional(),
|
|
161
|
+
asked_at: isoTimestamp,
|
|
162
|
+
answered_at: isoTimestamp.optional(),
|
|
163
|
+
message: z.string().max(300).optional().describe("The harness's words, for a refusal."),
|
|
164
|
+
})
|
|
165
|
+
.describe("The last change a person asked of a job, and what became of it (ADR 0252).");
|
|
166
|
+
export const harnessJobView = z
|
|
167
|
+
.object({
|
|
168
|
+
...jobFields,
|
|
169
|
+
week_usd: z
|
|
170
|
+
.number()
|
|
171
|
+
.min(0)
|
|
172
|
+
.optional()
|
|
173
|
+
.describe("What its runs of the last seven days cost: absent when none of them had a cost."),
|
|
174
|
+
week_runs: z.int().min(0).describe("How many runs it made in the last seven days."),
|
|
175
|
+
runs_total: z.int().min(0).describe("How many of its runs Chips holds."),
|
|
176
|
+
last_run: jobRun.optional(),
|
|
177
|
+
change: jobChangeView.optional(),
|
|
178
|
+
})
|
|
179
|
+
.describe("One job as a person reads it: the harness's copy, what Chips counted, its change.");
|
|
180
|
+
export const harnessJobsView = z
|
|
181
|
+
.object({
|
|
182
|
+
harness_id: id("harness"),
|
|
183
|
+
jobs: z.array(harnessJobView),
|
|
184
|
+
read_at: isoTimestamp.describe("When the harness last sent its copy."),
|
|
185
|
+
away: z.boolean().describe("No socket of the harness hears changes now: read, not switched."),
|
|
186
|
+
})
|
|
187
|
+
.describe("`GET /v1/harnesses/:id/jobs`, for the harness's owner or an admin.");
|
|
188
|
+
export const jobRunsView = z
|
|
189
|
+
.object({
|
|
190
|
+
harness_id: id("harness"),
|
|
191
|
+
job_id: jobId,
|
|
192
|
+
runs: z.array(jobRun).describe("Newest first."),
|
|
193
|
+
more: z.boolean().describe("Whether older runs are left, for `before` the last one's start."),
|
|
194
|
+
})
|
|
195
|
+
.describe("`GET /v1/harnesses/:id/jobs/:job/runs?since=&before=&limit=`.");
|
|
196
|
+
export const jobChangeFrame = z
|
|
197
|
+
.object({
|
|
198
|
+
frame: z.literal("job.change"),
|
|
199
|
+
change_id: id("change"),
|
|
200
|
+
harness_id: id("harness"),
|
|
201
|
+
job_id: jobId,
|
|
202
|
+
on: z.boolean(),
|
|
203
|
+
every: minutes
|
|
204
|
+
.optional()
|
|
205
|
+
.describe("For a job with choices: one of them, the copy's own when the person named none."),
|
|
206
|
+
asked_by: id("person"),
|
|
207
|
+
asked_at: isoTimestamp,
|
|
208
|
+
})
|
|
209
|
+
.describe("A person switched one of a harness's own jobs, or changed how often it runs (ADR 0252). Sent to a harness's socket that said `jobs` in its `hello`, now or never: it is not in the log. The harness answers with its copy of all its jobs, `answers` or `refuses` naming `change_id`.");
|
|
210
|
+
//# sourceMappingURL=harness-jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-jobs.js","sourceRoot":"","sources":["../../src/harness-jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { Id, IdGenerator, IdGeneratorOptions, IdKind, IdPrefix } from "./ulid.js";
|
|
2
|
+
export { createIdGenerator, defaultIdGenerator, eventIdOfMessage, ID_PREFIXES, InvalidIdError, isId, messageIdOf, newId, parseId, timestampOf, } from "./ulid.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ids/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvF,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,IAAI,EACJ,WAAW,EACX,KAAK,EACL,OAAO,EACP,WAAW,GACZ,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ids/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,IAAI,EACJ,WAAW,EACX,KAAK,EACL,OAAO,EACP,WAAW,GACZ,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifiers are ULIDs with a type prefix (technical-plan decision 11). Always strings,
|
|
3
|
+
* always sortable by creation time, and self-describing: `run_01JB...` can only ever be a
|
|
4
|
+
* run. Generation goes through a port so tests are deterministic (6.1).
|
|
5
|
+
*
|
|
6
|
+
* This lives in `packages/protocol` rather than `packages/platform` because an id is part of
|
|
7
|
+
* the wire format: every envelope carries three of them. Keeping it here means `@chipschat/harness`
|
|
8
|
+
* can validate ids without pulling a logger and a metrics API into an SDK.
|
|
9
|
+
*
|
|
10
|
+
* The encoding is the ULID spec: 48 bits of millisecond timestamp in ten Crockford base32
|
|
11
|
+
* characters, then 80 bits of randomness in sixteen. Ids minted in the same millisecond are
|
|
12
|
+
* made strictly increasing by incrementing the random component, so `seq` is not the only
|
|
13
|
+
* thing that orders a workspace's history.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* The prefix for each kind of thing Chips names.
|
|
17
|
+
*
|
|
18
|
+
* The first eleven are decision 11's list. The rest extend it: an event needs an id of its own
|
|
19
|
+
* to be idempotent across a reconnect, and devices and harness tokens are rows in the schema
|
|
20
|
+
* M0.3 creates (recorded in STATUS.md); an agent is who a harness takes part in rooms as (ADR
|
|
21
|
+
* 0087), a join request is somebody asking to come in (ADR 0122), and an edit is a person's change
|
|
22
|
+
* to an agent's context on its way to its harness (ADR 0134), and a change is a person's choice of
|
|
23
|
+
* an agent's model and effort, of its heartbeat, or of its context window's limit, or a Compact
|
|
24
|
+
* now, on its way there too (ADR 0140, ADR 0143, ADR 0146). A direct ask is a guest asking an
|
|
25
|
+
* owner to share the server's machine in Tailscale (ADR 0211, Phase 3).
|
|
26
|
+
* `agt` was the harness's prefix before the rename of 4 September, and no log holds one.
|
|
27
|
+
*/
|
|
28
|
+
export declare const ID_PREFIXES: {
|
|
29
|
+
readonly workspace: "ws";
|
|
30
|
+
readonly person: "usr";
|
|
31
|
+
readonly harness: "hrn";
|
|
32
|
+
readonly space: "spc";
|
|
33
|
+
readonly message: "msg";
|
|
34
|
+
readonly run: "run";
|
|
35
|
+
readonly step: "stp";
|
|
36
|
+
readonly approval: "apr";
|
|
37
|
+
readonly question: "qst";
|
|
38
|
+
readonly lane: "lane";
|
|
39
|
+
readonly attachment: "att";
|
|
40
|
+
readonly event: "evt";
|
|
41
|
+
readonly device: "dev";
|
|
42
|
+
readonly token: "tok";
|
|
43
|
+
readonly invite: "inv";
|
|
44
|
+
readonly passkey: "pky";
|
|
45
|
+
readonly agent: "agt";
|
|
46
|
+
readonly join: "jrq";
|
|
47
|
+
readonly direct: "dra";
|
|
48
|
+
readonly edit: "edt";
|
|
49
|
+
readonly change: "chg";
|
|
50
|
+
};
|
|
51
|
+
export type IdKind = keyof typeof ID_PREFIXES;
|
|
52
|
+
export type IdPrefix = (typeof ID_PREFIXES)[IdKind];
|
|
53
|
+
export type Id<K extends IdKind = IdKind> = `${(typeof ID_PREFIXES)[K]}_${string}`;
|
|
54
|
+
/** Thrown when a string that should be an id is not one. */
|
|
55
|
+
export declare class InvalidIdError extends Error {
|
|
56
|
+
readonly value: string;
|
|
57
|
+
readonly name = "InvalidIdError";
|
|
58
|
+
constructor(value: string, reason: string);
|
|
59
|
+
}
|
|
60
|
+
export interface IdGenerator {
|
|
61
|
+
/** Mint a new id of the given kind. */
|
|
62
|
+
next: <K extends IdKind>(kind: K) => Id<K>;
|
|
63
|
+
}
|
|
64
|
+
export interface IdGeneratorOptions {
|
|
65
|
+
/** Milliseconds since the epoch. Defaults to the system clock. */
|
|
66
|
+
now?: () => number;
|
|
67
|
+
/** Fills the supplied buffer with randomness. Defaults to `crypto.getRandomValues`. */
|
|
68
|
+
randomFill?: (into: Uint8Array) => void;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A generator that is monotonic within a millisecond. Two generators are independent; a
|
|
72
|
+
* process that needs strictly ordered ids uses one.
|
|
73
|
+
*/
|
|
74
|
+
export declare function createIdGenerator(options?: IdGeneratorOptions): IdGenerator;
|
|
75
|
+
/** The process-wide generator. Code that can inject a generator should do that instead. */
|
|
76
|
+
export declare const defaultIdGenerator: IdGenerator;
|
|
77
|
+
/** Mint an id with the process-wide generator. */
|
|
78
|
+
export declare function newId<K extends IdKind>(kind: K): Id<K>;
|
|
79
|
+
/** True when `value` is an id of the given kind. */
|
|
80
|
+
export declare function isId<K extends IdKind>(kind: K, value: unknown): value is Id<K>;
|
|
81
|
+
/** Split an id into its kind and ULID, or throw if it is not an id. */
|
|
82
|
+
export declare function parseId(value: string): {
|
|
83
|
+
kind: IdKind;
|
|
84
|
+
ulid: string;
|
|
85
|
+
};
|
|
86
|
+
/** The instant an id was minted. */
|
|
87
|
+
export declare function timestampOf(value: string): number;
|
|
88
|
+
/**
|
|
89
|
+
* The id a message has on the wire. A message is its event: the row and the reference both
|
|
90
|
+
* carry the event's ULID, and `message.new` names it with the message prefix so a `reply_to`
|
|
91
|
+
* is a message id and not an event id. Pure, and the same in both directions.
|
|
92
|
+
*/
|
|
93
|
+
export declare function messageIdOf(eventId: string): Id<"message">;
|
|
94
|
+
/** The event an on-the-wire message id names. */
|
|
95
|
+
export declare function eventIdOfMessage(messageId: string): Id<"event">;
|
|
96
|
+
//# sourceMappingURL=ulid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ulid.d.ts","sourceRoot":"","sources":["../../../src/ids/ulid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,MAAM,OAAO,WAAW,CAAC;AAC9C,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AACpD,MAAM,MAAM,EAAE,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;AAanF,4DAA4D;AAC5D,qBAAa,cAAe,SAAQ,KAAK;IAGrC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAFxB,SAAkB,IAAI,oBAAoB;gBAE/B,KAAK,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM;CAIjB;AAED,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,IAAI,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,uFAAuF;IACvF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAc/E;AAkCD,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,EAAE,WAAiC,CAAC;AAEnE,kDAAkD;AAClD,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAEtD;AAED,oDAAoD;AACpD,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAI9E;AAED,uEAAuE;AACvE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMrE;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAwED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,CAE1D;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAE/D"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifiers are ULIDs with a type prefix (technical-plan decision 11). Always strings,
|
|
3
|
+
* always sortable by creation time, and self-describing: `run_01JB...` can only ever be a
|
|
4
|
+
* run. Generation goes through a port so tests are deterministic (6.1).
|
|
5
|
+
*
|
|
6
|
+
* This lives in `packages/protocol` rather than `packages/platform` because an id is part of
|
|
7
|
+
* the wire format: every envelope carries three of them. Keeping it here means `@chipschat/harness`
|
|
8
|
+
* can validate ids without pulling a logger and a metrics API into an SDK.
|
|
9
|
+
*
|
|
10
|
+
* The encoding is the ULID spec: 48 bits of millisecond timestamp in ten Crockford base32
|
|
11
|
+
* characters, then 80 bits of randomness in sixteen. Ids minted in the same millisecond are
|
|
12
|
+
* made strictly increasing by incrementing the random component, so `seq` is not the only
|
|
13
|
+
* thing that orders a workspace's history.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* The prefix for each kind of thing Chips names.
|
|
17
|
+
*
|
|
18
|
+
* The first eleven are decision 11's list. The rest extend it: an event needs an id of its own
|
|
19
|
+
* to be idempotent across a reconnect, and devices and harness tokens are rows in the schema
|
|
20
|
+
* M0.3 creates (recorded in STATUS.md); an agent is who a harness takes part in rooms as (ADR
|
|
21
|
+
* 0087), a join request is somebody asking to come in (ADR 0122), and an edit is a person's change
|
|
22
|
+
* to an agent's context on its way to its harness (ADR 0134), and a change is a person's choice of
|
|
23
|
+
* an agent's model and effort, of its heartbeat, or of its context window's limit, or a Compact
|
|
24
|
+
* now, on its way there too (ADR 0140, ADR 0143, ADR 0146). A direct ask is a guest asking an
|
|
25
|
+
* owner to share the server's machine in Tailscale (ADR 0211, Phase 3).
|
|
26
|
+
* `agt` was the harness's prefix before the rename of 4 September, and no log holds one.
|
|
27
|
+
*/
|
|
28
|
+
export const ID_PREFIXES = {
|
|
29
|
+
workspace: "ws",
|
|
30
|
+
person: "usr",
|
|
31
|
+
harness: "hrn",
|
|
32
|
+
space: "spc",
|
|
33
|
+
message: "msg",
|
|
34
|
+
run: "run",
|
|
35
|
+
step: "stp",
|
|
36
|
+
approval: "apr",
|
|
37
|
+
question: "qst",
|
|
38
|
+
lane: "lane",
|
|
39
|
+
attachment: "att",
|
|
40
|
+
event: "evt",
|
|
41
|
+
device: "dev",
|
|
42
|
+
token: "tok",
|
|
43
|
+
invite: "inv",
|
|
44
|
+
passkey: "pky",
|
|
45
|
+
agent: "agt",
|
|
46
|
+
join: "jrq",
|
|
47
|
+
direct: "dra",
|
|
48
|
+
edit: "edt",
|
|
49
|
+
change: "chg",
|
|
50
|
+
};
|
|
51
|
+
const ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
52
|
+
const TIME_CHARS = 10;
|
|
53
|
+
const RANDOM_CHARS = 16;
|
|
54
|
+
const RANDOM_BYTES = 10;
|
|
55
|
+
const ULID_CHARS = TIME_CHARS + RANDOM_CHARS;
|
|
56
|
+
const MAX_TIME_MS = 281_474_976_710_655; // 2^48 - 1
|
|
57
|
+
const PREFIX_TO_KIND = new Map(Object.entries(ID_PREFIXES).map(([kind, prefix]) => [prefix, kind]));
|
|
58
|
+
/** Thrown when a string that should be an id is not one. */
|
|
59
|
+
export class InvalidIdError extends Error {
|
|
60
|
+
value;
|
|
61
|
+
name = "InvalidIdError";
|
|
62
|
+
constructor(value, reason) {
|
|
63
|
+
super(`invalid id ${JSON.stringify(value)}: ${reason}`);
|
|
64
|
+
this.value = value;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A generator that is monotonic within a millisecond. Two generators are independent; a
|
|
69
|
+
* process that needs strictly ordered ids uses one.
|
|
70
|
+
*/
|
|
71
|
+
export function createIdGenerator(options = {}) {
|
|
72
|
+
const now = options.now ?? Date.now;
|
|
73
|
+
const randomFill = options.randomFill ?? defaultRandomFill;
|
|
74
|
+
const cursor = { time: -1, random: new Uint8Array(RANDOM_BYTES) };
|
|
75
|
+
return {
|
|
76
|
+
next(kind) {
|
|
77
|
+
const prefix = ID_PREFIXES[kind];
|
|
78
|
+
if (prefix === undefined)
|
|
79
|
+
throw new InvalidIdError(String(kind), "unknown id kind");
|
|
80
|
+
advance(cursor, requireTimestamp(now()), randomFill);
|
|
81
|
+
return `${prefix}_${encodeTime(cursor.time)}${encodeRandom(cursor.random)}`;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Move the cursor to the next id position. A later millisecond starts fresh. The same
|
|
87
|
+
* millisecond, or a clock that has moved backwards, steps the randomness instead, so the
|
|
88
|
+
* id still sorts after its predecessor; when the randomness is exhausted it borrows the
|
|
89
|
+
* next millisecond rather than colliding.
|
|
90
|
+
*/
|
|
91
|
+
function advance(cursor, nowMs, randomFill) {
|
|
92
|
+
if (nowMs > cursor.time) {
|
|
93
|
+
cursor.time = nowMs;
|
|
94
|
+
cursor.random = freshRandom(randomFill);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!incrementInPlace(cursor.random)) {
|
|
98
|
+
cursor.time += 1;
|
|
99
|
+
cursor.random = freshRandom(randomFill);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function requireTimestamp(value) {
|
|
103
|
+
const time = Math.floor(value);
|
|
104
|
+
if (!Number.isFinite(time) || time < 0 || time > MAX_TIME_MS) {
|
|
105
|
+
throw new RangeError(`timestamp ${value} is outside the range a ULID can hold`);
|
|
106
|
+
}
|
|
107
|
+
return time;
|
|
108
|
+
}
|
|
109
|
+
/** The process-wide generator. Code that can inject a generator should do that instead. */
|
|
110
|
+
export const defaultIdGenerator = createIdGenerator();
|
|
111
|
+
/** Mint an id with the process-wide generator. */
|
|
112
|
+
export function newId(kind) {
|
|
113
|
+
return defaultIdGenerator.next(kind);
|
|
114
|
+
}
|
|
115
|
+
/** True when `value` is an id of the given kind. */
|
|
116
|
+
export function isId(kind, value) {
|
|
117
|
+
if (typeof value !== "string")
|
|
118
|
+
return false;
|
|
119
|
+
const parsed = tryParseId(value);
|
|
120
|
+
return parsed !== undefined && parsed.kind === kind;
|
|
121
|
+
}
|
|
122
|
+
/** Split an id into its kind and ULID, or throw if it is not an id. */
|
|
123
|
+
export function parseId(value) {
|
|
124
|
+
const parsed = tryParseId(value);
|
|
125
|
+
if (parsed === undefined) {
|
|
126
|
+
throw new InvalidIdError(value, "expected <prefix>_<26 character ULID>");
|
|
127
|
+
}
|
|
128
|
+
return parsed;
|
|
129
|
+
}
|
|
130
|
+
/** The instant an id was minted. */
|
|
131
|
+
export function timestampOf(value) {
|
|
132
|
+
return decodeTime(parseId(value).ulid);
|
|
133
|
+
}
|
|
134
|
+
function tryParseId(value) {
|
|
135
|
+
const underscore = value.indexOf("_");
|
|
136
|
+
if (underscore <= 0)
|
|
137
|
+
return undefined;
|
|
138
|
+
const kind = PREFIX_TO_KIND.get(value.slice(0, underscore));
|
|
139
|
+
if (kind === undefined)
|
|
140
|
+
return undefined;
|
|
141
|
+
const ulid = value.slice(underscore + 1);
|
|
142
|
+
if (ulid.length !== ULID_CHARS)
|
|
143
|
+
return undefined;
|
|
144
|
+
for (let i = 0; i < ULID_CHARS; i += 1) {
|
|
145
|
+
if (ALPHABET.indexOf(ulid.charAt(i)) < 0)
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
// Ten base32 characters hold fifty bits; a timestamp holds forty-eight.
|
|
149
|
+
if (ALPHABET.indexOf(ulid.charAt(0)) > 7)
|
|
150
|
+
return undefined;
|
|
151
|
+
return { kind, ulid };
|
|
152
|
+
}
|
|
153
|
+
function encodeTime(timeMs) {
|
|
154
|
+
let remaining = timeMs;
|
|
155
|
+
let out = "";
|
|
156
|
+
for (let i = 0; i < TIME_CHARS; i += 1) {
|
|
157
|
+
out = ALPHABET.charAt(remaining % 32) + out;
|
|
158
|
+
remaining = Math.floor(remaining / 32);
|
|
159
|
+
}
|
|
160
|
+
return out;
|
|
161
|
+
}
|
|
162
|
+
function decodeTime(ulid) {
|
|
163
|
+
let time = 0;
|
|
164
|
+
for (let i = 0; i < TIME_CHARS; i += 1) {
|
|
165
|
+
time = time * 32 + ALPHABET.indexOf(ulid.charAt(i));
|
|
166
|
+
}
|
|
167
|
+
return time;
|
|
168
|
+
}
|
|
169
|
+
function encodeRandom(bytes) {
|
|
170
|
+
let value = 0n;
|
|
171
|
+
for (const byte of bytes)
|
|
172
|
+
value = (value << 8n) | BigInt(byte);
|
|
173
|
+
let out = "";
|
|
174
|
+
for (let i = 0; i < RANDOM_CHARS; i += 1) {
|
|
175
|
+
out = ALPHABET.charAt(Number(value & 31n)) + out;
|
|
176
|
+
value >>= 5n;
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
function freshRandom(randomFill) {
|
|
181
|
+
const bytes = new Uint8Array(RANDOM_BYTES);
|
|
182
|
+
randomFill(bytes);
|
|
183
|
+
return bytes;
|
|
184
|
+
}
|
|
185
|
+
/** Adds one to a big-endian byte array. Returns false when it would overflow. */
|
|
186
|
+
function incrementInPlace(bytes) {
|
|
187
|
+
for (let i = bytes.length - 1; i >= 0; i -= 1) {
|
|
188
|
+
const byte = bytes[i] ?? 0;
|
|
189
|
+
if (byte < 0xff) {
|
|
190
|
+
bytes[i] = byte + 1;
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
bytes[i] = 0;
|
|
194
|
+
}
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
function defaultRandomFill(into) {
|
|
198
|
+
globalThis.crypto.getRandomValues(into);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* The id a message has on the wire. A message is its event: the row and the reference both
|
|
202
|
+
* carry the event's ULID, and `message.new` names it with the message prefix so a `reply_to`
|
|
203
|
+
* is a message id and not an event id. Pure, and the same in both directions.
|
|
204
|
+
*/
|
|
205
|
+
export function messageIdOf(eventId) {
|
|
206
|
+
return `${ID_PREFIXES.message}_${parseId(eventId).ulid}`;
|
|
207
|
+
}
|
|
208
|
+
/** The event an on-the-wire message id names. */
|
|
209
|
+
export function eventIdOfMessage(messageId) {
|
|
210
|
+
return `${ID_PREFIXES.event}_${parseId(messageId).ulid}`;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=ulid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ulid.js","sourceRoot":"","sources":["../../../src/ids/ulid.ts"],"names":[],"mappings":"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"}
|