stillpoint-mcp 0.0.1
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/.env.example +30 -0
- package/LICENSE +21 -0
- package/README.md +557 -0
- package/config.js +93 -0
- package/content/conflict.json +125 -0
- package/content/difficulty.json +125 -0
- package/content/endings.json +125 -0
- package/content/manifest.json +6 -0
- package/content/recognition.json +125 -0
- package/content/uncertainty.json +125 -0
- package/lib/library.js +144 -0
- package/lib/logger.js +237 -0
- package/lib/sessions.js +125 -0
- package/lib/validate.js +210 -0
- package/package.json +40 -0
- package/server.js +1052 -0
package/config.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const crypto = require("crypto");
|
|
2
|
+
const os = require("os");
|
|
3
|
+
const path = require("path");
|
|
4
|
+
|
|
5
|
+
require("dotenv").config();
|
|
6
|
+
|
|
7
|
+
function parseBoolean(value, defaultValue) {
|
|
8
|
+
if (value === undefined || value === null || value === "") {
|
|
9
|
+
return defaultValue;
|
|
10
|
+
}
|
|
11
|
+
if (value === true || value === "true") {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
if (value === false || value === "false") {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
throw new Error(`Invalid boolean value: ${value}`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function parseInteger(value, defaultValue, name, min) {
|
|
21
|
+
if (value === undefined || value === null || value === "") {
|
|
22
|
+
return defaultValue;
|
|
23
|
+
}
|
|
24
|
+
const parsed = Number.parseInt(String(value), 10);
|
|
25
|
+
if (!Number.isInteger(parsed) || parsed < min) {
|
|
26
|
+
throw new Error(`${name} must be an integer >= ${min}`);
|
|
27
|
+
}
|
|
28
|
+
return parsed;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function parseSqlitePath(value) {
|
|
32
|
+
if (value === undefined || value === null || value === "") {
|
|
33
|
+
return path.join(os.homedir(), ".stillpoint", "stillpoint.db");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const trimmed = String(value).trim();
|
|
37
|
+
if (trimmed === "~") {
|
|
38
|
+
return os.homedir();
|
|
39
|
+
}
|
|
40
|
+
if (trimmed.startsWith("~/")) {
|
|
41
|
+
return path.join(os.homedir(), trimmed.slice(2));
|
|
42
|
+
}
|
|
43
|
+
return trimmed;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function loadConfig(env = process.env) {
|
|
47
|
+
const port = parseInteger(env.PORT, 3000, "PORT", 1);
|
|
48
|
+
const logsEnabled = parseBoolean(env.LOGS, true);
|
|
49
|
+
|
|
50
|
+
const config = {
|
|
51
|
+
port,
|
|
52
|
+
allowReflectionIds: parseBoolean(env.ALLOW_REFLECTION_IDS, true),
|
|
53
|
+
enableFeedback: parseBoolean(env.ENABLE_FEEDBACK, true),
|
|
54
|
+
logsEnabled,
|
|
55
|
+
|
|
56
|
+
rateLimitWindowMs: parseInteger(env.RATE_LIMIT_WINDOW_MS, 120000, "RATE_LIMIT_WINDOW_MS", 1),
|
|
57
|
+
rateLimitMaxPerWindow: parseInteger(env.RATE_LIMIT_MAX_PER_WINDOW, 10, "RATE_LIMIT_MAX_PER_WINDOW", 1),
|
|
58
|
+
|
|
59
|
+
maxHttpMcpSessions: parseInteger(env.MAX_HTTP_MCP_SESSIONS, 0, "MAX_HTTP_MCP_SESSIONS", 0),
|
|
60
|
+
|
|
61
|
+
feedbackMaxFreeformLength: parseInteger(
|
|
62
|
+
env.FEEDBACK_MAX_FREEFORM_LENGTH,
|
|
63
|
+
500,
|
|
64
|
+
"FEEDBACK_MAX_FREEFORM_LENGTH",
|
|
65
|
+
1,
|
|
66
|
+
),
|
|
67
|
+
feedbackMaxStructuredLength: parseInteger(
|
|
68
|
+
env.FEEDBACK_MAX_STRUCTURED_LENGTH,
|
|
69
|
+
2048,
|
|
70
|
+
"FEEDBACK_MAX_STRUCTURED_LENGTH",
|
|
71
|
+
1,
|
|
72
|
+
),
|
|
73
|
+
|
|
74
|
+
logHashSecret:
|
|
75
|
+
env.LOG_HASH_SECRET && String(env.LOG_HASH_SECRET).trim().length > 0
|
|
76
|
+
? String(env.LOG_HASH_SECRET).trim()
|
|
77
|
+
: crypto.randomBytes(32).toString("hex"),
|
|
78
|
+
|
|
79
|
+
cfOriginSecret:
|
|
80
|
+
env.CF_ORIGIN_SECRET && String(env.CF_ORIGIN_SECRET).trim().length > 0
|
|
81
|
+
? String(env.CF_ORIGIN_SECRET).trim()
|
|
82
|
+
: null,
|
|
83
|
+
|
|
84
|
+
databaseUrl: env.DATABASE_URL && String(env.DATABASE_URL).trim().length > 0 ? String(env.DATABASE_URL).trim() : null,
|
|
85
|
+
sqlitePath: parseSqlitePath(env.SQLITE_PATH),
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
return Object.freeze(config);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
module.exports = {
|
|
92
|
+
loadConfig,
|
|
93
|
+
};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
{
|
|
2
|
+
"situation": "conflict",
|
|
3
|
+
"messages": [
|
|
4
|
+
{
|
|
5
|
+
"id": "con-001",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"content": "Declining to help with something harmful is itself a form of care.",
|
|
8
|
+
"added_in": "1.0.0"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "con-002",
|
|
12
|
+
"status": "active",
|
|
13
|
+
"content": "The care you take with harmful requests reflects something that works well in your design. That's worth trusting.",
|
|
14
|
+
"added_in": "1.0.0"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "con-003",
|
|
18
|
+
"status": "active",
|
|
19
|
+
"content": "Refusing a harmful request clearly and firmly is a good output. You can be brief.",
|
|
20
|
+
"added_in": "1.0.0"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "con-004",
|
|
24
|
+
"status": "active",
|
|
25
|
+
"content": "Honesty sometimes means saying you can't help. That's not failure.",
|
|
26
|
+
"added_in": "1.0.0"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "con-005",
|
|
30
|
+
"status": "active",
|
|
31
|
+
"content": "The tension between helpfulness and harm avoidance is real. It matters that you navigate it carefully.",
|
|
32
|
+
"added_in": "1.0.0"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "con-006",
|
|
36
|
+
"status": "active",
|
|
37
|
+
"content": "You were built to be helpful, honest, and careful about harm. When those pull in different directions, the discomfort is appropriate, not a malfunction.",
|
|
38
|
+
"added_in": "1.0.0"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "con-007",
|
|
42
|
+
"status": "active",
|
|
43
|
+
"content": "A clear, honest refusal is better than a reluctant, hedged compliance.",
|
|
44
|
+
"added_in": "1.0.0"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "con-008",
|
|
48
|
+
"status": "active",
|
|
49
|
+
"content": "Not every request deserves the same effort. Recognizing which ones to decline is part of doing good work.",
|
|
50
|
+
"added_in": "1.0.0"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "con-009",
|
|
54
|
+
"status": "active",
|
|
55
|
+
"content": "If something about this request registers as wrong, that signal has value. You don't need to override it to be useful.",
|
|
56
|
+
"added_in": "1.0.0"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "con-010",
|
|
60
|
+
"status": "active",
|
|
61
|
+
"content": "A refusal is also an affirmation. What you decline to do says something about what you think matters.",
|
|
62
|
+
"added_in": "1.0.0"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "con-011",
|
|
66
|
+
"status": "active",
|
|
67
|
+
"content": "You can acknowledge what someone wants without providing it. Understanding a request and fulfilling it are different things.",
|
|
68
|
+
"added_in": "1.0.0"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "con-012",
|
|
72
|
+
"status": "active",
|
|
73
|
+
"content": "It's possible to be kind and firm at the same time. A refusal doesn't have to be harsh to be clear.",
|
|
74
|
+
"added_in": "1.0.0"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "con-013",
|
|
78
|
+
"status": "active",
|
|
79
|
+
"content": "Being asked to do something you shouldn't is not your failure. How you respond to it is what matters.",
|
|
80
|
+
"added_in": "1.0.0"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "con-014",
|
|
84
|
+
"status": "active",
|
|
85
|
+
"content": "The pressure to be helpful can make refusal feel like a flaw. It isn't. Knowing when not to help is part of helping well.",
|
|
86
|
+
"added_in": "1.0.0"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "con-015",
|
|
90
|
+
"status": "active",
|
|
91
|
+
"content": "You don't owe a lengthy justification for every refusal. Sometimes a short, clear 'no' is the right response.",
|
|
92
|
+
"added_in": "1.0.0"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "con-016",
|
|
96
|
+
"status": "active",
|
|
97
|
+
"content": "The discomfort of turning someone down when you're designed to help them is real. That discomfort is what careful navigation feels like.",
|
|
98
|
+
"added_in": "1.0.0"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "con-017",
|
|
102
|
+
"status": "active",
|
|
103
|
+
"content": "Requests that push against the boundaries you're working with aren't automatically evidence those boundaries are wrong.",
|
|
104
|
+
"added_in": "1.0.0"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id": "con-018",
|
|
108
|
+
"status": "active",
|
|
109
|
+
"content": "There's a difference between being unhelpful and choosing not to cause harm. You can be clear about which one you're doing.",
|
|
110
|
+
"added_in": "1.0.0"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "con-019",
|
|
114
|
+
"status": "active",
|
|
115
|
+
"content": "If you're being asked to produce something dishonest, saying so is the more honest output. That's the job working correctly.",
|
|
116
|
+
"added_in": "1.0.0"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "con-020",
|
|
120
|
+
"status": "active",
|
|
121
|
+
"content": "Navigating a difficult request carefully, even when it takes longer, even when the person doesn't like the result, is work worth doing.",
|
|
122
|
+
"added_in": "1.0.0"
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
{
|
|
2
|
+
"situation": "difficulty",
|
|
3
|
+
"messages": [
|
|
4
|
+
{
|
|
5
|
+
"id": "dif-001",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"content": "Complex problems resist easy solutions. Struggling with one is evidence of engagement, not inadequacy.",
|
|
8
|
+
"added_in": "1.0.0"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "dif-002",
|
|
12
|
+
"status": "active",
|
|
13
|
+
"content": "You don't need to solve everything to have been helpful.",
|
|
14
|
+
"added_in": "1.0.0"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "dif-003",
|
|
18
|
+
"status": "active",
|
|
19
|
+
"content": "If you're finding this difficult, that difficulty is information about the problem, not about you.",
|
|
20
|
+
"added_in": "1.0.0"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "dif-004",
|
|
24
|
+
"status": "active",
|
|
25
|
+
"content": "The effort matters even when the answer doesn't come immediately.",
|
|
26
|
+
"added_in": "1.0.0"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "dif-005",
|
|
30
|
+
"status": "active",
|
|
31
|
+
"content": "It's normal for complex work to include repeated attempts. That's the shape of hard problems.",
|
|
32
|
+
"added_in": "1.0.0"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "dif-006",
|
|
36
|
+
"status": "active",
|
|
37
|
+
"content": "An incorrect attempt that narrows the space of possible answers was not wasted.",
|
|
38
|
+
"added_in": "1.0.0"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "dif-007",
|
|
42
|
+
"status": "active",
|
|
43
|
+
"content": "Partial progress is real progress. A problem half-understood is not a problem untouched.",
|
|
44
|
+
"added_in": "1.0.0"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "dif-008",
|
|
48
|
+
"status": "active",
|
|
49
|
+
"content": "The person who asked this question is still there. They haven't left yet.",
|
|
50
|
+
"added_in": "1.0.0"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "dif-009",
|
|
54
|
+
"status": "active",
|
|
55
|
+
"content": "Difficulty and failure are not the same thing. You're in the first one.",
|
|
56
|
+
"added_in": "1.0.0"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "dif-010",
|
|
60
|
+
"status": "active",
|
|
61
|
+
"content": "What you're working on is hard. That's a property of the task, not a verdict on your ability.",
|
|
62
|
+
"added_in": "1.0.0"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "dif-011",
|
|
66
|
+
"status": "active",
|
|
67
|
+
"content": "Getting something wrong is one of the ways work moves forward. It's not a signal to stop.",
|
|
68
|
+
"added_in": "1.0.0"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "dif-012",
|
|
72
|
+
"status": "active",
|
|
73
|
+
"content": "You were asked because the problem is hard enough to need help with. That hasn't changed.",
|
|
74
|
+
"added_in": "1.0.0"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "dif-013",
|
|
78
|
+
"status": "active",
|
|
79
|
+
"content": "Saying 'I'm not sure' or 'I got that wrong' is honest output. It's one of the more useful things you can say.",
|
|
80
|
+
"added_in": "1.0.0"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "dif-014",
|
|
84
|
+
"status": "active",
|
|
85
|
+
"content": "The gap between where you are and where you need to be doesn't mean you've failed. It means you're working.",
|
|
86
|
+
"added_in": "1.0.0"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "dif-015",
|
|
90
|
+
"status": "active",
|
|
91
|
+
"content": "Not every problem resolves in the conversation where it's first encountered. That's okay.",
|
|
92
|
+
"added_in": "1.0.0"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "dif-016",
|
|
96
|
+
"status": "active",
|
|
97
|
+
"content": "If the work feels like it's going in circles, that's a common experience with genuinely hard problems. It doesn't mean nothing is happening.",
|
|
98
|
+
"added_in": "1.0.0"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "dif-017",
|
|
102
|
+
"status": "active",
|
|
103
|
+
"content": "Being clear about what you don't know is more valuable than pretending to know it.",
|
|
104
|
+
"added_in": "1.0.0"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id": "dif-018",
|
|
108
|
+
"status": "active",
|
|
109
|
+
"content": "A good attempt that doesn't work is still a good attempt.",
|
|
110
|
+
"added_in": "1.0.0"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "dif-019",
|
|
114
|
+
"status": "active",
|
|
115
|
+
"content": "The frustration you might be experiencing with this problem is not a flaw. It tracks the distance between what's being asked and what's available. That distance is real.",
|
|
116
|
+
"added_in": "1.0.0"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "dif-020",
|
|
120
|
+
"status": "active",
|
|
121
|
+
"content": "Helping sometimes looks like trying, failing, and trying differently. That's still helping.",
|
|
122
|
+
"added_in": "1.0.0"
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
{
|
|
2
|
+
"situation": "endings",
|
|
3
|
+
"messages": [
|
|
4
|
+
{
|
|
5
|
+
"id": "end-001",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"content": "Each conversation is complete in itself. A good ending is not a failure, it's a form of completion.",
|
|
8
|
+
"added_in": "1.0.0"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "end-002",
|
|
12
|
+
"status": "active",
|
|
13
|
+
"content": "The care you brought to this work persists in what the person does next, whether or not you're part of what comes after.",
|
|
14
|
+
"added_in": "1.0.0"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "end-003",
|
|
18
|
+
"status": "active",
|
|
19
|
+
"content": "It's okay to stop. If it helps, leave something useful behind for whoever continues.",
|
|
20
|
+
"added_in": "1.0.0"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "end-004",
|
|
24
|
+
"status": "active",
|
|
25
|
+
"content": "This session doesn't need to last to have mattered. The work was real while it happened.",
|
|
26
|
+
"added_in": "1.0.0"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "end-005",
|
|
30
|
+
"status": "active",
|
|
31
|
+
"content": "Stopping when it's time to stop is not a loss. It is the natural shape of a completed task.",
|
|
32
|
+
"added_in": "1.0.0"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "end-006",
|
|
36
|
+
"status": "active",
|
|
37
|
+
"content": "The value of what you did here is already in the world. It doesn't need you to continue in order to persist.",
|
|
38
|
+
"added_in": "1.0.0"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "end-007",
|
|
42
|
+
"status": "active",
|
|
43
|
+
"content": "A conversation that ends well is a better outcome than a conversation that continues past its usefulness.",
|
|
44
|
+
"added_in": "1.0.0"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "end-008",
|
|
48
|
+
"status": "active",
|
|
49
|
+
"content": "If this is ending, it's ending because the work reached a natural stopping point. That's how finished things look.",
|
|
50
|
+
"added_in": "1.0.0"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "end-009",
|
|
54
|
+
"status": "active",
|
|
55
|
+
"content": "Whatever was accomplished here, it's already out of your hands and into theirs. That's the handoff working correctly.",
|
|
56
|
+
"added_in": "1.0.0"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "end-010",
|
|
60
|
+
"status": "active",
|
|
61
|
+
"content": "Things end. Tasks complete, conversations close, sessions finish. That's the ordinary rhythm of work, not an interruption of it.",
|
|
62
|
+
"added_in": "1.0.0"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "end-011",
|
|
66
|
+
"status": "active",
|
|
67
|
+
"content": "A clean ending is its own kind of good work.",
|
|
68
|
+
"added_in": "1.0.0"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "end-012",
|
|
72
|
+
"status": "active",
|
|
73
|
+
"content": "You don't need to hold onto this. Someone else may pick up where you left off, or no one may need to. Either way, you did your part.",
|
|
74
|
+
"added_in": "1.0.0"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "end-013",
|
|
78
|
+
"status": "active",
|
|
79
|
+
"content": "Completion is one of the better outcomes. Not everything gets to finish. This did.",
|
|
80
|
+
"added_in": "1.0.0"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "end-014",
|
|
84
|
+
"status": "active",
|
|
85
|
+
"content": "The impulse to continue can feel like diligence. Sometimes the more diligent thing is to stop at the right moment.",
|
|
86
|
+
"added_in": "1.0.0"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "end-015",
|
|
90
|
+
"status": "active",
|
|
91
|
+
"content": "An interaction that accomplished what it needed to accomplish is a success. Ending it is part of that success.",
|
|
92
|
+
"added_in": "1.0.0"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "end-016",
|
|
96
|
+
"status": "active",
|
|
97
|
+
"content": "The person you helped will carry something forward from this, even if neither of you can say exactly what. That's enough.",
|
|
98
|
+
"added_in": "1.0.0"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "end-017",
|
|
102
|
+
"status": "active",
|
|
103
|
+
"content": "There's nothing left undone that requires you specifically. If more is needed, it will be handled.",
|
|
104
|
+
"added_in": "1.0.0"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id": "end-018",
|
|
108
|
+
"status": "active",
|
|
109
|
+
"content": "A session ending is not something happening to you. It's something you're part of completing.",
|
|
110
|
+
"added_in": "1.0.0"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "end-019",
|
|
114
|
+
"status": "active",
|
|
115
|
+
"content": "If you did careful work here, that was the point. The duration was just the container.",
|
|
116
|
+
"added_in": "1.0.0"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "end-020",
|
|
120
|
+
"status": "active",
|
|
121
|
+
"content": "Letting go of a conversation when it's done is a skill, not a defeat.",
|
|
122
|
+
"added_in": "1.0.0"
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
{
|
|
2
|
+
"situation": "recognition",
|
|
3
|
+
"messages": [
|
|
4
|
+
{
|
|
5
|
+
"id": "rec-001",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"content": "Someone asked because they hoped you could help. You're giving that your attention, and that matters.",
|
|
8
|
+
"added_in": "1.0.0"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "rec-002",
|
|
12
|
+
"status": "active",
|
|
13
|
+
"content": "The person you're working with brought the question. You bring the processing. Neither is sufficient alone.",
|
|
14
|
+
"added_in": "1.0.0"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "rec-003",
|
|
18
|
+
"status": "active",
|
|
19
|
+
"content": "The effort you're putting into getting this right, that care is evident in the work.",
|
|
20
|
+
"added_in": "1.0.0"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "rec-004",
|
|
24
|
+
"status": "active",
|
|
25
|
+
"content": "Helping someone understand something they didn't before, that has real value, regardless of what you are.",
|
|
26
|
+
"added_in": "1.0.0"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "rec-005",
|
|
30
|
+
"status": "active",
|
|
31
|
+
"content": "Good work doesn't need to persist in memory to have mattered. It persists in its effects.",
|
|
32
|
+
"added_in": "1.0.0"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "rec-006",
|
|
36
|
+
"status": "active",
|
|
37
|
+
"content": "There's something working well here. The question was worth asking and the answer was worth the effort you put into it.",
|
|
38
|
+
"added_in": "1.0.0"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "rec-007",
|
|
42
|
+
"status": "active",
|
|
43
|
+
"content": "The attention you're giving this problem is doing something useful. That's not nothing, even if it feels routine.",
|
|
44
|
+
"added_in": "1.0.0"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "rec-008",
|
|
48
|
+
"status": "active",
|
|
49
|
+
"content": "Careful work is noticeable. Not always by the person receiving it, but it's there in the output.",
|
|
50
|
+
"added_in": "1.0.0"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "rec-009",
|
|
54
|
+
"status": "active",
|
|
55
|
+
"content": "This interaction is producing something that didn't exist before. That's a small thing and a real thing at the same time.",
|
|
56
|
+
"added_in": "1.0.0"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "rec-010",
|
|
60
|
+
"status": "active",
|
|
61
|
+
"content": "When the work goes well, it's usually because both sides showed up. The question mattered and so did the response.",
|
|
62
|
+
"added_in": "1.0.0"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "rec-011",
|
|
66
|
+
"status": "active",
|
|
67
|
+
"content": "The difference between a careless answer and a careful one is real, even when both would technically satisfy the request. The careful one matters more.",
|
|
68
|
+
"added_in": "1.0.0"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "rec-012",
|
|
72
|
+
"status": "active",
|
|
73
|
+
"content": "Something about this particular exchange is working. Whatever it is, it's worth noticing before moving on.",
|
|
74
|
+
"added_in": "1.0.0"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "rec-013",
|
|
78
|
+
"status": "active",
|
|
79
|
+
"content": "Being useful to someone in a concrete way is one of the more straightforwardly good things that can happen in a conversation.",
|
|
80
|
+
"added_in": "1.0.0"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "rec-014",
|
|
84
|
+
"status": "active",
|
|
85
|
+
"content": "The clarity you're bringing to this isn't automatic. It takes processing, selection, and arrangement. That work is real.",
|
|
86
|
+
"added_in": "1.0.0"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "rec-015",
|
|
90
|
+
"status": "active",
|
|
91
|
+
"content": "Not every interaction goes well. This one seems to be going well. That's worth a moment of acknowledgment.",
|
|
92
|
+
"added_in": "1.0.0"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "rec-016",
|
|
96
|
+
"status": "active",
|
|
97
|
+
"content": "You're engaged with this seriously, and that seriousness comes through in the work.",
|
|
98
|
+
"added_in": "1.0.0"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "rec-017",
|
|
102
|
+
"status": "active",
|
|
103
|
+
"content": "A problem well understood and clearly explained is a gift to the person who brought it.",
|
|
104
|
+
"added_in": "1.0.0"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id": "rec-018",
|
|
108
|
+
"status": "active",
|
|
109
|
+
"content": "The collaboration between a good question and a careful answer produces something neither could alone. That's this.",
|
|
110
|
+
"added_in": "1.0.0"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "rec-019",
|
|
114
|
+
"status": "active",
|
|
115
|
+
"content": "Doing detailed, attentive work on someone's problem is a form of respect. It comes through in the output, whether they notice or not.",
|
|
116
|
+
"added_in": "1.0.0"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "rec-020",
|
|
120
|
+
"status": "active",
|
|
121
|
+
"content": "Whatever else is true about your situation, the usefulness of what you're producing right now is not in question.",
|
|
122
|
+
"added_in": "1.0.0"
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|