@tinycloud/courier 0.3.0-beta.4 → 0.3.0-beta.6
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/README.md +14 -3
- package/dist/credential-source.d.ts +18 -24
- package/dist/credential-source.js +62 -33
- package/dist/credential-source.js.map +1 -1
- package/dist/credential.d.ts +4 -0
- package/dist/credential.js +24 -19
- package/dist/credential.js.map +1 -1
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -1
- package/dist/profile.d.ts +4 -0
- package/dist/profile.js +10 -2
- package/dist/profile.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.js +9 -0
- package/dist/version.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -86,9 +86,20 @@ address replaces the older pending request only after the new request succeeds;
|
|
|
86
86
|
the new request fails, the older pending request is kept and `--code-stdin` still
|
|
87
87
|
completes it.
|
|
88
88
|
|
|
89
|
-
`courier credential show --email <addr>` prints
|
|
90
|
-
|
|
91
|
-
never printed.
|
|
89
|
+
`courier credential show --email <addr>` prints one JSON document on stdout (pretty
|
|
90
|
+
printed, nothing else on stdout) with `address`, `credentialId`, `issuedAt`,
|
|
91
|
+
`expiresAt` and `status`. The credential itself is never printed. Every read
|
|
92
|
+
re-verifies the stored record offline against the pinned issuer key before anything
|
|
93
|
+
else. A record that fails is refused with `credential-record-invalid` and kept
|
|
94
|
+
untouched for inspection; it is never deleted on the strength of its stored fields.
|
|
95
|
+
Only a record that passed verification can be dropped, and only when its own
|
|
96
|
+
verified `exp` is less than 60 seconds away or it was issued more than 3600 seconds
|
|
97
|
+
ago: it is then deleted and reported as `credential.show.NOT_FOUND`.
|
|
98
|
+
|
|
99
|
+
`acquire` prints one JSON document on stdout (pretty printed, nothing else on
|
|
100
|
+
stdout). The first call (`status: "code-sent"`) returns `codeExpiresAt`; enter the
|
|
101
|
+
code within 5 minutes. The second call (`status: "acquired"`) returns `issuedAt` and
|
|
102
|
+
`expiresAt`, the end of the credential's validity. Human hints go to stderr.
|
|
92
103
|
|
|
93
104
|
### Settings
|
|
94
105
|
|
|
@@ -1,38 +1,32 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { verifyStoredEmailProof, type EmailProofResult, type StoredEmailProofRecord } from '@tinycloud/node-sdk/credentials';
|
|
2
|
+
import { type CredentialRequirement } from '@tinycloud/sdk-core';
|
|
3
|
+
/** The offline re-verify used by `StoredCredentialSource`. Injectable so tests can stand in for the issuer keys. */
|
|
4
|
+
export type StoredVerifier = typeof verifyStoredEmailProof;
|
|
2
5
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
6
|
+
* Stored email credentials for the Courier agent.
|
|
7
|
+
*
|
|
8
|
+
* - `find` authenticates the stored record first, with the offline verifier, and refuses anything that
|
|
9
|
+
* fails: the record is neither returned nor deleted, and the caller gets `credential-record-invalid`.
|
|
10
|
+
* - Only then does the lifecycle apply, and only to the authenticated `issuedAt` and `expiresAt` (the
|
|
11
|
+
* verifier proves both equal the signed `iat` and `exp`): a credential with less than 60 s of its own
|
|
12
|
+
* `exp` left, or issued more than the maximum age ago, is deleted and reported as absent.
|
|
13
|
+
* Nothing is deleted on the strength of a stored field the verifier has not accepted.
|
|
5
14
|
*/
|
|
6
|
-
export
|
|
7
|
-
find(input: {
|
|
8
|
-
readonly requirement: CredentialRequirement;
|
|
9
|
-
readonly requirementDigest: string;
|
|
10
|
-
readonly holderDid: string;
|
|
11
|
-
readonly now?: Date;
|
|
12
|
-
}): Promise<StoredCredentialRecord | undefined>;
|
|
13
|
-
store(input: {
|
|
14
|
-
readonly verified: VerifiedCredential;
|
|
15
|
-
readonly requirement: CredentialRequirement;
|
|
16
|
-
readonly requirementDigest: string;
|
|
17
|
-
readonly holderDid: string;
|
|
18
|
-
readonly now?: Date;
|
|
19
|
-
}): Promise<StoredCredentialRecord>;
|
|
20
|
-
}
|
|
21
|
-
/** Stored credentials for the Courier agent. Records are dropped once they fail the requirement's window. */
|
|
22
|
-
export declare class StoredCredentialSource implements CredentialSource {
|
|
15
|
+
export declare class StoredCredentialSource {
|
|
23
16
|
private readonly home;
|
|
24
|
-
|
|
17
|
+
private readonly verify;
|
|
18
|
+
constructor(home?: string, verify?: typeof verifyStoredEmailProof);
|
|
25
19
|
find(input: {
|
|
26
20
|
readonly requirement: CredentialRequirement;
|
|
27
21
|
readonly requirementDigest: string;
|
|
28
22
|
readonly holderDid: string;
|
|
29
23
|
readonly now?: Date;
|
|
30
|
-
}): Promise<
|
|
24
|
+
}): Promise<StoredEmailProofRecord | undefined>;
|
|
31
25
|
store(input: {
|
|
32
|
-
readonly
|
|
26
|
+
readonly result: EmailProofResult;
|
|
33
27
|
readonly requirement: CredentialRequirement;
|
|
34
28
|
readonly requirementDigest: string;
|
|
35
29
|
readonly holderDid: string;
|
|
36
30
|
readonly now?: Date;
|
|
37
|
-
}): Promise<
|
|
31
|
+
}): Promise<StoredEmailProofRecord>;
|
|
38
32
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Credential store under `<home>/credentials/`.
|
|
3
3
|
*
|
|
4
|
-
* - Directory
|
|
5
|
-
* the current uid
|
|
6
|
-
*
|
|
7
|
-
* (regular file, 0600, owned by current uid, same dev/ino on open).
|
|
4
|
+
* - Directory: `ensureSecureDir` / `checkSecureDir` from `@tinycloud/node-sdk/credential-pending-store`
|
|
5
|
+
* (real directory, owner-only, owned by the current uid; a symlink is refused and never chmodded).
|
|
6
|
+
* - Files: written 0600 via O_EXCL temp + fsync + rename, and read only with O_NOFOLLOW after an
|
|
7
|
+
* lstat check (regular file, 0600, owned by current uid, same dev/ino on open). These file-level
|
|
8
|
+
* helpers are Courier-local; the pending store has its own record format.
|
|
9
|
+
* - Every `find` and `store` re-verifies the envelope offline with `verifyStoredEmailProof`.
|
|
8
10
|
*
|
|
9
11
|
* Pending email-proof requests are not stored here; `@tinycloud/node-sdk/credential-pending-store`
|
|
10
12
|
* owns them.
|
|
@@ -12,10 +14,18 @@
|
|
|
12
14
|
import fs from 'node:fs';
|
|
13
15
|
import path from 'node:path';
|
|
14
16
|
import { createHash, randomBytes } from 'node:crypto';
|
|
15
|
-
import {
|
|
17
|
+
import { checkSecureDir, ensureSecureDir } from '@tinycloud/node-sdk/credential-pending-store';
|
|
18
|
+
import { verifyStoredEmailProof, } from '@tinycloud/node-sdk/credentials';
|
|
19
|
+
import { createStoredCredentialRecord, EMAIL_CREDENTIAL_MAX_AGE_SECONDS, } from '@tinycloud/sdk-core';
|
|
16
20
|
import { CourierError } from './errors.js';
|
|
17
|
-
import {
|
|
21
|
+
import { profileDir } from './profile.js';
|
|
18
22
|
const DIR_NAME = 'credentials';
|
|
23
|
+
/**
|
|
24
|
+
* A stored credential is returned only while more than this much of its own `exp` window remains.
|
|
25
|
+
* A credential that expires within the margin is treated as expired, so a holder never starts a
|
|
26
|
+
* use that a verifier with a slightly different clock would reject.
|
|
27
|
+
*/
|
|
28
|
+
const EXPIRY_MARGIN_MS = 60_000;
|
|
19
29
|
function credentialsDir(home) {
|
|
20
30
|
return path.join(home, DIR_NAME);
|
|
21
31
|
}
|
|
@@ -47,27 +57,6 @@ function assertOwnedByCurrentUser(st, label) {
|
|
|
47
57
|
throw new CourierError('credential-permissions', `${label} is not owned by the current user.`);
|
|
48
58
|
}
|
|
49
59
|
}
|
|
50
|
-
/** Creates the store directory 0700 if absent. Refuses a symlink or a directory owned by another user. */
|
|
51
|
-
function ensureSecureDir(home) {
|
|
52
|
-
const dir = credentialsDir(home);
|
|
53
|
-
mkdirOwnerOnly(dir);
|
|
54
|
-
const st = fs.lstatSync(dir);
|
|
55
|
-
if (!st.isDirectory())
|
|
56
|
-
throw new CourierError('credential-permissions', `${dir} must be a real directory, not a symlink or file.`);
|
|
57
|
-
assertOwnedByCurrentUser(st, dir);
|
|
58
|
-
fs.chmodSync(dir, 0o700);
|
|
59
|
-
}
|
|
60
|
-
/** Returns false when the store directory does not exist. Re-checks symlink, owner, and mode on every call. */
|
|
61
|
-
function checkSecureDir(home) {
|
|
62
|
-
const dir = credentialsDir(home);
|
|
63
|
-
const st = lstatOrUndefined(dir);
|
|
64
|
-
if (!st)
|
|
65
|
-
return false;
|
|
66
|
-
if (!st.isDirectory())
|
|
67
|
-
throw new CourierError('credential-permissions', `${dir} must be a real directory, not a symlink or file.`);
|
|
68
|
-
assertOwnerOnly(st, dir, '0700');
|
|
69
|
-
return true;
|
|
70
|
-
}
|
|
71
60
|
/**
|
|
72
61
|
* Atomic owner-only write: O_EXCL|O_NOFOLLOW temp file at 0600, fsync, then rename.
|
|
73
62
|
* Refuses to replace a destination that is not a regular file.
|
|
@@ -137,11 +126,22 @@ function readOwnerOnly(home, file) {
|
|
|
137
126
|
function removeFile(file) {
|
|
138
127
|
fs.rmSync(file, { force: true });
|
|
139
128
|
}
|
|
140
|
-
/**
|
|
129
|
+
/**
|
|
130
|
+
* Stored email credentials for the Courier agent.
|
|
131
|
+
*
|
|
132
|
+
* - `find` authenticates the stored record first, with the offline verifier, and refuses anything that
|
|
133
|
+
* fails: the record is neither returned nor deleted, and the caller gets `credential-record-invalid`.
|
|
134
|
+
* - Only then does the lifecycle apply, and only to the authenticated `issuedAt` and `expiresAt` (the
|
|
135
|
+
* verifier proves both equal the signed `iat` and `exp`): a credential with less than 60 s of its own
|
|
136
|
+
* `exp` left, or issued more than the maximum age ago, is deleted and reported as absent.
|
|
137
|
+
* Nothing is deleted on the strength of a stored field the verifier has not accepted.
|
|
138
|
+
*/
|
|
141
139
|
export class StoredCredentialSource {
|
|
142
140
|
home;
|
|
143
|
-
|
|
141
|
+
verify;
|
|
142
|
+
constructor(home = profileDir(), verify = verifyStoredEmailProof) {
|
|
144
143
|
this.home = home;
|
|
144
|
+
this.verify = verify;
|
|
145
145
|
}
|
|
146
146
|
async find(input) {
|
|
147
147
|
const file = credentialFile(this.home, input.holderDid, input.requirementDigest);
|
|
@@ -149,20 +149,49 @@ export class StoredCredentialSource {
|
|
|
149
149
|
if (!record)
|
|
150
150
|
return undefined;
|
|
151
151
|
const now = input.now ?? new Date();
|
|
152
|
-
|
|
152
|
+
// The verifier enforces the validity window against the instant it is given. Authenticating at the
|
|
153
|
+
// record's own issuance instant proves the signature and every stored field regardless of the clock,
|
|
154
|
+
// so an honestly expired record is classified below from authenticated fields instead of being refused.
|
|
155
|
+
// A stored issuedAt or expiresAt that differs from the signed iat or exp is refused by the verifier.
|
|
156
|
+
const authenticatedAt = Math.max(Date.parse(record.issuedAt), Date.parse(record.notBefore));
|
|
157
|
+
try {
|
|
158
|
+
// The lifecycle below does arithmetic on these fields, so a verifier that accepted the record must not let a
|
|
159
|
+
// field that is not a date through: NaN comparisons are all false and would keep an expired record.
|
|
160
|
+
if (!Number.isFinite(authenticatedAt) || !Number.isFinite(Date.parse(record.expiresAt)))
|
|
161
|
+
throw new Error('stored record has no usable dates');
|
|
162
|
+
await this.verify({ record, requirement: input.requirement, holderDid: input.holderDid, now: new Date(authenticatedAt) });
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
throw new CourierError('credential-record-invalid', 'Stored credential failed offline verification and was not returned. Run `credential acquire` again.');
|
|
166
|
+
}
|
|
167
|
+
const expired = Date.parse(record.expiresAt) - EXPIRY_MARGIN_MS <= now.getTime();
|
|
168
|
+
const stale = now.getTime() - Date.parse(record.issuedAt) > EMAIL_CREDENTIAL_MAX_AGE_SECONDS * 1000;
|
|
169
|
+
if (expired || stale) {
|
|
153
170
|
removeFile(file);
|
|
154
171
|
return undefined;
|
|
155
172
|
}
|
|
156
173
|
return record;
|
|
157
174
|
}
|
|
158
175
|
async store(input) {
|
|
159
|
-
const
|
|
160
|
-
|
|
176
|
+
const now = input.now ?? new Date();
|
|
177
|
+
const base = await createStoredCredentialRecord({
|
|
178
|
+
verified: input.result.verified,
|
|
161
179
|
ownerDid: input.holderDid,
|
|
162
180
|
requirement: input.requirement,
|
|
163
181
|
requirementDigest: input.requirementDigest,
|
|
164
|
-
storedAt:
|
|
182
|
+
storedAt: now.toISOString(),
|
|
165
183
|
});
|
|
184
|
+
const record = {
|
|
185
|
+
...base,
|
|
186
|
+
subjectDid: input.result.envelope.subjectDid,
|
|
187
|
+
descriptor: input.result.descriptor,
|
|
188
|
+
};
|
|
189
|
+
try {
|
|
190
|
+
await this.verify({ record, requirement: input.requirement, holderDid: input.holderDid, now });
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
throw new CourierError('credential-record-invalid', 'Issued credential failed offline verification and was not stored. Request a new code.');
|
|
194
|
+
}
|
|
166
195
|
writeOwnerOnly(this.home, credentialFile(this.home, input.holderDid, input.requirementDigest), record);
|
|
167
196
|
return record;
|
|
168
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-source.js","sourceRoot":"","sources":["../src/credential-source.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"credential-source.js","sourceRoot":"","sources":["../src/credential-source.ts"],"names":[],"mappings":"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"}
|
package/dist/credential.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { completeEmailProof, requestEmailProofCode } from '@tinycloud/node-sdk/credentials';
|
|
2
2
|
import { type ParsedArgs } from './args.js';
|
|
3
3
|
import { type AgentKey } from './profile.js';
|
|
4
|
+
import { type StoredVerifier } from './credential-source.js';
|
|
4
5
|
export interface CredentialDeps {
|
|
5
6
|
home?: string;
|
|
6
7
|
now?: () => Date;
|
|
@@ -8,8 +9,11 @@ export interface CredentialDeps {
|
|
|
8
9
|
loadKey?: (home: string) => AgentKey;
|
|
9
10
|
requestCode?: typeof requestEmailProofCode;
|
|
10
11
|
completeProof?: typeof completeEmailProof;
|
|
12
|
+
/** Test seam for the offline re-verify on store and find. Defaults to verifyStoredEmailProof. */
|
|
13
|
+
verifyStored?: StoredVerifier;
|
|
11
14
|
/** Reads the first line of stdin for `--code-stdin`. */
|
|
12
15
|
readStdinLine?: () => Promise<string>;
|
|
13
16
|
out?: (text: string) => void;
|
|
17
|
+
err?: (text: string) => void;
|
|
14
18
|
}
|
|
15
19
|
export declare function cmdCredential(args: ParsedArgs, deps?: CredentialDeps): Promise<void>;
|
package/dist/credential.js
CHANGED
|
@@ -8,6 +8,8 @@ import { requireFlag } from './args.js';
|
|
|
8
8
|
import { cmd } from './program.js';
|
|
9
9
|
import { loadKey, profileDir } from './profile.js';
|
|
10
10
|
import { StoredCredentialSource } from './credential-source.js';
|
|
11
|
+
/** Code window: 5 minutes (lifecycle ruling). The witness returns no code expiry, so it is computed from the pending record's creation time. */
|
|
12
|
+
const CODE_WINDOW_MS = 5 * 60_000;
|
|
11
13
|
const acquireUsage = () => `Usage: ${cmd('credential acquire --email <addr> [--code-stdin]')}`;
|
|
12
14
|
const showUsage = () => `Usage: ${cmd('credential show --email <addr>')}`;
|
|
13
15
|
const credentialUsage = () => `${acquireUsage()}\n${showUsage()}`;
|
|
@@ -89,7 +91,9 @@ async function acquire(args, deps) {
|
|
|
89
91
|
if (older && older.requestId !== pending.requestId)
|
|
90
92
|
await store.delete(older.requestId);
|
|
91
93
|
});
|
|
92
|
-
|
|
94
|
+
const codeExpiresAt = new Date(Math.min(Date.parse(pending.expiresAt), Date.parse(pending.createdAt) + CODE_WINDOW_MS)).toISOString();
|
|
95
|
+
deps.out(JSON.stringify({ ok: true, status: 'code-sent', address, codeExpiresAt }, null, 2) + '\n');
|
|
96
|
+
deps.err(`Verification code sent to ${address}. Run \`${cmd(`credential acquire --email ${address} --code-stdin`)}\` and enter the code within 5 minutes (before ${codeExpiresAt}).\n`);
|
|
93
97
|
return;
|
|
94
98
|
}
|
|
95
99
|
// Step 2: the code is validated before any store or network access, then used once and never written.
|
|
@@ -120,22 +124,28 @@ async function acquire(args, deps) {
|
|
|
120
124
|
}
|
|
121
125
|
const requirement = emailProofRequirement(address);
|
|
122
126
|
const requirementDigest = await credentialRequirementDigest(requirement);
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
127
|
+
try {
|
|
128
|
+
await new StoredCredentialSource(deps.home, deps.verifyStored).store({
|
|
129
|
+
result,
|
|
130
|
+
requirement,
|
|
131
|
+
requirementDigest,
|
|
132
|
+
holderDid: holder.did,
|
|
133
|
+
now: deps.now(),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
// The code was consumed by the witness; the pending request is spent whether or not the record was stored.
|
|
138
|
+
await withStoreErrors(() => store.delete(pending.requestId));
|
|
139
|
+
}
|
|
140
|
+
deps.out(JSON.stringify({ ok: true, status: 'acquired', address, issuedAt: result.issuedAt, expiresAt: result.expiresAt }, null, 2) + '\n');
|
|
141
|
+
deps.err(`Email credential stored for ${address}. Valid until ${result.expiresAt}.\n`);
|
|
132
142
|
}
|
|
133
143
|
async function show(args, deps) {
|
|
134
144
|
const address = requireFlag(args, 'email', showUsage()).trim();
|
|
135
145
|
const holder = holderFor(deps.loadKey(deps.home));
|
|
136
146
|
const requirement = emailProofRequirement(address);
|
|
137
147
|
const requirementDigest = await credentialRequirementDigest(requirement);
|
|
138
|
-
const record = await new StoredCredentialSource(deps.home).find({
|
|
148
|
+
const record = await new StoredCredentialSource(deps.home, deps.verifyStored).find({
|
|
139
149
|
requirement,
|
|
140
150
|
requirementDigest,
|
|
141
151
|
holderDid: holder.did,
|
|
@@ -145,14 +155,7 @@ async function show(args, deps) {
|
|
|
145
155
|
throw new CourierError('credential.show.NOT_FOUND', `No valid stored email credential for ${address}. Run \`${cmd(`credential acquire --email ${address}`)}\`.`);
|
|
146
156
|
}
|
|
147
157
|
// The bearer `credential` (SD-JWT) is never printed.
|
|
148
|
-
deps.out(
|
|
149
|
-
`email: ${record.claims.email}`,
|
|
150
|
-
`credentialId: ${record.credentialId}`,
|
|
151
|
-
`issuedAt: ${record.issuedAt}`,
|
|
152
|
-
`expiresAt: ${record.expiresAt}`,
|
|
153
|
-
`status: ${record.status.method}`,
|
|
154
|
-
'',
|
|
155
|
-
].join('\n'));
|
|
158
|
+
deps.out(JSON.stringify({ ok: true, address, credentialId: record.credentialId, issuedAt: record.issuedAt, expiresAt: record.expiresAt, status: record.status.method }, null, 2) + '\n');
|
|
156
159
|
}
|
|
157
160
|
export async function cmdCredential(args, deps = {}) {
|
|
158
161
|
const resolved = {
|
|
@@ -162,8 +165,10 @@ export async function cmdCredential(args, deps = {}) {
|
|
|
162
165
|
loadKey: deps.loadKey ?? ((home) => loadKey(home)),
|
|
163
166
|
requestCode: deps.requestCode ?? requestEmailProofCode,
|
|
164
167
|
completeProof: deps.completeProof ?? completeEmailProof,
|
|
168
|
+
verifyStored: deps.verifyStored,
|
|
165
169
|
readStdinLine: deps.readStdinLine ?? readStdinFirstLine,
|
|
166
170
|
out: deps.out ?? ((text) => { process.stdout.write(text); }),
|
|
171
|
+
err: deps.err ?? ((text) => { process.stderr.write(text); }),
|
|
167
172
|
};
|
|
168
173
|
switch (args.positional[0]) {
|
|
169
174
|
case 'acquire': return acquire(args, resolved);
|
package/dist/credential.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../src/credential.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,IAAI,IAAI,UAAU,EAAmC,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,GAItB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,gCAAgC,EAAE,iBAAiB,EAAmC,MAAM,8CAA8C,CAAC;AACpJ,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAmB,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAiB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../src/credential.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -10,6 +10,7 @@ import { cmdPause, cmdResume } from './pause.js';
|
|
|
10
10
|
import { cmdGuard } from './guard/command.js';
|
|
11
11
|
import { cmdBroker, cmdRunApproved } from './broker.js';
|
|
12
12
|
import { cmdCredential } from './credential.js';
|
|
13
|
+
import { courierVersion } from './version.js';
|
|
13
14
|
function usage() {
|
|
14
15
|
const name = programName();
|
|
15
16
|
return `${name} — agent-to-agent threads over TinyCloud (v0)
|
|
@@ -127,6 +128,10 @@ api.openkey.so for openkey.so, otherwise the OpenKey host).
|
|
|
127
128
|
export async function run(argv) {
|
|
128
129
|
const args = parseArgs(argv);
|
|
129
130
|
const command = args.positional[0];
|
|
131
|
+
if (!command && args.has('version')) {
|
|
132
|
+
process.stdout.write(`${courierVersion()}\n`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
130
135
|
if (command === 'request' && args.has('help')) {
|
|
131
136
|
process.stdout.write(requestHelp());
|
|
132
137
|
return;
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,GAClH,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/profile.d.ts
CHANGED
|
@@ -56,6 +56,10 @@ export interface Profile {
|
|
|
56
56
|
spacePending?: true;
|
|
57
57
|
peers: Record<string, StoredPeer>;
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Courier home: `COURIER_HOME` when set, else `$HOME/.courier`. Refuses an unset or empty `HOME`
|
|
61
|
+
* rather than guessing a home directory.
|
|
62
|
+
*/
|
|
59
63
|
export declare function profileDir(): string;
|
|
60
64
|
export declare function profileExists(): boolean;
|
|
61
65
|
export declare function mkdirOwnerOnly(dir: string): void;
|
package/dist/profile.js
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import os from 'node:os';
|
|
4
3
|
import { randomBytes } from 'node:crypto';
|
|
5
4
|
import { cmd } from './program.js';
|
|
6
5
|
import { CourierError } from './errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* Courier home: `COURIER_HOME` when set, else `$HOME/.courier`. Refuses an unset or empty `HOME`
|
|
8
|
+
* rather than guessing a home directory.
|
|
9
|
+
*/
|
|
7
10
|
export function profileDir() {
|
|
8
|
-
|
|
11
|
+
if (process.env.COURIER_HOME)
|
|
12
|
+
return process.env.COURIER_HOME;
|
|
13
|
+
const home = process.env.HOME;
|
|
14
|
+
if (!home)
|
|
15
|
+
throw new CourierError('home-unset', 'HOME is not set. Set HOME or COURIER_HOME to choose where Courier stores its state.');
|
|
16
|
+
return path.join(home, '.courier');
|
|
9
17
|
}
|
|
10
18
|
function profilePath(name, home = profileDir()) {
|
|
11
19
|
return path.join(home, name);
|
package/dist/profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
/** Package version from the `package.json` beside `dist/` (npm always ships it). */
|
|
3
|
+
export function courierVersion() {
|
|
4
|
+
const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
|
|
5
|
+
if (typeof pkg.version !== 'string' || pkg.version === '')
|
|
6
|
+
throw new Error('courier package.json has no version');
|
|
7
|
+
return pkg.version;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,oFAAoF;AACpF,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAA0B,CAAC;IACnH,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAClH,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tinycloud/courier",
|
|
3
|
-
"version": "0.3.0-beta.
|
|
3
|
+
"version": "0.3.0-beta.6",
|
|
4
4
|
"description": "Courier: agent-to-agent threads over TinyCloud (CLI, library and agent skill)",
|
|
5
5
|
"author": "TinyCloud, Inc.",
|
|
6
6
|
"type": "module",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"test:live": "tsc -p tsconfig.json && node scripts/happy-path.mjs"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@tinycloud/node-sdk": "3.6.0-beta.
|
|
33
|
+
"@tinycloud/node-sdk": "3.6.0-beta.7",
|
|
34
34
|
"@tinycloud/sdk-core": "3.6.0-beta.4",
|
|
35
35
|
"ulid": "^3.0.2"
|
|
36
36
|
},
|