@larose/pi-web 0.3.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.
Files changed (43) hide show
  1. package/LICENSE +235 -0
  2. package/README.md +50 -0
  3. package/THIRD_PARTY_LICENSES.md +40 -0
  4. package/dist/client/home.js +1619 -0
  5. package/dist/client/session.js +3703 -0
  6. package/dist/server/api.js +485 -0
  7. package/dist/server/cli.js +51 -0
  8. package/dist/server/directory-browser.js +104 -0
  9. package/dist/server/errors.js +10 -0
  10. package/dist/server/event-buffer.js +40 -0
  11. package/dist/server/extension-ui.js +245 -0
  12. package/dist/server/git-workspaces.js +559 -0
  13. package/dist/server/runtime-registry.js +703 -0
  14. package/dist/server/server.js +190 -0
  15. package/dist/server/session-repository.js +374 -0
  16. package/package.json +46 -0
  17. package/public/home.html +139 -0
  18. package/public/session.html +144 -0
  19. package/public/styles.css +2463 -0
  20. package/screenshots/home.png +0 -0
  21. package/screenshots/session.png +0 -0
  22. package/src/client/display-title.ts +36 -0
  23. package/src/client/event-stream.ts +194 -0
  24. package/src/client/home.ts +1575 -0
  25. package/src/client/markdown.ts +98 -0
  26. package/src/client/message-queue.ts +67 -0
  27. package/src/client/path-combobox.ts +271 -0
  28. package/src/client/session.ts +2174 -0
  29. package/src/client/shared.ts +99 -0
  30. package/src/client/slash-completion.ts +184 -0
  31. package/src/client/transcript-activity.ts +188 -0
  32. package/src/client/usage-format.ts +156 -0
  33. package/src/client/workspace-browser.ts +36 -0
  34. package/src/server/api.ts +652 -0
  35. package/src/server/cli.ts +63 -0
  36. package/src/server/directory-browser.ts +137 -0
  37. package/src/server/errors.ts +11 -0
  38. package/src/server/event-buffer.ts +59 -0
  39. package/src/server/extension-ui.ts +359 -0
  40. package/src/server/git-workspaces.ts +750 -0
  41. package/src/server/runtime-registry.ts +943 -0
  42. package/src/server/server.ts +248 -0
  43. package/src/server/session-repository.ts +488 -0
@@ -0,0 +1,139 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="color-scheme" content="light">
7
+ <title>Pi</title>
8
+ <link rel="stylesheet" href="/styles.css">
9
+ </head>
10
+ <body>
11
+ <div class="app-notifications" data-app-notifications hidden></div>
12
+
13
+ <main class="app-shell">
14
+ <section class="home-screen" aria-label="Sessions">
15
+ <div class="home-container">
16
+ <header class="home-header">
17
+ <h1>Pi, in your browser.</h1>
18
+ </header>
19
+
20
+ <section class="latest-sessions" aria-labelledby="latest-sessions-heading">
21
+ <div class="session-list-heading">
22
+ <h2 id="latest-sessions-heading">Latest sessions</h2>
23
+ <button
24
+ class="new-session-toggle"
25
+ type="button"
26
+ data-new-session-toggle
27
+ aria-expanded="false"
28
+ aria-controls="new-session-form"
29
+ >+ New session</button>
30
+ </div>
31
+
32
+ <form class="new-session" id="new-session-form" data-new-session hidden>
33
+ <header class="new-session-header">
34
+ <h2 class="new-session-heading">New session</h2>
35
+ <button class="quiet-action" type="button" data-new-session-cancel>Cancel</button>
36
+ </header>
37
+
38
+ <div class="workspace-controls" data-workspace-controls>
39
+ <div class="workspace-control">
40
+ <label for="recent-workspace">Recent repository or directory</label>
41
+ <select id="recent-workspace" data-recent-workspace>
42
+ <option value="">Loading recent workspaces…</option>
43
+ </select>
44
+ </div>
45
+
46
+ <fieldset class="workspace-kind">
47
+ <legend>Workspace type</legend>
48
+ <div class="choice-buttons">
49
+ <input id="workspace-kind-repository" name="workspaceKind" type="radio" value="repository" data-workspace-kind-repository checked>
50
+ <label for="workspace-kind-repository">Git repository</label>
51
+ <input id="workspace-kind-standalone" name="workspaceKind" type="radio" value="standalone" data-workspace-kind-standalone>
52
+ <label for="workspace-kind-standalone">Standalone directory</label>
53
+ </div>
54
+ </fieldset>
55
+
56
+ <div class="repository-fields" data-repository-fields>
57
+ <div class="workspace-control">
58
+ <label for="repository-path">Repository</label>
59
+ <div class="path-combobox">
60
+ <input id="repository-path" autocomplete="off" spellcheck="false" placeholder="/absolute/path/to/repository" data-repository-path aria-describedby="repository-path-feedback repository-path-status">
61
+ <button class="path-combobox-toggle" type="button" data-repository-path-toggle aria-label="Show repository paths">⌄</button>
62
+ <ul id="repository-path-options" class="path-combobox-list" data-repository-path-options hidden></ul>
63
+ </div>
64
+ <p class="workspace-control-feedback" id="repository-path-feedback" data-repository-path-feedback></p>
65
+ <p class="sr-only" id="repository-path-status" data-repository-path-status role="status" aria-live="polite"></p>
66
+ </div>
67
+
68
+ <div class="workspace-control">
69
+ <label for="workspace-checkout">Checkout</label>
70
+ <div class="checkout-control">
71
+ <select id="workspace-checkout" data-workspace-checkout aria-describedby="workspace-checkout-feedback"></select>
72
+ <button class="quiet-action" type="button" data-worktree-start hidden aria-expanded="false" aria-controls="new-worktree-editor" aria-describedby="worktree-availability">New worktree</button>
73
+ </div>
74
+ <p class="workspace-control-feedback" id="workspace-checkout-feedback" data-workspace-checkout-feedback></p>
75
+ <p class="worktree-availability" id="worktree-availability" data-worktree-availability hidden></p>
76
+ </div>
77
+
78
+ <section class="new-worktree-mode" id="new-worktree-editor" data-new-worktree-mode hidden aria-labelledby="new-worktree-heading">
79
+ <header>
80
+ <h3 id="new-worktree-heading">New worktree</h3>
81
+ <button class="quiet-action" type="button" data-worktree-cancel>Cancel</button>
82
+ </header>
83
+ <label for="worktree-name">Worktree and branch name</label>
84
+ <input id="worktree-name" name="worktreeName" autocomplete="off" spellcheck="false" data-worktree-name>
85
+ <p class="worktree-target">Create at <span data-worktree-target></span></p>
86
+ </section>
87
+
88
+ <div class="workspace-control">
89
+ <label for="workspace-relative-path">Working directory</label>
90
+ <div class="path-combobox">
91
+ <input id="workspace-relative-path" autocomplete="off" spellcheck="false" placeholder="(root)" data-workspace-relative-path aria-describedby="workspace-relative-feedback workspace-relative-status">
92
+ <button class="path-combobox-toggle" type="button" data-workspace-relative-toggle aria-label="Show repository directories">⌄</button>
93
+ <ul id="workspace-relative-options" class="path-combobox-list" data-workspace-relative-options hidden></ul>
94
+ </div>
95
+ <p class="workspace-control-feedback" id="workspace-relative-feedback" data-workspace-relative-feedback></p>
96
+ <p class="sr-only" id="workspace-relative-status" data-workspace-relative-status role="status" aria-live="polite"></p>
97
+ </div>
98
+ </div>
99
+
100
+ <div class="workspace-control" data-standalone-fields hidden>
101
+ <label for="standalone-path">Directory</label>
102
+ <div class="path-combobox">
103
+ <input id="standalone-path" autocomplete="off" spellcheck="false" placeholder="/absolute/path" data-standalone-path aria-describedby="standalone-path-feedback standalone-path-status">
104
+ <button class="path-combobox-toggle" type="button" data-standalone-path-toggle aria-label="Show standalone directory paths">⌄</button>
105
+ <ul id="standalone-path-options" class="path-combobox-list" data-standalone-path-options hidden></ul>
106
+ </div>
107
+ <p class="workspace-control-feedback" id="standalone-path-feedback" data-standalone-path-feedback></p>
108
+ <p class="sr-only" id="standalone-path-status" data-standalone-path-status role="status" aria-live="polite"></p>
109
+ </div>
110
+
111
+ <p class="sr-only" data-git-status role="status" aria-live="polite">Choose a working directory to inspect it.</p>
112
+ </div>
113
+
114
+ <div class="new-session-actions">
115
+ <button class="session-create-submit" type="submit" data-create-submit>Create session</button>
116
+ <button class="session-create-submit" type="submit" data-worktree-submit hidden>Create worktree &amp; session</button>
117
+ </div>
118
+ </form>
119
+
120
+ <nav class="latest-session-list" data-latest-session-list aria-label="Latest sessions"></nav>
121
+ </section>
122
+
123
+ <section class="all-sessions" aria-labelledby="sessions-heading">
124
+ <div class="session-list-heading">
125
+ <h2 id="sessions-heading">All sessions</h2>
126
+ </div>
127
+ <nav class="session-list" data-session-list aria-label="All saved sessions"></nav>
128
+ </section>
129
+
130
+ <footer class="home-footer">
131
+ <p>Created by <a href="https://mathieularose.com">Mathieu Larose</a></p>
132
+ </footer>
133
+ </div>
134
+ </section>
135
+ </main>
136
+
137
+ <script type="module" src="/home.js"></script>
138
+ </body>
139
+ </html>
@@ -0,0 +1,144 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="color-scheme" content="light">
7
+ <title>Loading… · Pi</title>
8
+ <link rel="stylesheet" href="/styles.css">
9
+ </head>
10
+ <body>
11
+ <main class="app-shell">
12
+ <section class="workspace" aria-label="Conversation">
13
+ <aside class="session-context is-collapsed" aria-label="Session context">
14
+ <header class="session-identity">
15
+ <div class="session-identity-meta">
16
+ <div class="session-navigation">
17
+ <a class="back-button" href="/" aria-label="Back to sessions">← <span>Sessions</span></a>
18
+ </div>
19
+ <div class="session-header-actions">
20
+ <a
21
+ class="create-session"
22
+ href="/"
23
+ data-create-session
24
+ title="Open the new-session form using this working directory"
25
+ aria-label="Open the new-session form using this working directory"
26
+ ><span class="create-session-symbol" aria-hidden="true">+</span><span class="create-session-label">New</span></a>
27
+ </div>
28
+ </div>
29
+ <div class="session-title-row">
30
+ <h1>
31
+ <button class="session-title-button" type="button" data-session-title title="Rename session title" aria-label="Rename session title" disabled>Loading…</button>
32
+ </h1>
33
+ <span class="connection-status" data-connection data-state="offline">Offline</span>
34
+ </div>
35
+ </header>
36
+
37
+ <div class="session-context-heading">
38
+ <h2>Session context</h2>
39
+ <button
40
+ class="session-context-toggle secondary"
41
+ type="button"
42
+ data-session-context-toggle
43
+ aria-controls="session-context-content"
44
+ aria-expanded="false"
45
+ aria-label="Expand session context"
46
+ title="Expand session context"
47
+ >
48
+ <span>Session context</span>
49
+ </button>
50
+ </div>
51
+ <div class="session-context-content" id="session-context-content">
52
+ <dl>
53
+ <div class="session-context-usage-item">
54
+ <dt>Context window</dt>
55
+ <dd data-session-context-usage aria-live="polite">Loading…</dd>
56
+ </div>
57
+ <div class="session-token-item">
58
+ <dt>Token usage</dt>
59
+ <dd data-session-tokens aria-live="polite">Loading…</dd>
60
+ </div>
61
+ <div class="session-workspace-item">
62
+ <dt>Workspace</dt>
63
+ <dd class="session-workspace">
64
+ <span class="session-workspace-state" data-session-workspace-state hidden></span>
65
+ <div class="session-workspace-row" data-session-workspace-repository hidden>
66
+ <span class="session-workspace-label">Git repository</span>
67
+ <span class="session-workspace-path" data-session-workspace-repository-path></span>
68
+ </div>
69
+ <div class="session-workspace-row" data-session-workspace-worktree hidden>
70
+ <span class="session-workspace-label">Worktree</span>
71
+ <span class="session-workspace-path" data-session-workspace-worktree-path></span>
72
+ </div>
73
+ <div class="session-workspace-row" data-session-workspace-working-directory hidden>
74
+ <span class="session-workspace-label">Working directory</span>
75
+ <span class="session-workspace-path" data-session-workspace-working-directory-path></span>
76
+ </div>
77
+ </dd>
78
+ </div>
79
+ <div class="session-status-item" data-extension-status-item hidden>
80
+ <dt>Status</dt>
81
+ <dd class="extension-statuses" data-extension-statuses aria-live="polite"></dd>
82
+ </div>
83
+ <div>
84
+ <dt>Model</dt>
85
+ <dd data-session-model aria-label="Model and thinking level"></dd>
86
+ </div>
87
+ </dl>
88
+ <div class="extension-widgets" data-extension-widgets-above hidden aria-live="polite"></div>
89
+ </div>
90
+ </aside>
91
+
92
+ <div class="transcript" data-transcript aria-live="polite">
93
+ <div class="empty-state">
94
+ <strong>Loading conversation</strong>
95
+ <span>Reading the saved Pi session…</span>
96
+ </div>
97
+ </div>
98
+
99
+ <form class="composer" data-composer>
100
+ <div class="composer-inner">
101
+ <div class="extension-prompt" data-extension-prompt hidden></div>
102
+ <div
103
+ class="slash-completion"
104
+ id="slash-command-list"
105
+ data-slash-completion
106
+ role="listbox"
107
+ aria-label="Available slash commands"
108
+ hidden
109
+ ></div>
110
+ <div class="composer-input-row">
111
+ <label class="sr-only" for="prompt">Message Pi</label>
112
+ <textarea
113
+ id="prompt"
114
+ data-prompt
115
+ rows="1"
116
+ autocapitalize="sentences"
117
+ autocorrect="on"
118
+ spellcheck="true"
119
+ aria-autocomplete="list"
120
+ aria-controls="slash-command-list"
121
+ aria-expanded="false"
122
+ disabled
123
+ ></textarea>
124
+ <div class="composer-actions">
125
+ <button type="submit" data-send disabled>Send</button>
126
+ <button class="secondary" type="button" data-abort disabled>Stop</button>
127
+ </div>
128
+ </div>
129
+ <div class="extension-widgets" data-extension-widgets-below hidden aria-live="polite"></div>
130
+ </div>
131
+ </form>
132
+ </section>
133
+ </main>
134
+
135
+ <template id="message-template">
136
+ <article class="message">
137
+ <header></header>
138
+ <div class="message-content"></div>
139
+ </article>
140
+ </template>
141
+
142
+ <script type="module" src="/session.js"></script>
143
+ </body>
144
+ </html>