gestalt-mobile 0.1.0
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 +661 -0
- package/README.md +133 -0
- package/dist/client/assets/index-0wjiXBGW.js +10 -0
- package/dist/client/assets/index-CfoipqOl.css +1 -0
- package/dist/client/branding/dyne-logotype-black.svg +17 -0
- package/dist/client/branding/dyne-logotype-white.svg +17 -0
- package/dist/client/branding/p_glogo_grey.svg +8 -0
- package/dist/client/branding/p_glogo_white.svg +8 -0
- package/dist/client/branding/t_glogo_grey.svg +9 -0
- package/dist/client/branding/t_glogo_white.svg +9 -0
- package/dist/client/index.html +19 -0
- package/dist/server/server/app.js +148 -0
- package/dist/server/server/cli/list-sessions.js +13 -0
- package/dist/server/server/cli.js +126 -0
- package/dist/server/server/composition.js +237 -0
- package/dist/server/server/config.js +37 -0
- package/dist/server/server/features/catalog/application/ports.js +6 -0
- package/dist/server/server/features/catalog/get-bootstrap/endpoint.js +9 -0
- package/dist/server/server/features/catalog/get-bootstrap/request.js +6 -0
- package/dist/server/server/features/catalog/get-bootstrap/response.js +6 -0
- package/dist/server/server/features/catalog/get-bootstrap/use-case.js +19 -0
- package/dist/server/server/features/git/checkout-branch/endpoint.js +27 -0
- package/dist/server/server/features/git/clone-repository/endpoint.js +19 -0
- package/dist/server/server/features/git/get-summary/endpoint.js +13 -0
- package/dist/server/server/features/git/pull-rebase/endpoint.js +22 -0
- package/dist/server/server/features/git/push-policy.js +14 -0
- package/dist/server/server/features/git/push-upstream/endpoint.js +29 -0
- package/dist/server/server/features/git/refresh/endpoint.js +24 -0
- package/dist/server/server/features/git/refresh-policy.js +8 -0
- package/dist/server/server/features/health/get-health/endpoint.js +8 -0
- package/dist/server/server/features/health/get-health/request.js +6 -0
- package/dist/server/server/features/health/get-health/response.js +6 -0
- package/dist/server/server/features/sessions/application/ports.js +6 -0
- package/dist/server/server/features/sessions/application/resume-command.js +22 -0
- package/dist/server/server/features/sessions/application/start-settings.js +6 -0
- package/dist/server/server/features/sessions/forget-session/endpoint.js +15 -0
- package/dist/server/server/features/sessions/get-history/endpoint.js +20 -0
- package/dist/server/server/features/sessions/get-history/history-mapper.js +82 -0
- package/dist/server/server/features/sessions/get-session/endpoint.js +17 -0
- package/dist/server/server/features/sessions/history/use-case.js +8 -0
- package/dist/server/server/features/sessions/interaction/kind.js +8 -0
- package/dist/server/server/features/sessions/interaction/response-guard.js +8 -0
- package/dist/server/server/features/sessions/interaction/response-validator.js +35 -0
- package/dist/server/server/features/sessions/interrupt-turn/endpoint.js +19 -0
- package/dist/server/server/features/sessions/interrupt-turn/use-case.js +10 -0
- package/dist/server/server/features/sessions/lifecycle/use-case.js +15 -0
- package/dist/server/server/features/sessions/list-recent-threads/endpoint.js +11 -0
- package/dist/server/server/features/sessions/list-sessions/endpoint.js +12 -0
- package/dist/server/server/features/sessions/list-sessions/use-case.js +8 -0
- package/dist/server/server/features/sessions/model/errors.js +13 -0
- package/dist/server/server/features/sessions/model/events.js +6 -0
- package/dist/server/server/features/sessions/model/relay-session.js +122 -0
- package/dist/server/server/features/sessions/model/value-objects.js +22 -0
- package/dist/server/server/features/sessions/promote-recent-thread/endpoint.js +29 -0
- package/dist/server/server/features/sessions/promote-recent-thread/use-case.js +26 -0
- package/dist/server/server/features/sessions/release-session/endpoint.js +25 -0
- package/dist/server/server/features/sessions/release-session/use-case.js +9 -0
- package/dist/server/server/features/sessions/respond-interaction/endpoint.js +24 -0
- package/dist/server/server/features/sessions/restore-session/endpoint.js +27 -0
- package/dist/server/server/features/sessions/restore-session/use-case.js +17 -0
- package/dist/server/server/features/sessions/session-events/endpoint.js +44 -0
- package/dist/server/server/features/sessions/start-session/endpoint.js +37 -0
- package/dist/server/server/features/sessions/start-session/request.js +22 -0
- package/dist/server/server/features/sessions/start-session/use-case.js +29 -0
- package/dist/server/server/features/sessions/start-turn/endpoint.js +20 -0
- package/dist/server/server/features/sessions/stop-session/endpoint.js +25 -0
- package/dist/server/server/features/sessions/stop-session/use-case.js +9 -0
- package/dist/server/server/features/sessions/turn/start-policy.js +8 -0
- package/dist/server/server/index.js +7 -0
- package/dist/server/server/main.js +14 -0
- package/dist/server/server/platform/catalog/codex-profile-catalog.js +42 -0
- package/dist/server/server/platform/catalog/filesystem-workspace-catalog.js +60 -0
- package/dist/server/server/platform/catalog/profile-command.js +19 -0
- package/dist/server/server/platform/catalog/workspace-id.js +9 -0
- package/dist/server/server/platform/codex/approval-policy.js +8 -0
- package/dist/server/server/platform/codex/codex-process-launcher.js +27 -0
- package/dist/server/server/platform/codex/error-code.js +10 -0
- package/dist/server/server/platform/codex/json-rpc-client.js +71 -0
- package/dist/server/server/platform/codex/normalizer.js +81 -0
- package/dist/server/server/platform/codex/protocol-compatibility.js +12 -0
- package/dist/server/server/platform/codex/recent-thread-lister.js +49 -0
- package/dist/server/server/platform/codex/server-request.js +14 -0
- package/dist/server/server/platform/codex/session-runtime.js +142 -0
- package/dist/server/server/platform/codex/thread-id.js +10 -0
- package/dist/server/server/platform/events/replay.js +12 -0
- package/dist/server/server/platform/events/session-event-bus.js +17 -0
- package/dist/server/server/platform/events/slow-client.js +9 -0
- package/dist/server/server/platform/events/websocket-heartbeat.js +20 -0
- package/dist/server/server/platform/git/command.js +13 -0
- package/dist/server/server/platform/git/git-fetch-coordinator.js +40 -0
- package/dist/server/server/platform/git/git-inspector.js +116 -0
- package/dist/server/server/platform/git/git-summary-cache.js +26 -0
- package/dist/server/server/platform/git/git-summary.js +8 -0
- package/dist/server/server/platform/http/idempotency.js +9 -0
- package/dist/server/server/platform/http/problem-handler.js +32 -0
- package/dist/server/server/platform/http/problem.js +15 -0
- package/dist/server/server/platform/observability/safe-log.js +9 -0
- package/dist/server/server/platform/persistence/migrate.js +9 -0
- package/dist/server/server/platform/persistence/retention.js +9 -0
- package/dist/server/server/platform/persistence/sqlite-event-journal.js +50 -0
- package/dist/server/server/platform/persistence/sqlite-idempotency-store.js +22 -0
- package/dist/server/server/platform/persistence/sqlite-pending-interaction-store.js +33 -0
- package/dist/server/server/platform/persistence/sqlite-session-repository.js +43 -0
- package/dist/server/server/platform/persistence/sqlite.js +14 -0
- package/dist/server/server/platform/persistence/state-path.js +16 -0
- package/dist/server/server/platform/runtime/clock.js +9 -0
- package/dist/server/server/platform/runtime/concurrency.js +15 -0
- package/dist/server/server/platform/runtime/retry-policy.js +9 -0
- package/dist/server/server/platform/runtime/session-supervisor.js +41 -0
- package/dist/server/shared/contracts/problem.js +6 -0
- package/dist/server/shared/contracts/session-event.js +6 -0
- package/package.json +78 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
export const eventRetention = 2000;
|
|
7
|
+
export function retainedSequences(sequences) {
|
|
8
|
+
return sequences.slice(-eventRetention);
|
|
9
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
export class SqliteEventJournal {
|
|
7
|
+
db;
|
|
8
|
+
retain;
|
|
9
|
+
constructor(db, retain = 2000) {
|
|
10
|
+
this.db = db;
|
|
11
|
+
this.retain = retain;
|
|
12
|
+
}
|
|
13
|
+
append(sessionId, type, payload, occurredAt) {
|
|
14
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
15
|
+
try {
|
|
16
|
+
const row = this.db
|
|
17
|
+
.prepare('SELECT next_sequence AS sequence FROM relay_sessions WHERE id = ?')
|
|
18
|
+
.get(sessionId);
|
|
19
|
+
if (!row)
|
|
20
|
+
throw new Error('SESSION_NOT_FOUND');
|
|
21
|
+
this.db
|
|
22
|
+
.prepare('INSERT INTO session_events (session_id,sequence,occurred_at,type,payload_json) VALUES (?,?,?,?,?)')
|
|
23
|
+
.run(sessionId, row.sequence, occurredAt, type, JSON.stringify(payload));
|
|
24
|
+
this.db
|
|
25
|
+
.prepare('UPDATE relay_sessions SET next_sequence = next_sequence + 1 WHERE id = ?')
|
|
26
|
+
.run(sessionId);
|
|
27
|
+
this.db
|
|
28
|
+
.prepare('DELETE FROM session_events WHERE session_id = ? AND sequence NOT IN (SELECT sequence FROM session_events WHERE session_id = ? ORDER BY sequence DESC LIMIT ?)')
|
|
29
|
+
.run(sessionId, sessionId, this.retain);
|
|
30
|
+
const event = { sessionId, sequence: row.sequence, type, occurredAt, payload };
|
|
31
|
+
this.db.exec('COMMIT');
|
|
32
|
+
return event;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
this.db.exec('ROLLBACK');
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
since(sessionId, after) {
|
|
40
|
+
return this.db
|
|
41
|
+
.prepare('SELECT sequence,type,occurred_at,payload_json FROM session_events WHERE session_id = ? AND sequence > ? ORDER BY sequence')
|
|
42
|
+
.all(sessionId, after).map((row) => ({
|
|
43
|
+
sessionId,
|
|
44
|
+
sequence: row.sequence,
|
|
45
|
+
type: row.type,
|
|
46
|
+
occurredAt: row.occurred_at,
|
|
47
|
+
payload: JSON.parse(row.payload_json),
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
export class SqliteIdempotencyStore {
|
|
7
|
+
db;
|
|
8
|
+
constructor(db) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
}
|
|
11
|
+
get(scope, key) {
|
|
12
|
+
const row = this.db
|
|
13
|
+
.prepare('SELECT status_code, body_json FROM idempotency_results WHERE scope = ? AND key = ?')
|
|
14
|
+
.get(scope, key);
|
|
15
|
+
return row ? { statusCode: row.status_code, body: row.body_json } : null;
|
|
16
|
+
}
|
|
17
|
+
put(scope, key, statusCode, body) {
|
|
18
|
+
this.db
|
|
19
|
+
.prepare('INSERT OR IGNORE INTO idempotency_results (scope,key,status_code,body_json) VALUES (?,?,?,?)')
|
|
20
|
+
.run(scope, key, statusCode, body);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
export class SqlitePendingInteractionStore {
|
|
7
|
+
db;
|
|
8
|
+
constructor(db) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
}
|
|
11
|
+
add(sessionId, interaction) {
|
|
12
|
+
this.db
|
|
13
|
+
.prepare('INSERT INTO pending_interactions (session_id,request_id,kind,payload_json) VALUES (?,?,?,?)')
|
|
14
|
+
.run(sessionId, interaction.requestId, interaction.kind, JSON.stringify(interaction.payload));
|
|
15
|
+
}
|
|
16
|
+
resolve(sessionId, requestId, resolvedAt) {
|
|
17
|
+
return (this.db
|
|
18
|
+
.prepare('UPDATE pending_interactions SET resolved_at = ? WHERE session_id = ? AND request_id = ? AND resolved_at IS NULL')
|
|
19
|
+
.run(resolvedAt, sessionId, requestId).changes === 1);
|
|
20
|
+
}
|
|
21
|
+
list(sessionId) {
|
|
22
|
+
return this.db
|
|
23
|
+
.prepare('SELECT request_id,kind,payload_json FROM pending_interactions WHERE session_id = ? AND resolved_at IS NULL ORDER BY rowid')
|
|
24
|
+
.all(sessionId).map((row) => ({
|
|
25
|
+
requestId: row.request_id,
|
|
26
|
+
kind: row.kind,
|
|
27
|
+
payload: JSON.parse(row.payload_json),
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
find(sessionId, requestId) {
|
|
31
|
+
return this.list(sessionId).find((interaction) => interaction.requestId === requestId) ?? null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
export class SqliteSessionRepository {
|
|
7
|
+
db;
|
|
8
|
+
constructor(db) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
}
|
|
11
|
+
save(session) {
|
|
12
|
+
this.db
|
|
13
|
+
.prepare('INSERT INTO relay_sessions (id,workspace_id,workspace_path,profile,thread_id,state,desired_state,active_turn_id,protocol_version,failure_count,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET workspace_id=excluded.workspace_id,workspace_path=excluded.workspace_path,profile=excluded.profile,thread_id=excluded.thread_id,state=excluded.state,desired_state=excluded.desired_state,active_turn_id=excluded.active_turn_id,protocol_version=excluded.protocol_version,failure_count=excluded.failure_count,updated_at=excluded.updated_at')
|
|
14
|
+
.run(session.id, session.workspaceId, session.workspacePath, session.profile, session.threadId, session.state, session.desiredState, session.activeTurnId, session.protocolVersion, session.failureCount, session.createdAt, session.updatedAt);
|
|
15
|
+
}
|
|
16
|
+
find(id) {
|
|
17
|
+
const row = this.db.prepare('SELECT * FROM relay_sessions WHERE id = ?').get(id);
|
|
18
|
+
return row ? map(row) : null;
|
|
19
|
+
}
|
|
20
|
+
list() {
|
|
21
|
+
return this.db.prepare('SELECT * FROM relay_sessions ORDER BY updated_at DESC').all().map(map);
|
|
22
|
+
}
|
|
23
|
+
remove(id) {
|
|
24
|
+
this.db.prepare('DELETE FROM relay_sessions WHERE id = ?').run(id);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function map(row) {
|
|
28
|
+
return {
|
|
29
|
+
id: row.id,
|
|
30
|
+
workspaceId: row.workspace_id,
|
|
31
|
+
workspacePath: row.workspace_path,
|
|
32
|
+
profile: row.profile,
|
|
33
|
+
threadId: row.thread_id,
|
|
34
|
+
state: row.state,
|
|
35
|
+
desiredState: row.desired_state,
|
|
36
|
+
activeTurnId: row.active_turn_id,
|
|
37
|
+
protocolVersion: row.protocol_version,
|
|
38
|
+
failureCount: row.failure_count,
|
|
39
|
+
pendingInteractions: [],
|
|
40
|
+
createdAt: row.created_at,
|
|
41
|
+
updatedAt: row.updated_at,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
7
|
+
import { mkdirSync } from 'node:fs';
|
|
8
|
+
import { dirname } from 'node:path';
|
|
9
|
+
export function openRelayDatabase(path) {
|
|
10
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
11
|
+
const database = new DatabaseSync(path);
|
|
12
|
+
database.exec('PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000;');
|
|
13
|
+
return database;
|
|
14
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
export function relayStatePath(root, stateHome) {
|
|
9
|
+
return statePath(root, stateHome, 'gestalt-mobile');
|
|
10
|
+
}
|
|
11
|
+
export function legacyRelayStatePath(root, stateHome) {
|
|
12
|
+
return statePath(root, stateHome, 'codex-relay');
|
|
13
|
+
}
|
|
14
|
+
function statePath(root, stateHome, applicationName) {
|
|
15
|
+
return join(stateHome, applicationName, createHash('sha256').update(root).digest('hex').slice(0, 12), 'relay.sqlite');
|
|
16
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
export const systemClock = {
|
|
7
|
+
now: () => Date.now(),
|
|
8
|
+
sleep: (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)),
|
|
9
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
export async function mapWithConcurrency(values, limit, task) {
|
|
7
|
+
let index = 0;
|
|
8
|
+
await Promise.all(Array.from({ length: Math.min(limit, values.length) }, async () => {
|
|
9
|
+
while (index < values.length) {
|
|
10
|
+
const value = values[index++];
|
|
11
|
+
if (value !== undefined)
|
|
12
|
+
await task(value);
|
|
13
|
+
}
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
export const recoveryDelays = [500, 2000, 5000];
|
|
7
|
+
export function recoveryDelay(failureCount) {
|
|
8
|
+
return recoveryDelays[failureCount] ?? null;
|
|
9
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Dyne.org foundation
|
|
3
|
+
* Designed by Denis Roio <jaromil@dyne.org>
|
|
4
|
+
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
*/
|
|
6
|
+
import { recoveryDelay } from './retry-policy.js';
|
|
7
|
+
export class SessionSupervisor {
|
|
8
|
+
restore;
|
|
9
|
+
requireAttention;
|
|
10
|
+
timers = new Map();
|
|
11
|
+
constructor(restore, requireAttention) {
|
|
12
|
+
this.restore = restore;
|
|
13
|
+
this.requireAttention = requireAttention;
|
|
14
|
+
}
|
|
15
|
+
recover(sessionId, failureCount = 0) {
|
|
16
|
+
this.cancel(sessionId);
|
|
17
|
+
void this.attempt(sessionId, failureCount);
|
|
18
|
+
}
|
|
19
|
+
cancel(sessionId) {
|
|
20
|
+
const timer = this.timers.get(sessionId);
|
|
21
|
+
if (timer)
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
this.timers.delete(sessionId);
|
|
24
|
+
}
|
|
25
|
+
async attempt(sessionId, failureCount) {
|
|
26
|
+
try {
|
|
27
|
+
await this.restore(sessionId);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
const delay = recoveryDelay(failureCount);
|
|
31
|
+
if (delay === null) {
|
|
32
|
+
this.requireAttention(sessionId);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this.timers.set(sessionId, setTimeout(() => {
|
|
36
|
+
this.timers.delete(sessionId);
|
|
37
|
+
void this.attempt(sessionId, failureCount + 1);
|
|
38
|
+
}, delay));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gestalt-mobile",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Mobile-first web relay for durable Codex development sessions",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"codex",
|
|
7
|
+
"gestalt",
|
|
8
|
+
"mobile",
|
|
9
|
+
"development"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://github.com/dyne/gestalt-mobile#readme",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/dyne/gestalt-mobile.git"
|
|
15
|
+
},
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/dyne/gestalt-mobile/issues"
|
|
18
|
+
},
|
|
19
|
+
"author": "Dyne.org foundation",
|
|
20
|
+
"license": "AGPL-3.0-or-later",
|
|
21
|
+
"type": "module",
|
|
22
|
+
"bin": {
|
|
23
|
+
"gestalt-mobile": "dist/server/server/main.js"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist/server",
|
|
27
|
+
"dist/client",
|
|
28
|
+
"README.md",
|
|
29
|
+
"LICENSE"
|
|
30
|
+
],
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=24.0.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"dev": "node scripts/dev.mjs",
|
|
36
|
+
"dev:server": "tsx watch src/server/main.ts -- --cwd ..",
|
|
37
|
+
"start": "node dist/server/server/main.js",
|
|
38
|
+
"dev:client": "vite",
|
|
39
|
+
"build": "npm run build:server && npm run build:client",
|
|
40
|
+
"build:server": "node scripts/build-server.mjs",
|
|
41
|
+
"build:client": "vite build",
|
|
42
|
+
"prepack": "npm run build",
|
|
43
|
+
"check": "tsc -p tsconfig.server.json --noEmit && svelte-check --tsconfig ./tsconfig.json --fail-on-warnings",
|
|
44
|
+
"lint": "eslint .",
|
|
45
|
+
"format": "prettier --write .",
|
|
46
|
+
"format:check": "prettier --check .",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"test:watch": "vitest",
|
|
49
|
+
"test:package": "node scripts/smoke-packed-cli.mjs",
|
|
50
|
+
"test:e2e": "playwright test",
|
|
51
|
+
"license:check": "node scripts/check-license-headers.mjs",
|
|
52
|
+
"license:apply": "node scripts/apply-license-headers.mjs"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@fastify/static": "^10.1.0",
|
|
56
|
+
"fastify": "^5.10.0",
|
|
57
|
+
"ws": "^8.21.0",
|
|
58
|
+
"zod": "^4.4.3"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@playwright/test": "^1.61.1",
|
|
62
|
+
"@sveltejs/vite-plugin-svelte": "^7.2.0",
|
|
63
|
+
"@testing-library/svelte": "^5.4.2",
|
|
64
|
+
"@types/node": "^24.13.3",
|
|
65
|
+
"@types/ws": "^8.18.1",
|
|
66
|
+
"eslint": "^10.7.0",
|
|
67
|
+
"jsdom": "^29.1.1",
|
|
68
|
+
"prettier": "^3.9.5",
|
|
69
|
+
"prettier-plugin-svelte": "^4.1.1",
|
|
70
|
+
"svelte": "^5.56.4",
|
|
71
|
+
"svelte-check": "^4.7.2",
|
|
72
|
+
"tsx": "^4.23.1",
|
|
73
|
+
"typescript": "^6.0.3",
|
|
74
|
+
"typescript-eslint": "^8.64.0",
|
|
75
|
+
"vite": "^8.1.4",
|
|
76
|
+
"vitest": "^4.1.10"
|
|
77
|
+
}
|
|
78
|
+
}
|