halfcycle 0.3.27 → 0.3.29
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/.claude-plugin/plugin.json +1 -1
- package/README.md +4 -2
- package/bin/bin.bundle.mjs +17 -3
- package/dist/bin.js +69 -14
- package/dist/bin.js.map +3 -3
- package/dist/device-signin.d.ts +17 -10
- package/dist/device-signin.d.ts.map +1 -1
- package/dist/index.js +131 -14
- package/dist/index.js.map +3 -3
- package/dist/install.d.ts +19 -0
- package/dist/install.d.ts.map +1 -1
- package/dist/loopback-signin.d.ts +25 -5
- package/dist/loopback-signin.d.ts.map +1 -1
- package/dist/own-engagement.d.ts.map +1 -1
- package/dist/project-page.d.ts +24 -0
- package/dist/project-page.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/install.d.ts
CHANGED
|
@@ -59,6 +59,25 @@ export interface BundlePin {
|
|
|
59
59
|
* or entitlement from it — the plane owns those and answers them from the credential.
|
|
60
60
|
*/
|
|
61
61
|
accountId?: string;
|
|
62
|
+
/**
|
|
63
|
+
* The project's page on the dashboard — where the person sees how the project
|
|
64
|
+
* is going. A session reads the repository, never the installer's terminal output, so
|
|
65
|
+
* without this field a session asked for the link has nothing to give but a guess.
|
|
66
|
+
*
|
|
67
|
+
* SAFE TO COMMIT, and this field does not churn: it is built from the engagement id and
|
|
68
|
+
* a constant (`projectPageUrl`), so every clone of the same engagement writes the same
|
|
69
|
+
* value, unlike a per-run value. It is rebuilt on every write, never carried forward
|
|
70
|
+
* from the previous pin the way `installedAt` and `accountId` are. It carries no
|
|
71
|
+
* credential and never the installer's first-visit code. The dashboard decides what a
|
|
72
|
+
* visitor sees: someone signed in to Halfcycle in that browser reaches the project, and
|
|
73
|
+
* someone who is not is refused.
|
|
74
|
+
*
|
|
75
|
+
* OPTIONAL for readers only: it is absent from every pin written before this field
|
|
76
|
+
* existed, and a reader treats absence as *not recorded*. A pin this installer writes
|
|
77
|
+
* always carries it, because `install` refuses an id that is not an engagement id
|
|
78
|
+
* before it writes anything.
|
|
79
|
+
*/
|
|
80
|
+
projectPage?: string;
|
|
62
81
|
}
|
|
63
82
|
/**
|
|
64
83
|
* The engagement's credential, which the installer persists to the MACHINE-LEVEL
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* chooses between them; this module only ever reports what it MEASURED.
|
|
21
21
|
*
|
|
22
22
|
* ---------------------------------------------------------------------------
|
|
23
|
-
*
|
|
23
|
+
* FIVE PROPERTIES THIS MODULE IS RESPONSIBLE FOR. **Each one names the test that
|
|
24
24
|
* reds when it is mutated** — named, rather than claimed in aggregate, because the
|
|
25
25
|
* aggregate version of this sentence shipped once while property 3's call site was
|
|
26
26
|
* covered by nothing at all (see `createCallbackHandler`). A list that says "all of
|
|
@@ -51,8 +51,15 @@
|
|
|
51
51
|
* threw would push the caller towards guessing from the environment instead.
|
|
52
52
|
* → *"a port that is already taken is a MEASURED bind failure"*, against a real
|
|
53
53
|
* squatter on a real port.
|
|
54
|
+
* 5. **Only an engagement id reaches the completion page's onward address.** The
|
|
55
|
+
* id the page may deep-link to arrives from a committed file or an argument, so
|
|
56
|
+
* it is checked against `isEngagementId` — the shape's one home, in
|
|
57
|
+
* `@halfcycle/core` — and anything else sends the browser to the projects list
|
|
58
|
+
* instead. See `onwardTarget` and `projectPageUrl`.
|
|
59
|
+
* → *"a hostile id never reaches the page"*, which feeds quotes, markup and a
|
|
60
|
+
* `javascript:` URL through the real handler and reads back the body.
|
|
54
61
|
*
|
|
55
|
-
* INV-001: Node builtins
|
|
62
|
+
* INV-001: Node builtins, `@halfcycle/events` and this package's own modules only.
|
|
56
63
|
*/
|
|
57
64
|
import { type LoopbackRedirectTarget, type LoopbackResult } from '@halfcycle/events';
|
|
58
65
|
/**
|
|
@@ -105,6 +112,12 @@ export interface LoopbackBindFailed {
|
|
|
105
112
|
reason: string;
|
|
106
113
|
}
|
|
107
114
|
export type LoopbackBindOutcome = LoopbackListener | LoopbackBindFailed;
|
|
115
|
+
/**
|
|
116
|
+
* How long the approved page stays up before it moves on, in seconds — long enough to
|
|
117
|
+
* read the line that says to go back to the terminal, short enough that nobody reaches
|
|
118
|
+
* for the link first. Pinned by a test that reads the literal out of the page body.
|
|
119
|
+
*/
|
|
120
|
+
export declare const COMPLETION_REDIRECT_SECONDS = 2;
|
|
108
121
|
/**
|
|
109
122
|
* Is this peer on the loopback interface?
|
|
110
123
|
*
|
|
@@ -143,7 +156,7 @@ export interface LoopbackResponse {
|
|
|
143
156
|
* THE ONE HANDLER, built here and used by `createServer` below and by nothing else.
|
|
144
157
|
*
|
|
145
158
|
* Extracted from the `createServer` call it used to be written inline in, for a
|
|
146
|
-
* reason worth stating rather than filing as a refactor. This file's header
|
|
159
|
+
* reason worth stating rather than filing as a refactor. This file's header claimed
|
|
147
160
|
* *"four properties, each of which has a test that reds when it is mutated"* — and
|
|
148
161
|
* for property 3 (**a request from a non-loopback peer is refused, independently of
|
|
149
162
|
* the bind address**) that was FALSE. Only the pure predicate `isLoopbackPeer` was
|
|
@@ -157,8 +170,12 @@ export interface LoopbackResponse {
|
|
|
157
170
|
* survive a FUTURE widening of property 1 — the moment the bind is wrong, this is
|
|
158
171
|
* what still refuses the network — so it needs an assertion that does not depend on
|
|
159
172
|
* the bind being right. Handing the handler a peer address is that assertion.
|
|
173
|
+
*
|
|
174
|
+
* `engagementId` is where an approved page sends the browser next, when the caller
|
|
175
|
+
* knew the project before signing in. It is passed through to `completionPage` as
|
|
176
|
+
* given; `onwardTarget` is what decides whether it may be used.
|
|
160
177
|
*/
|
|
161
|
-
export declare function createCallbackHandler(state: string, onCallback: (callback: LoopbackCallback) => void): (req: LoopbackRequest, res: LoopbackResponse) => void;
|
|
178
|
+
export declare function createCallbackHandler(state: string, onCallback: (callback: LoopbackCallback) => void, engagementId?: string): (req: LoopbackRequest, res: LoopbackResponse) => void;
|
|
162
179
|
/**
|
|
163
180
|
* Bind the callback listener, or report why it could not be bound.
|
|
164
181
|
*
|
|
@@ -168,6 +185,9 @@ export declare function createCallbackHandler(state: string, onCallback: (callba
|
|
|
168
185
|
* `reason` string the caller prints. A heuristic would be wrong in both directions:
|
|
169
186
|
* a container with a forwarded browser has no `DISPLAY` and works, and a locked-down
|
|
170
187
|
* desktop has one and does not.
|
|
188
|
+
*
|
|
189
|
+
* `engagementId` is the project the completion page may send the browser on to —
|
|
190
|
+
* see `createCallbackHandler`.
|
|
171
191
|
*/
|
|
172
|
-
export declare function bindLoopback(env?: NodeJS.ProcessEnv): Promise<LoopbackBindOutcome>;
|
|
192
|
+
export declare function bindLoopback(env?: NodeJS.ProcessEnv, engagementId?: string): Promise<LoopbackBindOutcome>;
|
|
173
193
|
//# sourceMappingURL=loopback-signin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopback-signin.d.ts","sourceRoot":"","sources":["../src/loopback-signin.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"loopback-signin.d.ts","sourceRoot":"","sources":["../src/loopback-signin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AAIH,OAAO,EASL,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAG3B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,sBAAsB,CAAC;IAC/B;;;;;;;;OAQG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,+DAA+D;QAC/D,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAKxE;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAoG7C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAIzE;AAgBD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CAChD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC;IAC9E,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,EAChD,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAmCvD;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,CAAC,CAuE9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"own-engagement.d.ts","sourceRoot":"","sources":["../src/own-engagement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGxF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,eAAe,CAAC;CAC3C;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,eAAe,CAAC;CAC3C;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,GAAG,eAAe,GACxC,MAAM,IAAI,eAAe,CAE3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAmD1B;
|
|
1
|
+
{"version":3,"file":"own-engagement.d.ts","sourceRoot":"","sources":["../src/own-engagement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGxF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,eAAe,CAAC;CAC3C;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,eAAe,CAAC;CAC3C;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,GAAG,eAAe,GACxC,MAAM,IAAI,eAAe,CAE3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAmD1B;AAmDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,eAAe,GAAG,eAAe,CAAC,CAuF5C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The project's page on the dashboard — one address, built in one place.
|
|
3
|
+
*
|
|
4
|
+
* Two surfaces hand it out. The sign-in completion page sends the person's browser
|
|
5
|
+
* there once a join knows the project (`loopback-signin.ts`). The committed pin records
|
|
6
|
+
* it so a session reading the repository can give the person the link without guessing
|
|
7
|
+
* — before the pin carried it, the only copy was a line of installer output in a
|
|
8
|
+
* terminal the session never sees, and a cold session searching the repository for it
|
|
9
|
+
* guessed two addresses on the wrong host.
|
|
10
|
+
*
|
|
11
|
+
* THE ID MUST BE AN ENGAGEMENT ID OR THERE IS NO ADDRESS. Anything `isEngagementId`
|
|
12
|
+
* refuses — absent, empty, or carrying characters a UUID does not — yields `undefined`,
|
|
13
|
+
* and each caller decides its own fallback. `isEngagementId` stays the shape's one home.
|
|
14
|
+
*
|
|
15
|
+
* The address carries no credential and never the installer's first-visit code. The
|
|
16
|
+
* dashboard decides what a visitor sees: someone signed in to Halfcycle in that browser
|
|
17
|
+
* reaches the project, and someone who is not is refused. It is the same for every clone
|
|
18
|
+
* of the repository, because it is built from nothing but the engagement id and a
|
|
19
|
+
* constant.
|
|
20
|
+
*
|
|
21
|
+
* INV-001: `@halfcycle/core` and `@halfcycle/events` only.
|
|
22
|
+
*/
|
|
23
|
+
export declare function projectPageUrl(engagementId: string | undefined): string | undefined;
|
|
24
|
+
//# sourceMappingURL=project-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-page.d.ts","sourceRoot":"","sources":["../src/project-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAInF"}
|
package/package.json
CHANGED