humanish 0.94.0 → 0.96.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/README.md +10 -0
- package/dist/comms-agentmail.d.ts +25 -0
- package/dist/comms-agentmail.js +418 -0
- package/dist/comms-agentmail.js.map +1 -0
- package/dist/comms-connections.d.ts +52 -0
- package/dist/comms-connections.js +123 -0
- package/dist/comms-connections.js.map +1 -0
- package/dist/comms-lease-store.d.ts +90 -0
- package/dist/comms-lease-store.js +489 -0
- package/dist/comms-lease-store.js.map +1 -0
- package/dist/comms-receiving-evidence.d.ts +46 -0
- package/dist/comms-receiving-evidence.js +35 -0
- package/dist/comms-receiving-evidence.js.map +1 -0
- package/dist/comms-receiving-inbox.d.ts +16 -0
- package/dist/comms-receiving-inbox.js +410 -0
- package/dist/comms-receiving-inbox.js.map +1 -0
- package/dist/comms-receiving-runtime.d.ts +25 -0
- package/dist/comms-receiving-runtime.js +45 -0
- package/dist/comms-receiving-runtime.js.map +1 -0
- package/dist/comms-receiving-types.d.ts +98 -0
- package/dist/comms-receiving-types.js +2 -0
- package/dist/comms-receiving-types.js.map +1 -0
- package/dist/comms-receiving.d.ts +58 -0
- package/dist/comms-receiving.js +554 -0
- package/dist/comms-receiving.js.map +1 -0
- package/dist/comms-setup.d.ts +40 -0
- package/dist/comms-setup.js +121 -0
- package/dist/comms-setup.js.map +1 -0
- package/dist/concurrent-shared-world-lab.js +662 -624
- package/dist/concurrent-shared-world-lab.js.map +1 -1
- package/dist/cua-actor-lab.d.ts +4 -1
- package/dist/cua-actor-lab.js +98 -17
- package/dist/cua-actor-lab.js.map +1 -1
- package/dist/doctor-lab.d.ts +7 -0
- package/dist/doctor-lab.js +26 -7
- package/dist/doctor-lab.js.map +1 -1
- package/dist/e2b-terminal-lab.js +3 -0
- package/dist/e2b-terminal-lab.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/key-resolution.d.ts +1 -1
- package/dist/key-resolution.js +6 -4
- package/dist/key-resolution.js.map +1 -1
- package/dist/lab-config.d.ts +20 -3
- package/dist/lab-config.js +65 -3
- package/dist/lab-config.js.map +1 -1
- package/dist/lab-engine.js +8 -3
- package/dist/lab-engine.js.map +1 -1
- package/dist/lab-summary.d.ts +3 -2
- package/dist/lab-summary.js +17 -7
- package/dist/lab-summary.js.map +1 -1
- package/dist/observer-app.html +1 -1
- package/dist/observer-data.js +14 -1
- package/dist/observer-data.js.map +1 -1
- package/dist/oss-lab.d.ts +1 -1
- package/dist/oss-lab.js.map +1 -1
- package/dist/oss-meta-lab.d.ts +1 -1
- package/dist/oss-meta-lab.js.map +1 -1
- package/dist/program.d.ts +4 -0
- package/dist/program.js +231 -74
- package/dist/program.js.map +1 -1
- package/dist/run-narration-secrets.d.ts +5 -0
- package/dist/run-narration-secrets.js +68 -0
- package/dist/run-narration-secrets.js.map +1 -0
- package/dist/run.d.ts +7 -2
- package/dist/run.js +25 -3
- package/dist/run.js.map +1 -1
- package/dist/scripted-browser-lab.js +7 -0
- package/dist/scripted-browser-lab.js.map +1 -1
- package/dist/secret-prompt.d.ts +2 -0
- package/dist/secret-prompt.js +36 -0
- package/dist/secret-prompt.js.map +1 -0
- package/dist/shared-world-lab.js +4 -0
- package/dist/shared-world-lab.js.map +1 -1
- package/dist/study-analysis-engine.js +30 -1
- package/dist/study-analysis-engine.js.map +1 -1
- package/dist/study-analysis-evidence.js +9 -1
- package/dist/study-analysis-evidence.js.map +1 -1
- package/dist/tui-app.js +135 -135
- package/dist/tui-contract.d.ts +26 -1
- package/dist/tui-contract.js.map +1 -1
- package/dist/tui-launch.d.ts +2 -0
- package/dist/tui-launch.js +9 -1
- package/dist/tui-launch.js.map +1 -1
- package/docs/architecture/comms-inbox.md +4 -0
- package/docs/architecture/real-email-receiving.md +135 -0
- package/docs/contracts/run-bundle.md +9 -1
- package/docs/contracts/schemas.md +50 -5
- package/docs/goals/current.md +5 -5
- package/docs/ramp/README.md +13 -3
- package/docs/release/0.95.0-connections-setup.md +38 -0
- package/docs/release/0.96.0-real-email-receiving.md +47 -0
- package/package.json +4 -2
- package/skills/humanish/SKILL.md +55 -14
package/dist/tui-contract.d.ts
CHANGED
|
@@ -6,6 +6,9 @@ import type { TuiActionResult } from "./tui-actions.js";
|
|
|
6
6
|
import type { TuiProjectState } from "./tui-project.js";
|
|
7
7
|
import type { ReadRunIndexOptions, RunIndexResult } from "./run-index.js";
|
|
8
8
|
import type { LaunchRunOptions, LaunchRunResult } from "./tui-launch.js";
|
|
9
|
+
import type { CommsSetupResult, CommsSetupStatus } from "./comms-connections.js";
|
|
10
|
+
import type { CommsCheckResult, CommsConfigureResult } from "./comms-setup.js";
|
|
11
|
+
import type { CommsRecoveryEntry } from "./comms-receiving.js";
|
|
9
12
|
/** The humanish version string shown in the frame, so a screenshot in a bug report is datable. */
|
|
10
13
|
export interface TuiVersionInfo {
|
|
11
14
|
cli: string;
|
|
@@ -16,6 +19,22 @@ export interface TuiVersionInfo {
|
|
|
16
19
|
* one place, and anything absent here is something the TUI simply cannot do.
|
|
17
20
|
*/
|
|
18
21
|
export interface TuiCapabilities {
|
|
22
|
+
/** Optional for older embedders. Credentials are never returned to the view. */
|
|
23
|
+
comms?: {
|
|
24
|
+
read(): Promise<CommsSetupStatus>;
|
|
25
|
+
save(): Promise<CommsSetupResult>;
|
|
26
|
+
check?(): Promise<CommsCheckResult>;
|
|
27
|
+
labs?(): Promise<{
|
|
28
|
+
title: string;
|
|
29
|
+
path: string;
|
|
30
|
+
}[]>;
|
|
31
|
+
configure?(lab: string, apply: boolean, planToken?: string): Promise<CommsConfigureResult>;
|
|
32
|
+
recovery?(): Promise<CommsRecoveryEntry[]>;
|
|
33
|
+
recover?(runId: string, connectionName: string): Promise<{
|
|
34
|
+
ok: boolean;
|
|
35
|
+
message: string;
|
|
36
|
+
}>;
|
|
37
|
+
};
|
|
19
38
|
/** Read every run in the project, cheapest source first. */
|
|
20
39
|
readRunIndex(cwd: string, options?: ReadRunIndexOptions): Promise<RunIndexResult>;
|
|
21
40
|
/**
|
|
@@ -62,6 +81,9 @@ export interface TuiCapabilities {
|
|
|
62
81
|
initProject(cwd: string): Promise<TuiActionResult>;
|
|
63
82
|
}
|
|
64
83
|
export interface TuiOptions {
|
|
84
|
+
/** Return to setup after the host-owned hidden prompt has finished. */
|
|
85
|
+
initialScreen?: "connections";
|
|
86
|
+
connectionNotice?: string;
|
|
65
87
|
/** The project the surface is reading. Already resolved by the CLI. */
|
|
66
88
|
cwd: string;
|
|
67
89
|
version: TuiVersionInfo;
|
|
@@ -80,7 +102,10 @@ export interface TuiOptions {
|
|
|
80
102
|
* Start the surface. Resolves with the process exit code when the operator quits — the TUI owns the
|
|
81
103
|
* screen until then, so the CLI must not write to stdout while this is pending.
|
|
82
104
|
*/
|
|
83
|
-
export type
|
|
105
|
+
export type TuiHandoff = {
|
|
106
|
+
action: "agentmail-key";
|
|
107
|
+
};
|
|
108
|
+
export type StartTui = (options: TuiOptions) => Promise<number | TuiHandoff>;
|
|
84
109
|
/** The shape `dist/tui-app.js` exports. Asserted at the load boundary in program.ts. */
|
|
85
110
|
export interface TuiModule {
|
|
86
111
|
startTui: StartTui;
|
package/dist/tui-contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-contract.js","sourceRoot":"","sources":["../src/tui-contract.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,6FAA6F;AAC7F,mGAAmG;AACnG,+EAA+E;AAC/E,EAAE;AACF,gGAAgG;AAChG,+FAA+F;AAC/F,gGAAgG;AAChG,mGAAmG;AACnG,6DAA6D;AAC7D,EAAE;AACF,mGAAmG;AACnG,mBAAmB;
|
|
1
|
+
{"version":3,"file":"tui-contract.js","sourceRoot":"","sources":["../src/tui-contract.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,6FAA6F;AAC7F,mGAAmG;AACnG,+EAA+E;AAC/E,EAAE;AACF,gGAAgG;AAChG,+FAA+F;AAC/F,gGAAgG;AAChG,mGAAmG;AACnG,6DAA6D;AAC7D,EAAE;AACF,mGAAmG;AACnG,mBAAmB;AAgHnB,mFAAmF;AACnF,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,gBAAwB,OAAO,CAAC,OAAO;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,kBAAkB,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAKtC;IACC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,+BAA+B,kBAAkB,cAAc,KAAK,CAAC,WAAW,mCAAmC,CAAC;IAC7H,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,8GAA8G,CAAC;IACxH,CAAC;IACD,OAAO,KAAK,CAAC,WAAW;QACtB,CAAC,CAAC,yEAAyE;QAC3E,CAAC,CAAC,kJAAkJ,CAAC;AACzJ,CAAC"}
|
package/dist/tui-launch.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export interface LaunchRunOptions {
|
|
|
4
4
|
cwd: string;
|
|
5
5
|
/** The manifest handle (filename stem), as `humanish lab run` takes it. */
|
|
6
6
|
lab: string;
|
|
7
|
+
/** Exact selected manifest, avoiding a same-name committed lab shadowing a local copy. */
|
|
8
|
+
manifestPath?: string;
|
|
7
9
|
mode: "dry-run" | "live";
|
|
8
10
|
/** Injected in tests; defaults to the real spawn. */
|
|
9
11
|
spawn?: typeof spawn;
|
package/dist/tui-launch.js
CHANGED
|
@@ -15,6 +15,7 @@ import { constants as fsConstants } from "node:fs";
|
|
|
15
15
|
import { open } from "node:fs/promises";
|
|
16
16
|
import path from "node:path";
|
|
17
17
|
import { fileURLToPath } from "node:url";
|
|
18
|
+
import { resolveLabManifest } from "./labs.js";
|
|
18
19
|
import { prepareManagedHumanishOutputDirectory } from "./selected-output-paths.js";
|
|
19
20
|
/**
|
|
20
21
|
* A lab handle is the manifest FILENAME, which is what `humanish lab run` resolves. Restricted to
|
|
@@ -49,6 +50,13 @@ export async function launchRun(options) {
|
|
|
49
50
|
};
|
|
50
51
|
}
|
|
51
52
|
const cwd = path.resolve(options.cwd);
|
|
53
|
+
let selectedLab = options.lab;
|
|
54
|
+
if (options.manifestPath !== undefined) {
|
|
55
|
+
const resolved = await resolveLabManifest(cwd, options.manifestPath);
|
|
56
|
+
if (!resolved.ok)
|
|
57
|
+
return { ok: false, error: { code: "HUMANISH_LAUNCH_INVALID_LAB", message: "The selected lab path could not be read safely. Refresh the lab list." } };
|
|
58
|
+
selectedLab = path.relative(cwd, path.resolve(cwd, resolved.path)).replace(/\\/g, "/");
|
|
59
|
+
}
|
|
52
60
|
const now = options.now ?? (() => new Date());
|
|
53
61
|
const spawnFn = options.spawn ?? spawn;
|
|
54
62
|
const launchedAt = now().toISOString();
|
|
@@ -88,7 +96,7 @@ export async function launchRun(options) {
|
|
|
88
96
|
...(options.mode === "dry-run" ? ["--dry-run"] : []),
|
|
89
97
|
// `--` ends option parsing, so the handle can only ever be read as the positional argument.
|
|
90
98
|
"--",
|
|
91
|
-
|
|
99
|
+
selectedLab
|
|
92
100
|
];
|
|
93
101
|
const spawnOptions = {
|
|
94
102
|
cwd,
|
package/dist/tui-launch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-launch.js","sourceRoot":"","sources":["../src/tui-launch.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,4FAA4F;AAC5F,iGAAiG;AACjG,8FAA8F;AAC9F,6FAA6F;AAC7F,4DAA4D;AAC5D,EAAE;AACF,gGAAgG;AAChG,8FAA8F;AAC9F,+FAA+F;AAC/F,sFAAsF;AAEtF,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,qCAAqC,EAAE,MAAM,4BAA4B,CAAC;AAEnF;;;;;;;;;GASG;AACH,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAEzD,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC;AAC5D,CAAC;
|
|
1
|
+
{"version":3,"file":"tui-launch.js","sourceRoot":"","sources":["../src/tui-launch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Participant inboxes
|
|
2
2
|
|
|
3
|
+
This page describes local capture. For fresh hosted inboxes, see
|
|
4
|
+
[real email receiving](real-email-receiving.md); that route has a separate
|
|
5
|
+
parsed renderer, strict remote-asset blocking and private lease lifecycle.
|
|
6
|
+
|
|
3
7
|
The catch captures application mail without sending it to an external recipient.
|
|
4
8
|
Humanish gives each participant an address and a matching
|
|
5
9
|
`/inbox/for/<address-digest>` URL. The same address scope applies to list, message,
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Real email receiving
|
|
2
|
+
|
|
3
|
+
A supported browser study can give each participant a fresh AgentMail inbox. The
|
|
4
|
+
application sends real email to that address; Humanish polls it on the host and
|
|
5
|
+
publishes a private inbox surface on that participant's desktop. The participant
|
|
6
|
+
can read the original email, switch to a plain view and follow an approved link.
|
|
7
|
+
|
|
8
|
+
Use local capture when you can redirect the app's send configuration and want to
|
|
9
|
+
avoid hosted mail. Use real receiving when the app must send normally or delivery
|
|
10
|
+
itself is part of the flow. These are separate modes; do not combine their settings.
|
|
11
|
+
SMS and participant outbound mail are not supported.
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
Open `humanish tui`, press **c**, and add an AgentMail key. Hidden entry saves it
|
|
16
|
+
in the existing user key store and checks authentication without creating an inbox.
|
|
17
|
+
The project profile stores only the provider and environment-variable name.
|
|
18
|
+
Environment and explicit env-file values retain precedence over saved keys.
|
|
19
|
+
A rejected or unavailable authentication check does not delete the saved key.
|
|
20
|
+
Authentication does not prove inbox creation/deletion permissions, quota or delivery.
|
|
21
|
+
This release requires an organization-scoped key.
|
|
22
|
+
|
|
23
|
+
Connections can preview and save a receiving-enabled local lab copy. The preview
|
|
24
|
+
discloses hosted email, model processing, local review and separate provider charges.
|
|
25
|
+
The original manifest is preserved. Select the new exact path when launching.
|
|
26
|
+
|
|
27
|
+
The same operations are available to agents:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
humanish keys set agentmail
|
|
31
|
+
humanish comms connections add agentmail --json
|
|
32
|
+
humanish comms check --online --json
|
|
33
|
+
humanish comms configure --lab humanish/labs/signup.yaml --json
|
|
34
|
+
# Review the returned path, disclosures and planToken, then:
|
|
35
|
+
humanish comms configure --lab humanish/labs/signup.yaml --apply --plan-token <digest> --json
|
|
36
|
+
humanish lab run .humanish/local/labs/signup-receiving.yaml --json --no-open
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Direct manifest authoring selects a saved connection:
|
|
40
|
+
|
|
41
|
+
```yaml
|
|
42
|
+
comms:
|
|
43
|
+
email:
|
|
44
|
+
connection: agentmail
|
|
45
|
+
# Optional: additional trusted email-link destinations, exact origins only.
|
|
46
|
+
allowedOrigins:
|
|
47
|
+
- https://accounts.example.test
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The target origin is automatically allowed. On provisioned subjects, the declared
|
|
51
|
+
serve origin and optional `linkOrigin` use the existing target-origin rewrite.
|
|
52
|
+
Review additional origins as destinations the participant is allowed to open from
|
|
53
|
+
mail. This policy governs the inbox surface, not all later browser navigation.
|
|
54
|
+
|
|
55
|
+
Supported execution is hosted computer use with app-url, clone or local-tree
|
|
56
|
+
subjects, including concurrent shared-world studies. Sequential shared-world,
|
|
57
|
+
local-agent, scripted, terminal, desktop-cli, in-process and local-app routes reject
|
|
58
|
+
real receiving before allocation. Connection mode cannot declare capture options,
|
|
59
|
+
recipients or borrowed mailbox IDs. A fresh address is not an existing account;
|
|
60
|
+
assignments must allow signup or arranging mail to the new identity.
|
|
61
|
+
|
|
62
|
+
## What a run does
|
|
63
|
+
|
|
64
|
+
1. Resolve the selected connection and host credential. Reject forwarding that
|
|
65
|
+
management credential through target environment names, aliases or literals.
|
|
66
|
+
2. Authenticate and durably record each acquisition intent in private host state.
|
|
67
|
+
Acquire all participant addresses before starting desktops.
|
|
68
|
+
3. Give each participant its address and loopback inbox URL. No management key or
|
|
69
|
+
other participant's mailbox is installed in its desktop. Each surface has only
|
|
70
|
+
its own list/message/plain/JSON routes, with no send endpoint or aggregate inbox.
|
|
71
|
+
4. Poll received mail, register scrub targets, sanitize/render and atomically
|
|
72
|
+
publish the complete inbox snapshot. Repeated reads can fill temporarily missing
|
|
73
|
+
bodies and inline images without changing local message identity.
|
|
74
|
+
5. Before desktop teardown, perform a bounded final read, save evidence, stop the
|
|
75
|
+
inbox surface and request deletion. Confirm provider absence; otherwise retain
|
|
76
|
+
unresolved cleanup for recovery. Provider deletion is not an erasure guarantee.
|
|
77
|
+
|
|
78
|
+
The original view preserves supported email structure and inline PNG/JPEG/GIF/WebP
|
|
79
|
+
images. Parsed HTML removes active content; response CSP blocks scripts, forms,
|
|
80
|
+
frames and remote assets. Remote images show an explicit unavailable placeholder.
|
|
81
|
+
Links use the same origin policy in original, plain and JSON views. Attachment
|
|
82
|
+
bytes are fetched only through the fixed provider API and its observed CDN host;
|
|
83
|
+
provider authorization never goes to the CDN. General attachments, arbitrary remote
|
|
84
|
+
images and raw-MIME fallback are unsupported. Raster checks are bounded signature
|
|
85
|
+
checks, not a guarantee that every malformed image will decode in a browser.
|
|
86
|
+
|
|
87
|
+
Collection is bounded by request time, request/page count, bytes, images and a
|
|
88
|
+
100-message retained inbox limit. Limits, failed reads, blocked content and failed
|
|
89
|
+
publication are recorded as coverage limitations. Inbox pages require reload to
|
|
90
|
+
show later messages. No webhook/public mail ingress is required on the host.
|
|
91
|
+
|
|
92
|
+
## Evidence and publication
|
|
93
|
+
|
|
94
|
+
`comms/receiving.json` uses `humanish.comms-receiving.v2`. It records local IDs,
|
|
95
|
+
counts, timestamps and lifecycle/coverage status, without raw mail, provider IDs,
|
|
96
|
+
addresses or stable content digests. The final run bundle embeds that projection.
|
|
97
|
+
Receipt, successful inbox publication, participant reading and target success are
|
|
98
|
+
separate claims; analysis receives this distinction and the harness limitations.
|
|
99
|
+
A missing message alone does not establish that the application failed to send.
|
|
100
|
+
Immediate automatic analysis scrubs known exact values from generated narration
|
|
101
|
+
using a bounded, invocation-local registry. It never saves that registry. Later
|
|
102
|
+
analysis cannot reconstruct it; screenshots may still expose mail content, and the
|
|
103
|
+
publication restriction applies to both immediate and later findings.
|
|
104
|
+
|
|
105
|
+
Mail is hosted by AgentMail. Its content can reach the hosted desktop, actor model,
|
|
106
|
+
screenshots, narration and analysis model. Such runs carry a durable
|
|
107
|
+
`real-communications` publication restriction: verification returns `local_only`,
|
|
108
|
+
public feedback/exposure and shareable exports remain gated, and screenshot
|
|
109
|
+
blurring does not clear the restriction. Local Observer review and explicitly local
|
|
110
|
+
HTML export remain available. Local-only publication is not local-only processing.
|
|
111
|
+
|
|
112
|
+
## Interrupted-run recovery
|
|
113
|
+
|
|
114
|
+
Process interruption can bypass normal final reads and teardown. Inspect recovery
|
|
115
|
+
state after stopping a run; do not assume Ctrl+C or killing a process deleted its
|
|
116
|
+
inboxes:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
humanish comms recover --json
|
|
120
|
+
humanish comms recover --run <run-id> --apply --json
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Connections also exposes pending cleanup. Recovery only uses private host journals
|
|
124
|
+
under `$XDG_STATE_HOME/humanish/comms` (default `~/.local/state/humanish/comms`),
|
|
125
|
+
with private directories/files and bound project, connection, account and scope.
|
|
126
|
+
A live or unknown owner blocks takeover. The adapter checks resource/client identity
|
|
127
|
+
before deletion; it cannot delete an inbox named only in a run artifact. Lost
|
|
128
|
+
creation responses can be reconciled through the recorded idempotent client ID.
|
|
129
|
+
Do not delete private journals while resources remain unresolved. Moving/replacing
|
|
130
|
+
the project or changing account/scope can intentionally prevent recovery.
|
|
131
|
+
|
|
132
|
+
If final evidence persistence fails, the provider inbox is retained as unresolved
|
|
133
|
+
rather than discarding the last retrievable copy. Explicit recovery is a deletion
|
|
134
|
+
operation, not message-history reconstruction. Sandbox reclamation remains a
|
|
135
|
+
separate operation.
|
|
@@ -468,7 +468,7 @@ bundle is safe to promote into a public issue. Public promotion should branch on
|
|
|
468
468
|
`shareSafety.status`:
|
|
469
469
|
|
|
470
470
|
- `share_ready`: feedback draft commands may render public issue payloads;
|
|
471
|
-
- `local_only`: keep the run local
|
|
471
|
+
- `local_only`: keep the run local; only supported redaction-only cases can produce a shareable derivative;
|
|
472
472
|
- `blocked`: fix the verification or public-safety failure first.
|
|
473
473
|
|
|
474
474
|
The local-evidence check includes screenshots declared only by
|
|
@@ -487,6 +487,14 @@ over a blurred declaration. Missing or unknown per-frame metadata retains the
|
|
|
487
487
|
existing permissive compatibility behavior; verification does not infer pixel
|
|
488
488
|
privacy from that absence.
|
|
489
489
|
|
|
490
|
+
Real email receiving adds `publication.restrictions: [real-communications]` and
|
|
491
|
+
an optional `commsReceiving` projection using `humanish.comms-receiving.v2`.
|
|
492
|
+
Either field contributes `REAL_COMMUNICATIONS` and keeps the run `local_only`.
|
|
493
|
+
This applies to interrupted bundles and after screenshot blurring: real mail can
|
|
494
|
+
appear in text and analysis as well as pixels. Malformed receiving metadata fails
|
|
495
|
+
bundle validation. The projection holds counts, local IDs and lifecycle/coverage
|
|
496
|
+
status; private provider identities and cleanup authority are kept outside the run.
|
|
497
|
+
|
|
490
498
|
## Redacted Derivative Workspace
|
|
491
499
|
|
|
492
500
|
`humanish export --run RUN --format bundle --redact-screenshots --out DIRECTORY`
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Date: 2026-06-02 (current-state note updated 2026-07-14)
|
|
4
4
|
|
|
5
5
|
Status: reference map for the major contracts shipped through source version
|
|
6
|
-
`0.
|
|
6
|
+
`0.96.0`; it is not an exhaustive inventory of command/result envelopes. Exported types,
|
|
7
7
|
schema constants, parsers, and validators in `src/` are authoritative. Rows
|
|
8
8
|
marked "reserved" name layering intent only — no code emits or validates them
|
|
9
9
|
yet. Do not emit a reserved schema.
|
|
@@ -265,10 +265,13 @@ A lab is a composition over code primitives, not a hardcoded kind:
|
|
|
265
265
|
`redactScreenshots: true` (blur unimplemented there) and
|
|
266
266
|
`allowPublicTargets: true` fail-closed rather than ignoring them.
|
|
267
267
|
- `comms` (#297; hosted on the clone/local-tree computer-use lanes and the
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
email
|
|
268
|
+
concurrent shared-world getHost plane, or connected to an external catch on
|
|
269
|
+
app-url/operator-provided subjects; unwired on sequential `concurrency: 1`
|
|
270
|
+
shared worlds): off-app
|
|
271
|
+
email the app itself sends, made a persona-driven testable surface. Lab
|
|
272
|
+
configuration rejects `comms.sms` and unknown channel names; message-bus SMS
|
|
273
|
+
types do not imply a supported SMS execution route. SMTP capture is supported
|
|
274
|
+
on per-lane provisioned routes and rejected for shared-world studies.
|
|
272
275
|
`comms.email` = `{ kind: fake, injectEnv?, port?, recipients?, linkOrigin?, external? }`.
|
|
273
276
|
`injectEnv` is the ADOPTER-NAMED env var the app reads for its email-API base
|
|
274
277
|
URL (e.g. `RESEND_API_URL`); the harness sets it to an in-sandbox catch (so it
|
|
@@ -310,6 +313,48 @@ A lab is a composition over code primitives, not a hardcoded kind:
|
|
|
310
313
|
persona saw the email is its screenshots of the inbox page. Requires `python3`
|
|
311
314
|
in the subject sandbox (the stock E2B desktop template has it).
|
|
312
315
|
|
|
316
|
+
### Communication connection setup
|
|
317
|
+
|
|
318
|
+
`.humanish/local/comms.yaml` is a project-local, non-secret configuration file:
|
|
319
|
+
|
|
320
|
+
```yaml
|
|
321
|
+
schema: humanish.comms-connections.v1
|
|
322
|
+
connections:
|
|
323
|
+
agentmail:
|
|
324
|
+
provider: agentmail
|
|
325
|
+
apiKeyEnv: AGENTMAIL_API_KEY
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
AgentMail supports setup and fresh per-participant email receiving. Connection names use lowercase
|
|
329
|
+
letters, digits and hyphens, beginning with a letter, up to 48 characters.
|
|
330
|
+
`apiKeyEnv` names an environment variable; it never contains its value.
|
|
331
|
+
Invalid fields, unsupported providers and unsafe filesystem paths are rejected.
|
|
332
|
+
Adding an existing name with different settings refuses to overwrite it.
|
|
333
|
+
|
|
334
|
+
`comms connections list --json` returns `humanish.comms-setup.v1`: configured
|
|
335
|
+
profiles and local key presence/source, not provider authentication or delivery.
|
|
336
|
+
`comms providers --json` returns `humanish.comms-providers.v1` with explicit
|
|
337
|
+
setup/receiving availability. The key store accepts `humanish keys set agentmail`.
|
|
338
|
+
Saving a connection neither modifies a lab nor creates a provider resource;
|
|
339
|
+
a supported study explicitly selects `comms.email: { connection: agentmail }`.
|
|
340
|
+
Optional `allowedOrigins` lists exact additional HTTP(S) origins; `linkOrigin`
|
|
341
|
+
participates in the existing provisioned-subject origin rewrite. Connection
|
|
342
|
+
selection cannot be combined with capture settings, recipients or provider options.
|
|
343
|
+
The derived internal kind is `real`; do not write `kind` beside a connection.
|
|
344
|
+
|
|
345
|
+
`comms check --online --json` returns `humanish.comms-check.v1`. Authentication,
|
|
346
|
+
credential presence, unknown permissions/capacity and untested delivery are separate.
|
|
347
|
+
`comms configure` previews/saves an ignored local manifest; `comms recover`
|
|
348
|
+
inspects or explicitly recovers privately owned interrupted leases.
|
|
349
|
+
|
|
350
|
+
Real receiving writes `humanish.comms-receiving.v2` count-only evidence with
|
|
351
|
+
participant-local message IDs, observation/publication timestamps, limitations,
|
|
352
|
+
acquisition and cleanup status. It contains no raw addresses, bodies, provider IDs
|
|
353
|
+
or content digests. `run.json` embeds the final projection as `commsReceiving` and
|
|
354
|
+
carries `publication.restrictions: [real-communications]`. Verification keeps the
|
|
355
|
+
run local-only regardless of screenshot redaction. See the
|
|
356
|
+
[receiving contract](../architecture/real-email-receiving.md).
|
|
357
|
+
|
|
313
358
|
Lab backends report results in their own schemas (`humanish.run-result.v1`,
|
|
314
359
|
`humanish.oss-lab-result.v1`, `humanish.oss-meta-lab-result.v1`,
|
|
315
360
|
`humanish.cua-lab-result.v2`, `humanish.scripted-lab-result.v1`,
|
package/docs/goals/current.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Current Goals
|
|
2
2
|
|
|
3
|
-
Status date: 2026-09-
|
|
3
|
+
Status date: 2026-09-21. Release baseline: `0.96.0`.
|
|
4
4
|
|
|
5
5
|
This page guides work on current merged source. Published behavior is described
|
|
6
|
-
in the [release notes](../release/0.
|
|
6
|
+
in the [release notes](../release/0.96.0-real-email-receiving.md).
|
|
7
7
|
The [September 9 history](https://github.com/danielgwilson/humanish/blob/main/docs/goals/current-history-2026-09-09.md)
|
|
8
8
|
preserves the former status log; its queues do not supersede this page.
|
|
9
9
|
|
|
@@ -88,7 +88,7 @@ requires decision-equivalent retained evidence and a real deletion branch.
|
|
|
88
88
|
No first-party deletion branch has met that gate. Public demonstrations do not
|
|
89
89
|
substitute for it.
|
|
90
90
|
|
|
91
|
-
## Current Program Truth (source `0.
|
|
91
|
+
## Current Program Truth (source `0.96.0`)
|
|
92
92
|
|
|
93
93
|
| Surface | Available in merged source | Remaining boundary |
|
|
94
94
|
| --- | --- | --- |
|
|
@@ -100,8 +100,8 @@ substitute for it.
|
|
|
100
100
|
| Observer | Live/recorded views, shared grid and participant playback, participant assignments, action-specific links, saved moments, zoom, comparison and phone-width review | Sparse captures cannot prove every action's effect; visual comparison alone is not a controlled experiment |
|
|
101
101
|
| Review and feedback | Verification grades, feedback drafts, portable HTML, redacted bundle derivatives and computer-use completion-source labels | Sharing requires the appropriate grade; participant reports and condition matches still need task adjudication |
|
|
102
102
|
| Study findings | Default post-run analysis on supported live routes with a separate disclosed $3 admission estimate limit and opt-out; explicit `analyze`, fairer evidence selection, concern review and versioned findings with exact source links | Model interpretation needs review; bounded selection and source truncation limit coverage; opening Observer never dispatches analysis |
|
|
103
|
-
| TUI and serving | Detached starts, run stopping, reclamation, Observer attachment, loopback serving
|
|
104
|
-
| Off-app communication | Recipient-scoped
|
|
103
|
+
| TUI and serving | Detached starts, run stopping, reclamation, Observer attachment, loopback serving, run library and AgentMail setup, authentication and lab configuration | Stopping a process does not itself prove sandbox cleanup; TUI views over CLI `stats`/`export` remain follow-ups |
|
|
104
|
+
| Off-app communication | Recipient-scoped local capture and fresh real AgentMail receiving, supported inline raster images, bounded collection and host-owned recovery | Real mail uses isolated participant surfaces and remains local-only for publication. Hosted mail/model processing, bounded fidelity and interrupted-run recovery are explicit; local-agent, borrowed inboxes and SMS are unsupported |
|
|
105
105
|
| Mobile and media | Hosted viewport/emulation, desktop geometry checks, bounded dwell and declared camera feed; a synthetic video-only call with separate hosted peers is proven | Audio, TURN, provider-specific rooms, physical-device and touch fidelity remain unproven; unsupported media declarations are rejected |
|
|
106
106
|
|
|
107
107
|
Use the [task support matrix](../architecture/task-protocol-support.md),
|
package/docs/ramp/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Status: public-safe contributor and agent ramp.
|
|
4
4
|
|
|
5
|
-
Package/source version in this tree: `0.
|
|
5
|
+
Package/source version in this tree: `0.96.0` (2026-09-21). The Observer is phone-usable as a stated requirement (observer/AGENTS.md); interactive primitives start from Base UI. The Observer renderer is the observer/ workspace artifact only; the legacy string-concat renderer was deleted at cutover (#426), and rollback is a version pin to 0.42.0. The containment boundary introduced in
|
|
6
6
|
`0.15.1` remains in force: managed run and output paths bind to validated
|
|
7
7
|
physical filesystem identities, and stored provider IDs are evidence, not
|
|
8
8
|
cleanup authority. The bundled OSS meta-lab is dry-run only until
|
|
@@ -47,6 +47,15 @@ If a change does not improve one of those loops, it probably belongs elsewhere.
|
|
|
47
47
|
|
|
48
48
|
## Current State
|
|
49
49
|
|
|
50
|
+
The [0.96.0 release note](../release/0.96.0-real-email-receiving.md) describes
|
|
51
|
+
fresh per-participant AgentMail inboxes, isolated desktop mail views, host-owned
|
|
52
|
+
cleanup/recovery, local-only evidence publication, and authentication/configuration
|
|
53
|
+
in Connections. SMS and local-agent receiving remain unsupported.
|
|
54
|
+
|
|
55
|
+
The [0.95.0 release note](../release/0.95.0-connections-setup.md) introduced
|
|
56
|
+
connection profiles and hidden key entry; 0.96.0 makes those connections usable
|
|
57
|
+
in supported browser studies.
|
|
58
|
+
|
|
50
59
|
The [0.94.0 release note](../release/0.94.0-reliability.md) describes analysis
|
|
51
60
|
request deadlines and budget-aware output, smaller portable recordings,
|
|
52
61
|
recipient-scoped synthetic inboxes, route-aware setup checks, decoded capture
|
|
@@ -154,11 +163,12 @@ Implemented:
|
|
|
154
163
|
deterministic proof, while concurrent has deterministic and kept live proof;
|
|
155
164
|
- `subject.source: local-tree`, which packages one selected working tree with a
|
|
156
165
|
content pin before using the same provision-and-serve path as clone subjects;
|
|
157
|
-
- an off-app comms funnel for email
|
|
166
|
+
- an off-app comms funnel for email-gated flows: a vendor-neutral in-sandbox
|
|
158
167
|
catch redirects the app's own send API, a persona reads a minimal inbox surface
|
|
159
168
|
and clicks through, and a digest-only `humanish.comms-thread.v1` artifact
|
|
160
169
|
records the thread with no raw address, link, or code — wired into the
|
|
161
|
-
computer-use and shared-world routes and live-proven on computer-use
|
|
170
|
+
computer-use and concurrent shared-world routes and live-proven on computer-use.
|
|
171
|
+
SMS is not yet a configured execution route;
|
|
162
172
|
- resolved-persona directives that actually shape the actor prompt on the
|
|
163
173
|
terminal-product route (traits are applied and recorded in the actor trace, not
|
|
164
174
|
decorative), reusing the same `persona.ts` compiler as the computer-use lane;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 0.95.0 — Connections and hidden key entry
|
|
2
|
+
|
|
3
|
+
Open `humanish tui` and press **c** to configure AgentMail. **Add API key**
|
|
4
|
+
opens a hidden terminal prompt, then returns to Connections. Ctrl+C cancels
|
|
5
|
+
without changing the existing key or profile. Existing keys can be reused or
|
|
6
|
+
replaced. Entry uses the host's key store, outside the TUI rendering contract.
|
|
7
|
+
|
|
8
|
+
Keys live in the existing user-level store with file mode 0600. Project
|
|
9
|
+
connection metadata lives in `.humanish/local/comms.yaml` and contains only a
|
|
10
|
+
provider name and environment-variable reference. Explicit environment/env-file
|
|
11
|
+
values retain precedence; strict key mode continues to disable discovery.
|
|
12
|
+
The screen identifies those cases instead of claiming a newly stored key is active.
|
|
13
|
+
|
|
14
|
+
Agents have matching commands:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
humanish comms providers --json
|
|
18
|
+
humanish keys set agentmail
|
|
19
|
+
humanish comms connections add agentmail --json
|
|
20
|
+
humanish comms connections list --json
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
This is connection setup only. Authentication, permissions, capacity and
|
|
24
|
+
delivery are unverified, and this version does not acquire mailboxes or enable
|
|
25
|
+
provider-backed email in studies. Unsupported study connection/SMS selectors
|
|
26
|
+
and shared-world SMTP declarations fail before execution. Supported local
|
|
27
|
+
email capture remains available.
|
|
28
|
+
|
|
29
|
+
The release also includes TUI `--env-file` propagation and route-specific key
|
|
30
|
+
requirements from #793. Dry-run, local-agent and terminal participants no longer
|
|
31
|
+
inherit a hardcoded OpenAI-plus-E2B key requirement.
|
|
32
|
+
|
|
33
|
+
Validation covers local configuration, containment, credential precedence,
|
|
34
|
+
hidden entry/cancellation/paste, persistence and TUI frames at 80 and 45
|
|
35
|
+
columns. `pnpm tui:connections:proof` drives the built CLI in a real PTY with
|
|
36
|
+
synthetic keys and an isolated store, checking cancellation, replacement,
|
|
37
|
+
restart and absence of credential values from terminal output. It requires
|
|
38
|
+
Python 3 with Unix PTY support; it does not contact AgentMail.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# 0.96.0 — Real email receiving
|
|
2
|
+
|
|
3
|
+
Supported browser studies can now give each participant a fresh AgentMail inbox.
|
|
4
|
+
The application sends normally; participants open their own inbox, read the email
|
|
5
|
+
and follow its confirmation link. Local capture remains a separate option for
|
|
6
|
+
apps whose send configuration can point at a test catch.
|
|
7
|
+
|
|
8
|
+
Connections checks authentication after hidden key entry and offers lab
|
|
9
|
+
configuration and pending cleanup. Lab configuration previews a separate ignored
|
|
10
|
+
copy, preserves the original, checks for stale previews and launches by exact
|
|
11
|
+
selected path. Agents have matching `comms check`, `comms configure` and
|
|
12
|
+
`comms recover` commands.
|
|
13
|
+
|
|
14
|
+
Provider credentials remain on the host. Participants receive isolated loopback
|
|
15
|
+
mail surfaces with original/plain views, supported inline raster images and a
|
|
16
|
+
consistent allowed-origin link policy. Remote images and active HTML are blocked;
|
|
17
|
+
missing content is explicit. Collection and publication are bounded and distinct
|
|
18
|
+
from a participant reading mail. Later reads can fill temporarily missing content.
|
|
19
|
+
|
|
20
|
+
Fresh mailbox ownership is recorded privately before acquisition. Normal teardown
|
|
21
|
+
saves evidence and confirms provider deletion. Interrupted runs have explicit,
|
|
22
|
+
project/account-bound recovery; mutable recording IDs cannot authorize deletion.
|
|
23
|
+
Evidence-write failures retain the inbox as unresolved.
|
|
24
|
+
|
|
25
|
+
Real mail may reach hosted desktops, actor/analysis models and recordings. These
|
|
26
|
+
runs have a durable `local_only` publication restriction; blurring screenshots
|
|
27
|
+
does not make them shareable. Immediate analysis uses the run's temporary scrub
|
|
28
|
+
registry for generated narration, without saving raw secret values. Later analysis
|
|
29
|
+
cannot reconstruct that registry and remains subject to the same publication gate.
|
|
30
|
+
|
|
31
|
+
This release supports hosted computer-use app-url, clone and local-tree routes,
|
|
32
|
+
including concurrent shared worlds. It rejects local-agent and unsupported routes
|
|
33
|
+
before allocation. SMS, outbound participant mail, borrowed inboxes, arbitrary
|
|
34
|
+
attachments and raw-MIME fallback remain unavailable.
|
|
35
|
+
|
|
36
|
+
See [setup, behavior and recovery](../architecture/real-email-receiving.md) for
|
|
37
|
+
configuration, processing disclosures and limits.
|
|
38
|
+
|
|
39
|
+
Validation includes captured provider-wire contracts, crash/recovery and credential
|
|
40
|
+
isolation tests, outer-runner tests for clone/local-tree and concurrent shared-world
|
|
41
|
+
routes, inbox browser checks at desktop/phone widths, and hidden-key TUI proof.
|
|
42
|
+
A retained live app-url study, `real-email-57ed0512-218d-4e58-9f76-c540541d0b56`,
|
|
43
|
+
had two concurrent participants receive separate emails, follow their own links,
|
|
44
|
+
reach the target dashboard and finish automatic analysis. Provider absence was
|
|
45
|
+
confirmed for both participant inboxes and the synthetic sender. Raw mail and
|
|
46
|
+
recordings remain private. This does not establish delivery for every target app
|
|
47
|
+
or live-provider coverage of every execution route.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "humanish",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.96.0",
|
|
4
4
|
"description": "Open-source-safe CLI for persona simulation, observer review, and public-safe feedback drafts.",
|
|
5
5
|
"author": "Daniel G Wilson <daniel@danielgwilson.com>",
|
|
6
6
|
"keywords": [
|
|
@@ -81,7 +81,8 @@
|
|
|
81
81
|
"observer:browser:proof": "node scripts/observer-browser-proof.mjs",
|
|
82
82
|
"observer:iframe:proof": "node scripts/observer-iframe-proof.mjs",
|
|
83
83
|
"observer:chrome:proof": "node scripts/observer-chrome-proof.mjs",
|
|
84
|
-
"observer:reliability:proof": "node scripts/observer-reliability-proof.mjs"
|
|
84
|
+
"observer:reliability:proof": "node scripts/observer-reliability-proof.mjs",
|
|
85
|
+
"tui:connections:proof": "python3 scripts/tui-connections-proof.py"
|
|
85
86
|
},
|
|
86
87
|
"repository": {
|
|
87
88
|
"type": "git",
|
|
@@ -93,6 +94,7 @@
|
|
|
93
94
|
"homepage": "https://github.com/danielgwilson/humanish#readme",
|
|
94
95
|
"dependencies": {
|
|
95
96
|
"commander": "^14.0.3",
|
|
97
|
+
"parse5": "^8.0.1",
|
|
96
98
|
"playwright-core": "^1.60.0",
|
|
97
99
|
"pngjs": "^7.0.0",
|
|
98
100
|
"undici": "^6.28.1",
|