@inharness-ai/claude4spec 1.0.6 → 1.0.7
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/CHANGELOG.md +16 -0
- package/dist/client/assets/{arc-CqFoQdai.js → arc-BaZhf2Hh.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-CIEQ1CV_.js → architectureDiagram-3BPJPVTR-CSSQUdKD.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-DwCCDYZs.js → blockDiagram-GPEHLZMM-BlmKwjoI.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-DB988zZs.js → c4Diagram-AAUBKEIU-C7helt0Z.js} +1 -1
- package/dist/client/assets/channel-CHGfOh3d.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-Bwc9B4Id.js → chunk-2J33WTMH-CC-e13sC.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-ClOw-zt3.js → chunk-4BX2VUAB-D-HpWY8q.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-B513D_Oz.js → chunk-55IACEB6-BSPwaiEp.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-CvT-ppRD.js → chunk-727SXJPM-CQbEHPPO.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-BDZ-uKjF.js → chunk-AQP2D5EJ-BpSrKpmB.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-DlnsCvyP.js → chunk-FMBD7UC4-zE1R3SR8.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-Cv4kIfqi.js → chunk-ND2GUHAM-CqN17qqH.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-Boyq-O-A.js → chunk-QZHKN3VN-13BvG3Jp.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DxbfnZUt.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DxbfnZUt.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-B4fXXqZV.js → cose-bilkent-S5V4N54A-CO574VR8.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-D7JvdAaj.js → dagre-BM42HDAG-BEVJuqdY.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-TqVC9_06.js → diagram-2AECGRRQ-CGCBS-dy.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-BJE7Sfvp.js → diagram-5GNKFQAL-Dyq0_Rlp.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-dDI3Q4Xy.js → diagram-KO2AKTUF-BpiCh3Ed.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-zrNXdbAH.js → diagram-LMA3HP47-XJeaihzL.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-C9RoGREB.js → diagram-OG6HWLK6-Bb_LX7wz.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-BIOg0Mgx.js → erDiagram-TEJ5UH35-D-slZ-dN.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-C5olRPEY.js → flowDiagram-I6XJVG4X-B_SOoctl.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-Daqt3_2M.js → ganttDiagram-6RSMTGT7-B3UsanUx.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-E09LH7cR.js → gitGraphDiagram-PVQCEYII-C9RzuImP.js} +1 -1
- package/dist/client/assets/{index-CMsZQS3t.js → index-BnYPnnod.js} +1 -1
- package/dist/client/assets/{index-BwbjYrNH.js → index-CQBB3Uf4.js} +1 -1
- package/dist/client/assets/index-DamovIDe.js +752 -0
- package/dist/client/assets/{index-zpHL2aYW.css → index-yeyi8oQf.css} +1 -1
- package/dist/client/assets/{infoDiagram-5YYISTIA-Cy_D0LmA.js → infoDiagram-5YYISTIA-CcaL3dnH.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-B3cvnpaf.js → ishikawaDiagram-YF4QCWOH-Drl0TLDq.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-IR8sEnrO.js → journeyDiagram-JHISSGLW-Ia46_5df.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-DHaqk7jz.js → kanban-definition-UN3LZRKU-CkDPRy8x.js} +1 -1
- package/dist/client/assets/{linear-BJO3kbAY.js → linear-BJ5HYD7N.js} +1 -1
- package/dist/client/assets/{mermaid.core-Dwygsmt4.js → mermaid.core-DohfSRYI.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-C9XVPJV6.js → mindmap-definition-RKZ34NQL-CN1i3cXM.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-CZldRk6l.js → pieDiagram-4H26LBE5-Boz7UISz.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CY053ghg.js → quadrantDiagram-W4KKPZXB-DOBPTFZq.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DQbMS7j1.js → requirementDiagram-4Y6WPE33-c0jMOQGX.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C5w3huvN.js → sankeyDiagram-5OEKKPKP-D-AwIne0.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-nF1GikPI.js → sequenceDiagram-3UESZ5HK-BgMjP-Q1.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CxjKXGSz.js → stateDiagram-AJRCARHV-8qvFMuv5.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Doe04F42.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-q0ZvTC5H.js → timeline-definition-PNZ67QCA-Q1t7Xr5L.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CO7sztp2.js → vennDiagram-CIIHVFJN-atIUY_uM.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-JeTZFzC9.js → wardley-L42UT6IY-Dg8nGqpF.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-COpCQvmO.js → wardleyDiagram-YWT4CUSO-B26t7Hde.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-C78ptl5b.js → xychartDiagram-2RQKCTM6-uz4jM4Hi.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/config.d.ts +6 -0
- package/dist/server/config.js +19 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/db/migrations/030_remote_session.sql +29 -0
- package/dist/server/entities/ac/system-prompt.js +6 -6
- package/dist/server/entities/ac/system-prompt.js.map +1 -1
- package/dist/server/index.js +14 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/errors.js +3 -0
- package/dist/server/routes/errors.js.map +1 -1
- package/dist/server/routes/remote-account.d.ts +8 -0
- package/dist/server/routes/remote-account.js +49 -0
- package/dist/server/routes/remote-account.js.map +1 -0
- package/dist/server/services/plan.js +6 -6
- package/dist/server/services/plan.js.map +1 -1
- package/dist/server/services/remote-auth.d.ts +31 -0
- package/dist/server/services/remote-auth.js +124 -0
- package/dist/server/services/remote-auth.js.map +1 -0
- package/dist/server/services/remote-http-client.d.ts +85 -0
- package/dist/server/services/remote-http-client.js +107 -0
- package/dist/server/services/remote-http-client.js.map +1 -0
- package/dist/shared/remote-account.d.ts +58 -0
- package/dist/shared/remote-account.js +8 -0
- package/dist/shared/remote-account.js.map +1 -0
- package/package.json +1 -1
- package/dist/client/assets/channel-mXCQ_joU.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CvLk0Sg1.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CvLk0Sg1.js +0 -1
- package/dist/client/assets/index-CUhhC6SY.js +0 -742
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CLYCEwSk.js +0 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M24 — the single abstraction over `fetch` to the remote claude4spec-API.
|
|
3
|
+
* Owned by M24, consumed by future M25; no other module talks to the remote
|
|
4
|
+
* directly. Base URL = `config.remoteApiUrl ?? PROD_REMOTE_URL` (the override is
|
|
5
|
+
* dev/staging only — it is never persisted to `remote_session`, never logged,
|
|
6
|
+
* and is not a secret). The Bearer is injected into owner-only calls only;
|
|
7
|
+
* `/v1/auth/device/*` are unauthenticated.
|
|
8
|
+
*
|
|
9
|
+
* The remote wire contracts mirrored below are the claude4spec-api M02/M03 DTOs
|
|
10
|
+
* (`@c4s/types`), duplicated here as local interfaces because the two repos do
|
|
11
|
+
* not share a package.
|
|
12
|
+
*/
|
|
13
|
+
/** Hardcoded production remote. `config.remoteApiUrl` overrides for dev/staging. */
|
|
14
|
+
export const PROD_REMOTE_URL = 'https://claude4spec.inharness.ai';
|
|
15
|
+
/**
|
|
16
|
+
* Thrown when an owner-only remote call returns 401 — the caller must clear the
|
|
17
|
+
* local `remote_session` and force a fresh device flow.
|
|
18
|
+
*/
|
|
19
|
+
export class RemoteUnauthorizedError extends Error {
|
|
20
|
+
constructor(message = 'remote session expired') {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = 'RemoteUnauthorizedError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Thrown for transport-level failures (connection refused / 5xx / unexpected shape). */
|
|
26
|
+
export class RemoteRequestError extends Error {
|
|
27
|
+
status;
|
|
28
|
+
constructor(message, status) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.status = status;
|
|
31
|
+
this.name = 'RemoteRequestError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class RemoteHttpClient {
|
|
35
|
+
baseUrl;
|
|
36
|
+
constructor(remoteApiUrl) {
|
|
37
|
+
this.baseUrl = (remoteApiUrl ?? PROD_REMOTE_URL).replace(/\/+$/, '');
|
|
38
|
+
}
|
|
39
|
+
get base() {
|
|
40
|
+
return this.baseUrl;
|
|
41
|
+
}
|
|
42
|
+
/** POST /v1/auth/device/code — unauthenticated. Initiates the device flow. */
|
|
43
|
+
async startDeviceFlow() {
|
|
44
|
+
const res = await this.fetchRemote('/v1/auth/device/code', { method: 'POST' });
|
|
45
|
+
if (!res.ok)
|
|
46
|
+
throw new RemoteRequestError(`device/code failed (HTTP ${res.status})`, res.status);
|
|
47
|
+
return (await res.json());
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* POST /v1/auth/device/token — unauthenticated, authorized by the device_code
|
|
51
|
+
* itself. 200 → token (issued once); 400 → polling-state envelope
|
|
52
|
+
* (authorization_pending / slow_down / terminal).
|
|
53
|
+
*/
|
|
54
|
+
async pollDeviceToken(deviceCode) {
|
|
55
|
+
const res = await this.fetchRemote('/v1/auth/device/token', {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: { 'content-type': 'application/json' },
|
|
58
|
+
body: JSON.stringify({ device_code: deviceCode }),
|
|
59
|
+
});
|
|
60
|
+
if (res.ok) {
|
|
61
|
+
return { ok: true, token: (await res.json()) };
|
|
62
|
+
}
|
|
63
|
+
if (res.status === 400) {
|
|
64
|
+
const body = (await res.json().catch(() => null));
|
|
65
|
+
if (body?.error)
|
|
66
|
+
return { ok: false, error: body.error, description: body.error_description };
|
|
67
|
+
}
|
|
68
|
+
throw new RemoteRequestError(`device/token failed (HTTP ${res.status})`, res.status);
|
|
69
|
+
}
|
|
70
|
+
/** GET /v1/account — owner-only (Bearer). 401 → RemoteUnauthorizedError. */
|
|
71
|
+
async getAccount(accessToken) {
|
|
72
|
+
const res = await this.fetchRemote('/v1/account', {
|
|
73
|
+
method: 'GET',
|
|
74
|
+
headers: { authorization: `Bearer ${accessToken}` },
|
|
75
|
+
});
|
|
76
|
+
if (res.status === 401)
|
|
77
|
+
throw new RemoteUnauthorizedError();
|
|
78
|
+
if (!res.ok)
|
|
79
|
+
throw new RemoteRequestError(`GET /v1/account failed (HTTP ${res.status})`, res.status);
|
|
80
|
+
return (await res.json());
|
|
81
|
+
}
|
|
82
|
+
async fetchRemote(path, init) {
|
|
83
|
+
try {
|
|
84
|
+
return await fetch(`${this.baseUrl}${path}`, init);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
throw new RemoteRequestError(`request to remote ${path} failed: ${err.message}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Startup reachability check for an explicit `config.remoteApiUrl` override.
|
|
93
|
+
* "Reachable" = the host answers at all (any HTTP status); only a transport
|
|
94
|
+
* failure / timeout counts as unreachable. No fallback to PROD_REMOTE_URL — an
|
|
95
|
+
* explicit override must be honoured or reported (brief §1). Throws with the
|
|
96
|
+
* exact contract message.
|
|
97
|
+
*/
|
|
98
|
+
export async function assertRemoteApiReachable(remoteApiUrl, timeoutMs = 3000) {
|
|
99
|
+
const base = remoteApiUrl.replace(/\/+$/, '');
|
|
100
|
+
try {
|
|
101
|
+
await fetch(`${base}/v1/health`, { method: 'HEAD', signal: AbortSignal.timeout(timeoutMs) });
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
throw new Error(`config.json: field 'remoteApiUrl': invalid URL or unreachable host`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=remote-http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-http-client.js","sourceRoot":"","sources":["../../../src/server/services/remote-http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M24 Remote Account — DTOs exposed by `/api/remote-account/*` to the c4s
|
|
3
|
+
* client. These are M24's OWN surface, intentionally decoupled from the
|
|
4
|
+
* remote-API wire format (claude4spec-api `@c4s/types`). The backend
|
|
5
|
+
* (`remote-auth.ts`) maps the remote's device-flow contract onto these shapes.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* `POST /api/remote-account/login/start` — device flow initiated. The raw
|
|
9
|
+
* `device_code` is NOT exposed: the backend keeps it in memory (single flow per
|
|
10
|
+
* c4s instance) and supplies it itself when polling, so the secret never lands
|
|
11
|
+
* in the browser.
|
|
12
|
+
*/
|
|
13
|
+
export interface DeviceLoginStartResponse {
|
|
14
|
+
/** Short human-readable code (format `XXXX-XXXX`) typed on the verification page. */
|
|
15
|
+
user_code: string;
|
|
16
|
+
/** Verification page URL without the code (fallback). */
|
|
17
|
+
verification_uri: string;
|
|
18
|
+
/** Verification URL with the code prefilled — primary CTA (qr-code-ready). */
|
|
19
|
+
verification_uri_complete: string;
|
|
20
|
+
/** Seconds between polls; the client increases it when the remote says `slow_down`. */
|
|
21
|
+
interval: number;
|
|
22
|
+
/** Flow TTL in seconds; once exceeded the flow goes terminal `expired`. */
|
|
23
|
+
expires_in: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Status surfaced by `POST /api/remote-account/login/poll`. Non-terminal:
|
|
27
|
+
* `pending` / `slow_down` (keep polling). Terminal: `authorized` (session
|
|
28
|
+
* saved) and `expired` / `denied` / `invalid` (stop). Mapped from the remote
|
|
29
|
+
* device-token enum (`authorization_pending | slow_down | expired_token |
|
|
30
|
+
* access_denied | invalid_grant`).
|
|
31
|
+
*/
|
|
32
|
+
export type DeviceLoginStatus = 'pending' | 'slow_down' | 'authorized' | 'expired' | 'denied' | 'invalid';
|
|
33
|
+
export interface DeviceLoginPollResponse {
|
|
34
|
+
status: DeviceLoginStatus;
|
|
35
|
+
/** Only for `slow_down` — new recommended interval (seconds). */
|
|
36
|
+
interval?: number;
|
|
37
|
+
/** User-facing message for terminal errors. */
|
|
38
|
+
message?: string;
|
|
39
|
+
/** Only for `authorized` — lets the UI jump straight to "connected as X" without a follow-up GET. */
|
|
40
|
+
account?: RemoteAccountResponse;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* `GET /api/remote-account` — the sidebar's identity source. NEVER exposes
|
|
44
|
+
* `access_token`. Stable contract consumed by the sidebar (TanStack Query key
|
|
45
|
+
* `["remote-account"]`) and, later, by M25 publish.
|
|
46
|
+
*/
|
|
47
|
+
export interface RemoteAccountResponse {
|
|
48
|
+
/** `true` when a `remote_session` row exists. */
|
|
49
|
+
connected: boolean;
|
|
50
|
+
/** UUID of the remote account (`remote_session.remote_account_id`). */
|
|
51
|
+
remoteAccountId?: string;
|
|
52
|
+
/** UI label — the only "connected as X" identity the remote exposes. */
|
|
53
|
+
accountEmail?: string;
|
|
54
|
+
/** `deactivated` blocks publish (M25). */
|
|
55
|
+
accountStatus?: 'active' | 'deactivated';
|
|
56
|
+
/** ISO 8601 from `remote_session.connected_at`. */
|
|
57
|
+
connectedAt?: string;
|
|
58
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M24 Remote Account — DTOs exposed by `/api/remote-account/*` to the c4s
|
|
3
|
+
* client. These are M24's OWN surface, intentionally decoupled from the
|
|
4
|
+
* remote-API wire format (claude4spec-api `@c4s/types`). The backend
|
|
5
|
+
* (`remote-auth.ts`) maps the remote's device-flow contract onto these shapes.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=remote-account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-account.js","sourceRoot":"","sources":["../../src/shared/remote-account.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inharness-ai/claude4spec",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Plan the whole system before your agent writes a line of code. Local-first planning layer with structured entities and typed relations.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Michael Tomala <mi.tomala@gmail.com>",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ai as o,aj as n}from"./mermaid.core-Dwygsmt4.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-727SXJPM-CvT-ppRD.js";import{_ as i}from"./mermaid.core-Dwygsmt4.js";import"./chunk-FMBD7UC4-DlnsCvyP.js";import"./chunk-ND2GUHAM-Cv4kIfqi.js";import"./chunk-55IACEB6-B513D_Oz.js";import"./chunk-2J33WTMH-Bwc9B4Id.js";import"./index-CUhhC6SY.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-727SXJPM-CvT-ppRD.js";import{_ as i}from"./mermaid.core-Dwygsmt4.js";import"./chunk-FMBD7UC4-DlnsCvyP.js";import"./chunk-ND2GUHAM-Cv4kIfqi.js";import"./chunk-55IACEB6-B513D_Oz.js";import"./chunk-2J33WTMH-Bwc9B4Id.js";import"./index-CUhhC6SY.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
|