ask-coding-harness 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.
@@ -0,0 +1 @@
1
+ :root{color-scheme:dark;--bg: #0b0b0c;--fg: #e5e5e5;--surface: #131316;--surface-muted: #161618;--border: #26262a;--border-strong: #3f3f46;--text-muted: #a3a3a3;--text-faint: #737373;--accent: #2f6feb;--danger: #dc2626;--font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif}html,body{margin:0;height:100%;background:var(--bg);color:var(--fg);font-family:var(--font);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}::selection{background:#2f6feb59}*{scrollbar-width:thin;scrollbar-color:#3f3f46 transparent}*::-webkit-scrollbar{width:8px;height:8px}*::-webkit-scrollbar-thumb{background:#3f3f46;border-radius:4px}*::-webkit-scrollbar-track{background:transparent}.tool-stream.svelte-1l486hy{display:flex;flex-direction:column;gap:.75rem;margin-top:.75rem}.block.svelte-1l486hy{display:flex;flex-direction:column;gap:.5rem}.tool.svelte-1l486hy{border:1px solid #26262a;border-radius:.625rem;background:#131316;overflow:hidden}.tool-head.svelte-1l486hy{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.8125rem}.tool-icon.svelte-1l486hy{font-size:.875rem}.tool-name.svelte-1l486hy{font-weight:600;color:#d4d4d4;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.75rem}.tool-status.svelte-1l486hy{margin-left:auto;font-size:.6875rem;text-transform:uppercase;letter-spacing:.04em}.tool-status.running.svelte-1l486hy{color:#fbbf24;animation:svelte-1l486hy-pulse 1.2s infinite}.tool-status.done.svelte-1l486hy{color:#4ade80}.tool-status.failed.svelte-1l486hy{color:#f87171}@keyframes svelte-1l486hy-pulse{0%,to{opacity:1}50%{opacity:.4}}.tool-args.svelte-1l486hy{margin:0;padding:.375rem .75rem;border-top:1px solid #1f1f22;background:#0d0d0f;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.6875rem;line-height:1.6;color:#a3a3a3;white-space:pre-wrap;word-break:break-word;max-height:8rem;overflow-y:auto}.approvals.svelte-1l486hy{gap:.5rem}.approve-all.svelte-1l486hy{align-self:flex-start;font:inherit;font-size:.75rem;font-weight:600;padding:.375rem .75rem;border-radius:.5rem;border:1px solid #ea580c;background:#ea580c;color:#fff;cursor:pointer}.assistant.svelte-kpbn6d{max-width:46rem;margin:0 auto 1.5rem}.thinking.svelte-kpbn6d{margin-bottom:.75rem;border:1px solid #26262a;border-radius:.625rem;background:#131316}.thinking.svelte-kpbn6d summary:where(.svelte-kpbn6d){display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;cursor:pointer;list-style:none;font-size:.75rem}.thinking.svelte-kpbn6d summary:where(.svelte-kpbn6d)::-webkit-details-marker{display:none}.thinking-label.svelte-kpbn6d{color:#a3a3a3}.thinking-toggle.svelte-kpbn6d{margin-left:auto;font-size:.6875rem;color:#737373}.thinking-body.svelte-kpbn6d{padding:0 .75rem .75rem;color:#a3a3a3;font-size:.8125rem;line-height:1.6;white-space:pre-wrap}.markdown.svelte-kpbn6d{font-size:.9375rem;line-height:1.7;color:#e5e5e5;overflow-wrap:break-word}.markdown.svelte-kpbn6d p{margin:0 0 .75rem}.markdown.svelte-kpbn6d p:last-child{margin-bottom:0}.markdown.svelte-kpbn6d code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.8125rem;background:#1a1a1d;padding:.125rem .375rem;border-radius:.375rem;border:1px solid #26262a}.markdown.svelte-kpbn6d .code-block{margin:.75rem 0;padding:.75rem;border-radius:.625rem;background:#0d0d0f;border:1px solid #26262a;overflow-x:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.8125rem;line-height:1.6;white-space:pre}.typing.svelte-kpbn6d{display:flex;gap:.25rem;padding:.5rem 0}.typing.svelte-kpbn6d span:where(.svelte-kpbn6d){width:.375rem;height:.375rem;border-radius:50%;background:#52525b;animation:svelte-kpbn6d-blink 1.2s infinite}.typing.svelte-kpbn6d span:where(.svelte-kpbn6d):nth-child(2){animation-delay:.2s}.typing.svelte-kpbn6d span:where(.svelte-kpbn6d):nth-child(3){animation-delay:.4s}@keyframes svelte-kpbn6d-blink{0%,to{opacity:.25}50%{opacity:1}}.user.svelte-10oznxe{display:flex;justify-content:flex-end;max-width:46rem;margin:0 auto 1.5rem}.bubble.svelte-10oznxe{max-width:85%;padding:.625rem .9375rem;border-radius:1rem 1rem .25rem;background:#1f4f8a;color:#f5f9ff;font-size:.9375rem;line-height:1.6;overflow-wrap:break-word}.bubble.svelte-10oznxe code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.8125rem;background:#ffffff26;padding:.125rem .375rem;border-radius:.375rem}.chat.svelte-xdaci2{flex:1;overflow-y:auto;padding:1.5rem 1rem 2rem;scroll-behavior:smooth;-webkit-overflow-scrolling:touch}.empty.svelte-xdaci2{max-width:30rem;margin:12vh auto 0;text-align:center;color:#a3a3a3;padding:0 1rem}.empty-logo.svelte-xdaci2{font-size:2.5rem;margin-bottom:.75rem}.empty.svelte-xdaci2 h1:where(.svelte-xdaci2){font-size:1.375rem;margin:0 0 .5rem;color:#e5e5e5}.empty.svelte-xdaci2 p:where(.svelte-xdaci2){font-size:.875rem;line-height:1.6;margin:0}.sidebar.svelte-181dlmc{display:flex;flex-direction:column;height:100%}.head.svelte-181dlmc{display:flex;align-items:center;gap:.5rem;padding:.75rem;border-bottom:1px solid #1f1f22}.new.svelte-181dlmc{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:.5rem;font:inherit;font-size:.8125rem;font-weight:600;padding:.5rem;border-radius:.625rem;border:1px solid #2a2a2e;background:#161618;color:#e5e5e5;cursor:pointer}.new.svelte-181dlmc:hover{background:#1f1f22}.new.svelte-181dlmc:disabled{opacity:.5;cursor:default}.close.svelte-181dlmc{display:none;width:2.25rem;height:2.25rem;border:none;border-radius:.5rem;background:transparent;color:#a3a3a3;cursor:pointer}@media(max-width:767px){.close.svelte-181dlmc{display:inline-flex;align-items:center;justify-content:center}}.list.svelte-181dlmc{flex:1;overflow-y:auto;padding:.5rem;display:flex;flex-direction:column;gap:.25rem}.item.svelte-181dlmc{position:relative;padding:.625rem .75rem;border-radius:.625rem;cursor:pointer;border:1px solid transparent}.item.svelte-181dlmc:hover{background:#161618}.item.active.svelte-181dlmc{background:#1a1a1d;border-color:#2a2a2e}.title.svelte-181dlmc{display:block;font-size:.8125rem;color:#e5e5e5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.meta.svelte-181dlmc{font-size:.6875rem;color:#737373}.actions.svelte-181dlmc{display:none;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);gap:.125rem;background:#161618;border-radius:.5rem;padding:.125rem}.item.svelte-181dlmc:hover .actions:where(.svelte-181dlmc),.item.active.svelte-181dlmc .actions:where(.svelte-181dlmc){display:inline-flex}.mini.svelte-181dlmc{width:1.5rem;height:1.5rem;border:none;border-radius:.375rem;background:transparent;color:#a3a3a3;font-size:.75rem;cursor:pointer}.mini.svelte-181dlmc:hover{background:#26262a}.mini.danger.svelte-181dlmc:hover{color:#f87171}.empty.svelte-181dlmc{padding:1rem .5rem;font-size:.8125rem;color:#737373;text-align:center}input.svelte-181dlmc{width:100%;font:inherit;font-size:.8125rem;padding:.25rem .5rem;border-radius:.375rem;border:1px solid #3f3f46;background:#0d0d0f;color:#e5e5e5;outline:none}.composer.svelte-1n8df3y{flex-shrink:0;padding:.75rem 1rem calc(.75rem + env(safe-area-inset-bottom));background:linear-gradient(transparent,#0b0b0c 40%)}.box.svelte-1n8df3y{display:flex;align-items:flex-end;gap:.5rem;max-width:46rem;margin:0 auto;padding:.5rem;background:#161618;border:1px solid #2a2a2e;border-radius:1rem;box-shadow:0 4px 24px #0006}.box.svelte-1n8df3y:focus-within{border-color:#3f3f46}textarea.svelte-1n8df3y{flex:1;resize:none;border:none;outline:none;background:transparent;color:#e5e5e5;font:inherit;font-size:.9375rem;line-height:1.5;padding:.375rem .5rem;max-height:180px}textarea.svelte-1n8df3y::placeholder{color:#737373}.send.svelte-1n8df3y{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border:none;border-radius:.75rem;background:#2f6feb;color:#fff;cursor:pointer;flex-shrink:0}.send.svelte-1n8df3y:disabled{background:#26262a;color:#737373;cursor:default}.send.stop.svelte-1n8df3y{background:#b91c1c}.hint.svelte-1n8df3y{display:flex;align-items:center;gap:.5rem;max-width:46rem;margin:.5rem auto 0;padding:0 .25rem;font-size:.6875rem;color:#737373}.model-chip.svelte-1n8df3y{color:#a3a3a3;border:1px solid #26262a;border-radius:999px;padding:.125rem .5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.shortcut.svelte-1n8df3y{margin-left:auto}.overlay.svelte-1u3w06f{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;z-index:50;display:flex;justify-content:center;align-items:flex-start;padding:10vh 1rem 1rem}.panel.svelte-1u3w06f{width:min(30rem,100%);max-height:80vh;overflow-y:auto;background:#131316;border:1px solid #2a2a2e;border-radius:1rem;box-shadow:0 12px 48px #00000080}.head.svelte-1u3w06f{display:flex;align-items:center;padding:1rem 1.25rem .5rem}.head.svelte-1u3w06f h2:where(.svelte-1u3w06f){margin:0;font-size:1.0625rem}.close.svelte-1u3w06f{margin-left:auto;width:2rem;height:2rem;border:none;border-radius:.5rem;background:transparent;color:#a3a3a3;cursor:pointer;font-size:.875rem}.close.svelte-1u3w06f:hover{background:#1f1f22}section.svelte-1u3w06f{padding:.75rem 1.25rem 1rem;border-top:1px solid #1f1f22}section.svelte-1u3w06f h3:where(.svelte-1u3w06f){margin:0 0 .5rem;font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:#a3a3a3}.row.svelte-1u3w06f{display:flex;gap:.75rem;padding:.25rem 0;font-size:.8125rem}.label.svelte-1u3w06f{color:#737373;width:6rem;flex-shrink:0}.value.svelte-1u3w06f{color:#e5e5e5;overflow-wrap:anywhere}.mono.svelte-1u3w06f{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.75rem}.models.svelte-1u3w06f{display:flex;flex-wrap:wrap;gap:.375rem}.model.svelte-1u3w06f{font:inherit;font-size:.75rem;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;padding:.375rem .625rem;border-radius:.5rem;border:1px solid #2a2a2e;background:#161618;color:#d4d4d4;cursor:pointer}.model.active.svelte-1u3w06f{border-color:#2f6feb;background:#1d3a63;color:#fff}.hint.svelte-1u3w06f{font-size:.75rem;color:#737373;margin:.5rem 0 0}*{box-sizing:border-box}html,body{margin:0;height:100%;background:var(--bg, #0b0b0c);color:var(--fg, #e5e5e5);font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif;-webkit-font-smoothing:antialiased}#app{height:100%}.app.svelte-1n46o8q{display:flex;flex-direction:column;height:100dvh}.topbar.svelte-1n46o8q{display:flex;align-items:center;gap:.75rem;padding:.625rem 1rem;padding-top:calc(.625rem + env(safe-area-inset-top));background:#111113;border-bottom:1px solid #1f1f22;flex-shrink:0;-webkit-user-select:none;user-select:none}.workspace.svelte-1n46o8q{display:flex;align-items:center;gap:.5rem;min-width:0;flex:1}.workspace-name.svelte-1n46o8q{font-weight:600;font-size:.9375rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.branch.svelte-1n46o8q{font-size:.6875rem;color:#a3a3a3;background:#1a1a1d;border:1px solid #2a2a2e;border-radius:999px;padding:.125rem .5rem;white-space:nowrap}.topbar-actions.svelte-1n46o8q{display:flex;align-items:center;gap:.25rem}.icon-btn.svelte-1n46o8q{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border:none;border-radius:.5rem;background:transparent;color:#d4d4d4;cursor:pointer}.icon-btn.svelte-1n46o8q:hover{background:#1f1f22}.icon-btn.stop.svelte-1n46o8q{color:#f87171}.body.svelte-1n46o8q{display:flex;flex:1;min-height:0}.sidebar-wrap.svelte-1n46o8q{width:min(85vw,19rem);flex-shrink:0;border-right:1px solid #1f1f22;background:#0e0e10;z-index:20}@media(max-width:767px){.sidebar-wrap.svelte-1n46o8q{position:fixed;inset:0 auto 0 0;height:100dvh;box-shadow:0 0 40px #00000080}}.main.svelte-1n46o8q{flex:1;display:flex;flex-direction:column;min-width:0;position:relative}.banner-error.svelte-1n46o8q{margin:.75rem 1rem 0;padding:.625rem .875rem;border-radius:.625rem;background:#3f0d0d;color:#fca5a5;font-size:.8125rem;border:1px solid #7f1d1d}
data/public/icon.svg ADDED
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#2b6ef6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
2
+ <path d="M12 2L2 7l10 5 10-5-10-5z"/>
3
+ <path d="M2 17l10 5 10-5"/>
4
+ <path d="M2 12l10 5 10-5"/>
5
+ </svg>
data/public/index.html ADDED
@@ -0,0 +1,25 @@
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, viewport-fit=cover" />
6
+ <meta name="theme-color" content="#0b0b0c" />
7
+ <meta name="apple-mobile-web-app-capable" content="yes" />
8
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
9
+ <meta name="apple-mobile-web-app-title" content="ACH" />
10
+ <link rel="manifest" href="/manifest.json" />
11
+ <link rel="icon" type="image/svg+xml" href="/icon.svg" />
12
+ <link rel="apple-touch-icon" href="/icon.svg" />
13
+ <title>ask-coding-harness</title>
14
+ <script>
15
+ if ("serviceWorker" in navigator) {
16
+ navigator.serviceWorker.register("/sw.js");
17
+ }
18
+ </script>
19
+ <script type="module" crossorigin src="/assets/index-Cs2ZprmP.js"></script>
20
+ <link rel="stylesheet" crossorigin href="/assets/index-D2px4HJ9.css">
21
+ </head>
22
+ <body>
23
+ <div id="app"></div>
24
+ </body>
25
+ </html>
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "ask-coding-harness",
3
+ "short_name": "ACH",
4
+ "description": "General-purpose coding agent in the browser",
5
+ "start_url": "/",
6
+ "display": "standalone",
7
+ "background_color": "#0b0b0c",
8
+ "theme_color": "#0b0b0c",
9
+ "icons": [
10
+ {
11
+ "src": "/icon.svg",
12
+ "sizes": "any",
13
+ "type": "image/svg+xml",
14
+ "purpose": "any maskable"
15
+ }
16
+ ]
17
+ }
data/public/sw.js ADDED
@@ -0,0 +1,49 @@
1
+ // ask-coding-harness service worker — caches built assets for instant
2
+ // loading and an offline shell.
3
+ const CACHE = "ach-v1";
4
+ const ASSETS = ["/", "/manifest.json", "/icon.svg"];
5
+
6
+ self.addEventListener("install", (event) => {
7
+ event.waitUntil(caches.open(CACHE).then((cache) => cache.addAll(ASSETS)));
8
+ self.skipWaiting();
9
+ });
10
+
11
+ self.addEventListener("activate", (event) => {
12
+ event.waitUntil(clients.claim());
13
+ });
14
+
15
+ self.addEventListener("fetch", (event) => {
16
+ const url = new URL(event.request.url);
17
+ if (event.request.method !== "GET" || url.origin !== location.origin) return;
18
+ // Never cache API calls — the agent's stream is live.
19
+ if (url.pathname.startsWith("/api/")) return;
20
+ if (url.pathname === "/" || url.pathname.endsWith(".html")) {
21
+ event.respondWith(networkFirst(event.request));
22
+ } else {
23
+ event.respondWith(cacheFirst(event.request));
24
+ }
25
+ });
26
+
27
+ async function networkFirst(request) {
28
+ try {
29
+ const res = await fetch(request);
30
+ const cache = await caches.open(CACHE);
31
+ cache.put(request, res.clone());
32
+ return res;
33
+ } catch {
34
+ return caches.match(request);
35
+ }
36
+ }
37
+
38
+ async function cacheFirst(request) {
39
+ const cached = await caches.match(request);
40
+ if (cached) return cached;
41
+ try {
42
+ const res = await fetch(request);
43
+ const cache = await caches.open(CACHE);
44
+ cache.put(request, res.clone());
45
+ return res;
46
+ } catch {
47
+ return new Response("Offline", { status: 503 });
48
+ }
49
+ }
metadata ADDED
@@ -0,0 +1,308 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ask-coding-harness
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kaka Ruto
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ask-acp
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: ask-agent
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0.1'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0.1'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ask-coding-providers
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0.1'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0.1'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ask-core
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0.1'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0.1'
68
+ - !ruby/object:Gem::Dependency
69
+ name: ask-llm-providers
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0.1'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0.1'
82
+ - !ruby/object:Gem::Dependency
83
+ name: ask-state-providers
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0.1'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0.1'
96
+ - !ruby/object:Gem::Dependency
97
+ name: ask-tools
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0.1'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0.1'
110
+ - !ruby/object:Gem::Dependency
111
+ name: ask-tools-shell
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0.1'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0.1'
124
+ - !ruby/object:Gem::Dependency
125
+ name: puma
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '6.5'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '6.5'
138
+ - !ruby/object:Gem::Dependency
139
+ name: rack
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.1'
145
+ type: :runtime
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.1'
152
+ - !ruby/object:Gem::Dependency
153
+ name: rackup
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '2.2'
159
+ type: :runtime
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '2.2'
166
+ - !ruby/object:Gem::Dependency
167
+ name: roda
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '3.80'
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '3.80'
180
+ - !ruby/object:Gem::Dependency
181
+ name: minitest
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '5.25'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '5.25'
194
+ - !ruby/object:Gem::Dependency
195
+ name: mocha
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '3.1'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '3.1'
208
+ - !ruby/object:Gem::Dependency
209
+ name: rake
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '13.0'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '13.0'
222
+ - !ruby/object:Gem::Dependency
223
+ name: simplecov
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '0.22'
229
+ type: :development
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '0.22'
236
+ - !ruby/object:Gem::Dependency
237
+ name: ostruct
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ description: A self-hosted web coding agent for the ask-rb ecosystem. Runs Ask::Agent::Session
251
+ against any workspace with a mobile-first PWA, streaming events over SSE, with approvals,
252
+ plan mode, todos, and diffs. Comes with the `ach` utility CLI for headless runs
253
+ and server management. Extensible to other coding agents (ACP, Codex, Claude Code)
254
+ via ask-coding-providers.
255
+ email:
256
+ - kaka@myrrlabs.com
257
+ executables:
258
+ - ach
259
+ - ask-coding-harness
260
+ extensions: []
261
+ extra_rdoc_files: []
262
+ files:
263
+ - CHANGELOG.md
264
+ - LICENSE
265
+ - README.md
266
+ - bin/ach
267
+ - bin/ask-coding-harness
268
+ - lib/ask-coding-harness.rb
269
+ - lib/ask/coding_harness/agent_runner.rb
270
+ - lib/ask/coding_harness/cli.rb
271
+ - lib/ask/coding_harness/config.rb
272
+ - lib/ask/coding_harness/demo_adapter.rb
273
+ - lib/ask/coding_harness/event_translator.rb
274
+ - lib/ask/coding_harness/runner.rb
275
+ - lib/ask/coding_harness/server.rb
276
+ - lib/ask/coding_harness/store.rb
277
+ - lib/ask/coding_harness/version.rb
278
+ - public/assets/index-Cs2ZprmP.js
279
+ - public/assets/index-D2px4HJ9.css
280
+ - public/icon.svg
281
+ - public/index.html
282
+ - public/manifest.json
283
+ - public/sw.js
284
+ homepage: https://github.com/ask-rb/ask-coding-harness
285
+ licenses:
286
+ - MIT
287
+ metadata:
288
+ homepage_uri: https://github.com/ask-rb/ask-coding-harness
289
+ source_code_uri: https://github.com/ask-rb/ask-coding-harness
290
+ changelog_uri: https://github.com/ask-rb/ask-coding-harness/blob/master/CHANGELOG.md
291
+ rdoc_options: []
292
+ require_paths:
293
+ - lib
294
+ required_ruby_version: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - ">="
297
+ - !ruby/object:Gem::Version
298
+ version: '3.2'
299
+ required_rubygems_version: !ruby/object:Gem::Requirement
300
+ requirements:
301
+ - - ">="
302
+ - !ruby/object:Gem::Version
303
+ version: '0'
304
+ requirements: []
305
+ rubygems_version: 4.0.3
306
+ specification_version: 4
307
+ summary: General-purpose coding agent in the browser
308
+ test_files: []