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.
Files changed (95) hide show
  1. package/README.md +10 -0
  2. package/dist/comms-agentmail.d.ts +25 -0
  3. package/dist/comms-agentmail.js +418 -0
  4. package/dist/comms-agentmail.js.map +1 -0
  5. package/dist/comms-connections.d.ts +52 -0
  6. package/dist/comms-connections.js +123 -0
  7. package/dist/comms-connections.js.map +1 -0
  8. package/dist/comms-lease-store.d.ts +90 -0
  9. package/dist/comms-lease-store.js +489 -0
  10. package/dist/comms-lease-store.js.map +1 -0
  11. package/dist/comms-receiving-evidence.d.ts +46 -0
  12. package/dist/comms-receiving-evidence.js +35 -0
  13. package/dist/comms-receiving-evidence.js.map +1 -0
  14. package/dist/comms-receiving-inbox.d.ts +16 -0
  15. package/dist/comms-receiving-inbox.js +410 -0
  16. package/dist/comms-receiving-inbox.js.map +1 -0
  17. package/dist/comms-receiving-runtime.d.ts +25 -0
  18. package/dist/comms-receiving-runtime.js +45 -0
  19. package/dist/comms-receiving-runtime.js.map +1 -0
  20. package/dist/comms-receiving-types.d.ts +98 -0
  21. package/dist/comms-receiving-types.js +2 -0
  22. package/dist/comms-receiving-types.js.map +1 -0
  23. package/dist/comms-receiving.d.ts +58 -0
  24. package/dist/comms-receiving.js +554 -0
  25. package/dist/comms-receiving.js.map +1 -0
  26. package/dist/comms-setup.d.ts +40 -0
  27. package/dist/comms-setup.js +121 -0
  28. package/dist/comms-setup.js.map +1 -0
  29. package/dist/concurrent-shared-world-lab.js +662 -624
  30. package/dist/concurrent-shared-world-lab.js.map +1 -1
  31. package/dist/cua-actor-lab.d.ts +4 -1
  32. package/dist/cua-actor-lab.js +98 -17
  33. package/dist/cua-actor-lab.js.map +1 -1
  34. package/dist/doctor-lab.d.ts +7 -0
  35. package/dist/doctor-lab.js +26 -7
  36. package/dist/doctor-lab.js.map +1 -1
  37. package/dist/e2b-terminal-lab.js +3 -0
  38. package/dist/e2b-terminal-lab.js.map +1 -1
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/key-resolution.d.ts +1 -1
  43. package/dist/key-resolution.js +6 -4
  44. package/dist/key-resolution.js.map +1 -1
  45. package/dist/lab-config.d.ts +20 -3
  46. package/dist/lab-config.js +65 -3
  47. package/dist/lab-config.js.map +1 -1
  48. package/dist/lab-engine.js +8 -3
  49. package/dist/lab-engine.js.map +1 -1
  50. package/dist/lab-summary.d.ts +3 -2
  51. package/dist/lab-summary.js +17 -7
  52. package/dist/lab-summary.js.map +1 -1
  53. package/dist/observer-app.html +1 -1
  54. package/dist/observer-data.js +14 -1
  55. package/dist/observer-data.js.map +1 -1
  56. package/dist/oss-lab.d.ts +1 -1
  57. package/dist/oss-lab.js.map +1 -1
  58. package/dist/oss-meta-lab.d.ts +1 -1
  59. package/dist/oss-meta-lab.js.map +1 -1
  60. package/dist/program.d.ts +4 -0
  61. package/dist/program.js +231 -74
  62. package/dist/program.js.map +1 -1
  63. package/dist/run-narration-secrets.d.ts +5 -0
  64. package/dist/run-narration-secrets.js +68 -0
  65. package/dist/run-narration-secrets.js.map +1 -0
  66. package/dist/run.d.ts +7 -2
  67. package/dist/run.js +25 -3
  68. package/dist/run.js.map +1 -1
  69. package/dist/scripted-browser-lab.js +7 -0
  70. package/dist/scripted-browser-lab.js.map +1 -1
  71. package/dist/secret-prompt.d.ts +2 -0
  72. package/dist/secret-prompt.js +36 -0
  73. package/dist/secret-prompt.js.map +1 -0
  74. package/dist/shared-world-lab.js +4 -0
  75. package/dist/shared-world-lab.js.map +1 -1
  76. package/dist/study-analysis-engine.js +30 -1
  77. package/dist/study-analysis-engine.js.map +1 -1
  78. package/dist/study-analysis-evidence.js +9 -1
  79. package/dist/study-analysis-evidence.js.map +1 -1
  80. package/dist/tui-app.js +135 -135
  81. package/dist/tui-contract.d.ts +26 -1
  82. package/dist/tui-contract.js.map +1 -1
  83. package/dist/tui-launch.d.ts +2 -0
  84. package/dist/tui-launch.js +9 -1
  85. package/dist/tui-launch.js.map +1 -1
  86. package/docs/architecture/comms-inbox.md +4 -0
  87. package/docs/architecture/real-email-receiving.md +135 -0
  88. package/docs/contracts/run-bundle.md +9 -1
  89. package/docs/contracts/schemas.md +50 -5
  90. package/docs/goals/current.md +5 -5
  91. package/docs/ramp/README.md +13 -3
  92. package/docs/release/0.95.0-connections-setup.md +38 -0
  93. package/docs/release/0.96.0-real-email-receiving.md +47 -0
  94. package/package.json +4 -2
  95. package/skills/humanish/SKILL.md +55 -14
@@ -0,0 +1,123 @@
1
+ import { constants } from "node:fs";
2
+ import { lstat, open, unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { parse, stringify } from "yaml";
5
+ import { listUserKeys, probeKeySources } from "./key-resolution.js";
6
+ import { assertPreparedSelectedOutputDirectory, bindExistingManagedHumanishOutputDirectory, prepareManagedHumanishOutputDirectory, readContainedRegularFile, writeContainedOutputFile } from "./selected-output-paths.js";
7
+ export const COMMS_CONNECTIONS_SCHEMA = "humanish.comms-connections.v1";
8
+ export const COMMS_CONFIG_PATH = ".humanish/local/comms.yaml";
9
+ export const COMMS_PROVIDERS = [{
10
+ id: "agentmail", label: "AgentMail", channel: "email", keyEnv: "AGENTMAIL_API_KEY",
11
+ setupAvailable: true, receivingAvailable: true,
12
+ description: "A hosted email service with real inbox addresses.",
13
+ setupUrl: "https://console.agentmail.to",
14
+ limitation: "Fresh real inboxes for supported computer-use studies. Hosted processing; local evidence review only. Provider charges are separate."
15
+ }];
16
+ const record = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
17
+ const validName = (name) => /^[a-z][a-z0-9-]{0,47}$/.test(name) && name !== "constructor" && name !== "prototype";
18
+ const empty = () => ({ schema: COMMS_CONNECTIONS_SCHEMA, connections: {} });
19
+ async function exists(file) {
20
+ try {
21
+ await lstat(file);
22
+ return true;
23
+ }
24
+ catch (error) {
25
+ if (error.code === "ENOENT")
26
+ return false;
27
+ throw error;
28
+ }
29
+ }
30
+ function parseConnections(raw) {
31
+ if (!record(raw) || raw.schema !== COMMS_CONNECTIONS_SCHEMA || !record(raw.connections)
32
+ || Object.keys(raw).some(key => key !== "schema" && key !== "connections")
33
+ || Object.keys(raw.connections).length > 32)
34
+ throw new Error("Invalid connection configuration.");
35
+ const connections = {};
36
+ for (const [name, value] of Object.entries(raw.connections)) {
37
+ if (!validName(name) || !record(value) || value.provider !== "agentmail"
38
+ || typeof value.apiKeyEnv !== "string" || !/^[A-Z][A-Z0-9_]{0,99}$/.test(value.apiKeyEnv)
39
+ || Object.keys(value).some(key => key !== "provider" && key !== "apiKeyEnv"))
40
+ throw new Error("Invalid connection configuration.");
41
+ connections[name] = { provider: "agentmail", apiKeyEnv: value.apiKeyEnv };
42
+ }
43
+ return { schema: COMMS_CONNECTIONS_SCHEMA, connections };
44
+ }
45
+ /** Offline and non-mutating. Unsafe storage is an error, never an empty configuration. */
46
+ export async function readCommsConnections(cwd) {
47
+ const root = await bindExistingManagedHumanishOutputDirectory(cwd, "local");
48
+ if (!root) {
49
+ if (await exists(path.resolve(cwd, ".humanish", "local")))
50
+ throw new Error("Unsafe connection directory.");
51
+ return empty();
52
+ }
53
+ const file = path.join(root.physicalPath, "comms.yaml");
54
+ if (!await exists(file))
55
+ return empty();
56
+ if ((await lstat(file)).size > 65_536)
57
+ throw new Error("Connection configuration is too large.");
58
+ const bytes = await readContainedRegularFile(root, "comms.yaml");
59
+ if (!bytes || bytes.length > 65_536)
60
+ throw new Error("Cannot safely read connection configuration.");
61
+ // YAML diagnostics may echo the offending value; do not let them reach a status or frame.
62
+ try {
63
+ return parseConnections(parse(bytes.toString("utf8"), { maxAliasCount: 0 }));
64
+ }
65
+ catch {
66
+ throw new Error("Invalid connection configuration.");
67
+ }
68
+ }
69
+ /** Add one exact profile. No lab mutation, network, provider resources or credential values. */
70
+ export async function saveCommsConnection(cwd, name = "agentmail", apiKeyEnv = "AGENTMAIL_API_KEY") {
71
+ try {
72
+ parseConnections({ schema: COMMS_CONNECTIONS_SCHEMA, connections: { [name]: { provider: "agentmail", apiKeyEnv } } });
73
+ // Read before creating storage, so malformed or redirected existing configuration fails first.
74
+ await readCommsConnections(cwd);
75
+ const root = await prepareManagedHumanishOutputDirectory(cwd, "local");
76
+ const lockPath = path.join(root.physicalPath, ".comms-setup.lock");
77
+ const lock = await open(lockPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o600);
78
+ const identity = await lock.stat();
79
+ try {
80
+ await assertPreparedSelectedOutputDirectory(root);
81
+ const config = await readCommsConnections(cwd);
82
+ const previous = config.connections[name];
83
+ if (previous && (previous.provider !== "agentmail" || previous.apiKeyEnv !== apiKeyEnv)) {
84
+ return { ok: false, message: "That connection name already uses different settings. Choose another name." };
85
+ }
86
+ config.connections[name] = { provider: "agentmail", apiKeyEnv };
87
+ parseConnections(config);
88
+ await writeContainedOutputFile(root, "comms.yaml", stringify(config), "utf8");
89
+ return { ok: true, message: "Connection saved for this project. Select it in a supported lab to use fresh real inboxes." };
90
+ }
91
+ finally {
92
+ await lock.close();
93
+ await assertPreparedSelectedOutputDirectory(root);
94
+ const current = await lstat(lockPath);
95
+ if (current.dev === identity.dev && current.ino === identity.ino)
96
+ await unlink(lockPath);
97
+ }
98
+ }
99
+ catch (error) {
100
+ return { ok: false, message: error.code === "EEXIST"
101
+ ? "Connection setup is locked. Close another setup session; after an interrupted save, remove .humanish/local/.comms-setup.lock and retry."
102
+ : "Could not save the connection. Inspect .humanish/local/comms.yaml and its directory permissions before retrying." };
103
+ }
104
+ }
105
+ export async function readCommsSetup(cwd, env, deps) {
106
+ const base = { schema: "humanish.comms-setup.v1", configPath: COMMS_CONFIG_PATH, providers: COMMS_PROVIDERS };
107
+ const credential = { present: false, source: null, stored: false,
108
+ strict: env.HUMANISH_STRICT_KEYS?.trim() === "1", explicitlyEmpty: env.AGENTMAIL_API_KEY !== undefined && env.AGENTMAIL_API_KEY.trim() === "" };
109
+ try {
110
+ const config = await readCommsConnections(cwd);
111
+ const [probe] = await probeKeySources(["AGENTMAIL_API_KEY"], { cwd, env, ...(deps ? { deps } : {}) });
112
+ credential.source = probe?.source ?? null;
113
+ credential.present = credential.source !== null;
114
+ credential.stored = listUserKeys(env, deps).includes("AGENTMAIL_API_KEY");
115
+ return { ...base, ok: true, connections: Object.entries(config.connections).map(([name, value]) => ({ name, ...value })), credential,
116
+ message: "Checks are local. Authentication, permissions, capacity and delivery have not been verified." };
117
+ }
118
+ catch {
119
+ return { ...base, ok: false, connections: [], credential,
120
+ message: "Could not read connection setup. Check .humanish/local/comms.yaml and key-store permissions. No changes were made." };
121
+ }
122
+ }
123
+ //# sourceMappingURL=comms-connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comms-connections.js","sourceRoot":"","sources":["../src/comms-connections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import type { ReceivingIdentity, ReceivingLease } from "./comms-receiving-types.js";
2
+ declare const SCHEMA = "humanish.comms-lease-journal.v1";
3
+ type PhysicalIdentity = {
4
+ path: string;
5
+ dev: number;
6
+ ino: number;
7
+ };
8
+ type Owner = {
9
+ pid: number;
10
+ host: string;
11
+ token: string;
12
+ active: boolean;
13
+ };
14
+ export type CommsLeaseState = "planned" | "intent" | "active" | "closing" | "not-created" | "absent" | "deleting" | "unresolved";
15
+ export interface CommsLeaseRecord {
16
+ participantId: string;
17
+ leaseId: string;
18
+ clientId: string;
19
+ ownership: "fresh";
20
+ state: CommsLeaseState;
21
+ lease?: ReceivingLease;
22
+ }
23
+ export interface CommsLeaseJournal {
24
+ schema: typeof SCHEMA;
25
+ project: PhysicalIdentity;
26
+ runId: string;
27
+ incarnation: string;
28
+ connectionName: string;
29
+ apiKeyEnv: string;
30
+ identity: ReceivingIdentity;
31
+ owner: Owner;
32
+ state: "active" | "closed" | "unresolved";
33
+ createdAt: string;
34
+ updatedAt: string;
35
+ leases: CommsLeaseRecord[];
36
+ }
37
+ export interface CommsRecoveryEntry {
38
+ id: string;
39
+ runId: string;
40
+ connectionName: string;
41
+ status: "active" | "closed" | "unresolved";
42
+ participantCount: number;
43
+ unresolvedCount: number;
44
+ activeOwner: boolean | null;
45
+ }
46
+ export declare class CommsAuthorityError extends Error {
47
+ readonly code: "authority_unavailable" | "authority_changed" | "owner_active" | "owner_unknown" | "binding_mismatch";
48
+ constructor(code: "authority_unavailable" | "authority_changed" | "owner_active" | "owner_unknown" | "binding_mismatch");
49
+ }
50
+ export declare function sameReceivingIdentity(a: ReceivingIdentity, b: ReceivingIdentity): boolean;
51
+ export declare function validReceivingIdentity(value: unknown): value is ReceivingIdentity;
52
+ export declare function validReceivingLease(value: unknown, clientId: string): value is ReceivingLease;
53
+ export declare class CommsLeaseStore {
54
+ private readonly dir;
55
+ private readonly name;
56
+ private readonly lock;
57
+ private journal;
58
+ private text;
59
+ private serial;
60
+ private released;
61
+ private constructor();
62
+ snapshot(): CommsLeaseJournal;
63
+ assertOwnership(): Promise<void>;
64
+ private update;
65
+ bind(participantId: string, lease: ReceivingLease): Promise<void>;
66
+ setState(participantId: string, state: CommsLeaseState): Promise<void>;
67
+ close(): Promise<void>;
68
+ releaseLock(): Promise<void>;
69
+ static create(options: {
70
+ cwd: string;
71
+ runId: string;
72
+ connectionName: string;
73
+ apiKeyEnv: string;
74
+ identity: ReceivingIdentity;
75
+ participants: string[];
76
+ stateDir?: string;
77
+ }): Promise<CommsLeaseStore>;
78
+ static recover(options: {
79
+ cwd: string;
80
+ runId: string;
81
+ connectionName: string;
82
+ apiKeyEnv: string;
83
+ stateDir?: string;
84
+ }): Promise<CommsLeaseStore>;
85
+ }
86
+ export declare function inspectCommsLeaseStore(options: {
87
+ cwd: string;
88
+ stateDir?: string;
89
+ }): Promise<CommsRecoveryEntry[]>;
90
+ export {};